本文章更新于2020-06-14,使用MySQL 5.7,作業系統為Deepin 15.9,
目錄
- DDL陳述句
- 創建資料庫
- 洗掉資料庫
- 修改資料庫
- 創建表
- 洗掉表
- 修改表
- 創建索引
- 洗掉索引
- 創建視圖
- 修改視圖
- 洗掉視圖
- 存盤程序和函式
- 創建事件
- 修改事件
- 洗掉事件
- 創建觸發器
- 洗掉觸發器
- DML陳述句
- 插入記錄
- 更新記錄
- 洗掉記錄
- 查詢記錄
- DCL陳述句
- 授予權限
- 回收權限
- 創建用戶
- 修改用戶
- 洗掉用戶
- 修改密碼
- 查看權限
- 其他陳述句
- 分析、檢查、優化、修復表
- SHOW
- FLUSH
- 其他
- 命令
- 變數
- 注釋
說明:下文中,小寫為自定義變數,根據實際情況填寫(個別小寫的引數除外),使用[]引起表示內容可選,使用{}引起表示內容為一個整體,|表示使用左側或右側內容,...表示重復之前內容,
實際上,所有陳述句和命令的關鍵字(文中大寫)都不區分大小寫,
以下部分陳述句是MySQL擴展,非標準SQL,
DDL陳述句
DDL陳述句,即資料定義陳述句(Data Definition Languages),其關鍵字包括:CREATE、DROP、ALTER,
在MySQL中,資料庫和表對應于資料目錄中的目錄和檔案,所以作業系統的大小寫敏感性決定資料庫名和表名的大小寫敏感性,這意味著二者在Windows中是大小寫不敏感的,在Linux中是大小寫敏感的,
類似于表名,表別名在Windows中是大小寫不敏感的,在Linux中是大小寫敏感的,
列名、索引名、存盤程序名、觸發器名等在任何平臺都是大小寫不敏感的,
創建資料庫
CREATE DATABASE dbname
[[DEFAULT] [CHARSET [=] charset] [COLLATE [=] collation]]
洗掉資料庫
DROP DATABASE dbname
修改資料庫
ALTER DATABASE dbname
[[DEFAULT] [CHARSET [=] charset] [COLLATE [=] collation]]
創建表
CREATE TABLE tablename (
{colname type [[CHARSET [=] charset] [COLLATE [=] collation]] [[NOT] NULL] [DEFAULT value]}[, ...]
[PRIMARY KEY (colname[, ...]),]
[{KEY keyname (colname[, ...])}[, ...]]
[CONSTRAINT fkname FOREIGN KEY (colname[, ...])
REFERENCES tablename2(colname2[, ...]) [ON DELETE reference_option] [ON UPDATE reference_option]]
)
[[STORAGE] ENGINE=engine [UNION=(tablename[, ...]) [INSERT_METHOD=insert_method]]]
[[DEFAULT] [CHARSET [=] charset] [COLLATE [=] collation]]
[partition_declaration]
如不指定NOT NULL和DEFAULT value,欄位默認是可空的,
reference_option可取如下值,表示本表有關聯記錄時,關聯表更新或洗掉采取何種操作:
RESTRICT和NO ACTION:禁止關聯表更新或洗掉,CASCADE:更新或洗掉本表對應記錄,SET NULL:本表的對應欄位設定為NULL,SET DEFAULT:本表的對應欄位設定為默認值,
如使用MERGE存盤引擎,則可使用UNION=(tablename[, ...]) INSERT_METHOD=insert_method,INSERT_METHOD可取以下值:
- FIRST:插入操作被作用在第一個表上,
- LAST:插入操作被作用在最后一個表上,
- NO:默認值,不能執行插入操作,
partition_declaration表示磁區陳述句,會在“磁區”文章中細述,
根據已存在的表創建新的表:
CREATE TABLE tablename1
LIKE tablename2
洗掉表
DROP TABLE tablename
修改表
添加欄位:
ALTER TABLE tablename
ADD [COLUMN] colname1 type [CHARSET [=] charset] [COLLATE [=] collation] [[NOT] NULL] [DEFAULT value]
[FIRST|{AFTER colname2}]
修改欄位定義:
ALTER TABLE tablename
MODIFY [COLUMN] colname1 type [CHARSET [=] charset] [COLLATE [=] collation] [[NOT] NULL] [DEFAULT value]
[FIRST|{AFTER colname2}]
修改欄位定義,也可修改欄位名:
ALTER TABLE tablename
CHANGE [COLUMN] oldcolname newcolname type [CHARSET [=] charset] [COLLATE [=] collation] [[NOT] NULL] [DEFAULT value]
[FIRST|{AFTER colname}]
洗掉欄位:
ALTER TABLE tablename
DROP [COLUMN] colname
修改表名:
ALTER TABLE tablename
RENAME [TO] newtablename
修改表的自動增長列初始值:
ALTER TABLE tablename
AUTO_INCREMENT = n
修改表的存盤引擎:
ALTER TABLE tablename
ENGINE=engine
修改表的字符集:
ALTER TABLE tablename
[[DEFAULT] [CHARSET [=] charset] [COLLATE [=] collation]]
創建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX indexname
[USING HASH|BTREE]
ON tablename({colname[(len)] [ASC|DESC]} [, ...])
僅當創建前綴索引的時候才使用len,len為位元組數,
或:
ALTER TABLE tablename
ADD INDEX indexname(column[, ...])
洗掉索引
DROP INDEX indexname ON tablename
或:
ALTER TABLE tablename DROP INDEX indexname
創建視圖
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW viewname [(colname[, ...])]
AS select_statement [WITH [CASCADE|LOCAL] CHECK OPTION]
WITH [CASCADE|LOCAL] CHECK OPTION表示允許更新記錄的條件,默認是CASCADE:
LOCAL表示更新后的記錄只要滿足本視圖的條件就可以更新,CASCADE表示更新后的記錄必須滿足本視圖關聯的所有視圖(包括創建本視圖使用的視圖)的條件才可以更新,
修改視圖
ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW viewname [(colname[, ...])]
AS select_statement [WITH [CASCADE|LOCAL] CHECK OPTION]
洗掉視圖
DROP VIRW [IF EXISTS] viewname[, ...] [RESTRICT|CASCADE]
存盤程序和函式
存盤程序和函式相關DDL陳述句于“存盤程序和函式”文章中描述,
創建事件
CREATE EVENT eventname
ON SCHEDULE {AT timestamp [+ INTERVAL n interval]}|{EVERY n interval}
DO
statement_list
interval可為:YEAR、QUARTER、MONTH、DAY、HOUR、MINUTE、WEEK、SECOND、YEAR_MONTH、DAY_HOUR、DAY_MINUTE、DAY_SECOND、HOUR_MINUTE、HOUR_SECOND、MINUTE_SECOND,與函式DATE_ADD類似,
如果事件調度器狀態是關閉的,需使用SET GLOBAL event_scheduler = 1打開,事件才能生效,
修改事件
禁用事件:
ALTER EVENT eventname DISABLE
洗掉事件
DROP EVENT eventname
創建觸發器
CREATE TRIGGER triggername BEFORE|AFTER INSERT|UPDATE|DELETE
ON tablename FOR EACH ROW
statement_list
觸發時間如下:
BEFORE指在檢查約束前觸發,AFTER指在檢查約束后觸發,
觸發器只能創建在永久表上,不能對臨時表創建觸發器,對同一個表相同觸發時間的相同觸發事件,只能定義一個觸發器,
洗掉觸發器
DROP TRIGGER [dbname.]triggername
DML陳述句
DML陳述句,即資料操縱陳述句(Data Manipulation Languages),其關鍵字包括:INSERT、UPDATE、DELETE、SELECT,
插入記錄
INSERT [LOW_PRIORITY|DELAYED|HIGH_PRIORITY] INTO tablename [(colname1[, ...])] VALUES
(record1_value1[, ...])[, ...]
[ON DUPLICATE KEY UPDATE colname2=value2[, ...]]
當不指定欄位名時,值的順序需與表定義的欄位排列順序一致,
也可以使用如下的方式指定欄位值:
INSERT INTO tablename SET {colname = value}[, ...]
使用查詢的結果插入記錄:
INSERT INTO tablename select_statement
更新記錄
UPDATE tablename SET {colname = value}[, ...] [WHERE condition1 [AND|OR condition2][...]]
或:
UPDATE tablename[, ...] SET {[tablename.]colname = value}[, ...] [WHERE condition1 [AND|OR condition2][...]]
洗掉記錄
DELETE FROM tablename [WHERE condition1 [AND|OR condition2][...]]
或:
DELETE tablename1[, ...] FROM tablename1[, ...] [WHERE condition1 [AND|OR condition2][...]]
查詢記錄
SELECT *|{[DISTINCT] {constant|[@|@@]variable|colname1 [AS alias1]}[, ...]}
FROM tablename[, ...]
[WHERE condition1 [AND|OR condition2][...]]
[GROUP BY colname2[, ...]] [WITH ROLLUP]
[HAVING having_condition1 [AND|OR having_condition2][...]]
[ORDER BY NULL|{{colname3 [DESC|ASC]}[, ...]}]
[LIMIT [offset_start,] row_count]
[INTO OUTFILE 'filename'
[FIEDLS [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char']]
[LINES [STARTING BY 'string'] [TERMINATED BY 'string']]
]
[{LOCK IN SHARE MODE}|{FOR UPDATE}]
WITH ROLLUP表示對分類聚合后的結果進行再匯總,不能和ORDER BY同時使用,
ORDER BY子句中,NULL為禁止排序,DESC為降序,ASC為升序,默認為ASC,
LIMIT子句中,,offset_start默認為0,即第一條記錄,
表別名:
SELECT t.colname FROM table t
表連接:
SELECT *
FROM tablename1
{[INNER]|LEFT|RIGHT JOIN tablename2 ON condition}[ ...]
左連接包含左表中所有記錄,右表可能出現空記錄;右連接包含右表所有記錄,左表可能出現空記錄,默認為內連接,內連接也可以如下形式:
SELECT *
FROM tablename1, tablename2 WHERE condition
常見的子查詢:
SELECT * FROM tablename1 WHERE colname1 [NOT] IN (SELECT colname2 FROM tablename2)
SELECT * FROM tablename1 WHERE colname1 =|!= (SELECT colname2 FROM tablename2)
SELECT * FROM tablename1 WHERE [NOT] EXISTS (SELECT * FROM tablename2 WHERE tablename1.colname1 = tablename2.colname2)
SELECT * FROM tablename1, (SELECT * FROM tablename) tablename2 WHERE condition
第二種用法僅適用于子查詢只回傳一行記錄的情況,
聯合:
select_statement1
{UNION [ALL] select_statement2}
[...]
偽表名:
SELECT something [FROM DUAL]
不使用ALL會對記錄進行排重,
SELECT INTO OUTFILE使用的格式選項含義如下:
FIELDS TERMINATED BY 'string':欄位分隔字串,默認為'\t',FIELDS [OPTIONALLY] ENCLOSED BY 'char':欄位參考符,默認為空,如加上OPTIONALLY則只用在字串型別欄位上,FIELDS ESCAPED BY 'char':轉義字符,默認為'',LINES STARTING BY 'string':行首字串,默認為空,LINES TERMINATED BY 'string':行結束字串,默認為'\n',
相應的,LOAD DATA INFILE的陳述句如下:
LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename
[FIEDLS [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char']]
[LINES [STARTING BY 'string'] [TERMINATED BY 'string']]
[IGNORE n LINES]
[(colname[, ...])]
[SET {colname=expr}[, ...]]
LOCAL表示從客戶端本地讀取檔案,默認從服務器讀取檔案,
大多數選項都與SELECT INTO OUTFILE相同,新增的選項含義如下:
IGNORE n LINES:忽略輸入檔案中的前n行資料,- (colname[, ...]):按照列出的欄位順序和欄位數量加載資料,
- SET {colname=expr}[, ...]:將列做一定的值轉換后再加載,
DCL陳述句
DCL陳述句,即資料控制陳述句(Data Control Languages),其關鍵字包括:GRANT、REVOKE,
授予權限
可同時創建用戶,
GRANT {USAGE|ALL|{privtype[, ...]} [(column[, ...]])}[, ...]
ON [TABLE|FUNCTION|PROCEDURE] *|*.*|dbname.*|tablename
TO {{user|'user'}@{host|'host'} [IDENTIFIED BY [PASSWORD] 'password'] [REQUIRE SSL]}[, ...]
[WITH [GRANT OPTION] [resource_option[...]]]
USAGE只用于資料庫登錄,不能執行任何操作,
priv_type為SELECT|INSERT|UPDATE|DELETE|INDEX|ALTER|CREAATE|DROP|GRANT|CREATE VIEW|SHOW VIEW|CREATE ROUTINE|ALTER ROUTINE|REFERENCES|RELOAD|SHUTDOWN|PROCESS|FILE|SHOW DB|SUPER|CREATE TMP TABLE|LOCK TABLES|EXECUTE|REPL SLAVE|REPL CLIENT,大多與mysql資料庫user表的*_priv對應,
管理權限不能指定資料庫,ON后必須跟*.*,
使用PASSWORD表示password是經過PASSWORD函式加密的,
resource_option包括,設定為0表示洗掉限制:
MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOU countMAX_CONNECTIONS_PER_HOUR countMAX_USER_CONNECTIONS count
回收權限
REVOKE {ALL|{priv_type|GRANT OPTION[,...]} [colname[, ...]]}[, ...]
ON [TABLE|FUNCTION|PROCEDURE] *|*.*|dbname.*|tablename
FROM {user|'user'}@{host|'host'}[, ...]
USAGE權限不能被回收,亦即,REVOKE不能洗掉用戶,
此外,還有以下用于權限控制的陳述句:
創建用戶
CREATE USER {user|'user'}@{host|'host'}
IDENTIFIED [WITH auth_plugin] BY [PASSWORD] 'password'
user為''表示任何用戶,host為''、*、或%(含義與LIKE相同)表示任何外部主機,不包括localhost,
auth_plugin可使用:
- mysql_native_password
- caching_sha2_password
使用PASSWORD表示password是經過PASSWORD函式加密的,
修改用戶
ALTER USER {user|'user'}@{host|'host'}
IDENTIFIED [WITH auth_plugin] BY [PASSWORD] 'password'
洗掉用戶
DROP USER {user|'user'}@{host|'host'}[, ...]
修改密碼
SET PASSWORD [FOR {user|'user'}@{host|'host'}] = PASSWORD('password')
查看權限
SHOW GRANTS [FOR {user|'user'}@{host|'host'}]
其他陳述句
分析、檢查、優化、修復表
ANALYZE、CHECK、OPTIMIZE、REPAIR執行期間都會對表進行鎖定,
分析表,使得SQL能夠生成正確的執行計劃,如果感覺實際的執行計劃并不符合預期,進行分析表可能會解決問題:
ANALYZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...]
檢查表,用于檢查表或視圖是否有錯誤(如視圖定義中被參考的表不存在):
CHECK TABLE tablename[, ...] [{QUICK|FAST|MEDIUM|EXTENDED|CHANGED}[...]]
優化表,可以將表中的碎片空間進行合并,如果已經洗掉表的很大一部分資料,或已經對含有可變長度行(含有VARCHAR、BLOB或TEXT的列)的表進行很多更改,則應該進行優化表:
OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...]
修復表,對壞表進行修復:
REPAIR [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...] [{QUICK|EXTENDED|USE_FRM}[...]]
SHOW
關于SHOW陳述句的詳情參閱官方檔案:https://dev.mysql.com/doc/refman/5.7/en/show.html,
SHOW陳述句回傳元資料資訊,元資料資訊大多保存在information_schema庫中,
| 陳述句 | 作用 |
|---|---|
| SHOW BINLOG EVENTS [IN 'filename'] [FROM position] | 列出二進制日志事件 |
| SHOW CHARACTER SET [LIKE 'pattern'] | 列出服務器支持的字符集 |
| SHOW COLLATION [LIKE 'pattern'] | 列出服務器支持的字符集校對規則 |
| SHOW [FULL] COLUMNS FROM [dbname.]tablename [LIKE 'pattern'] | 列出列 |
| SHOW CREATE DATABASE dbname | 列出創建資料庫陳述句 |
| SHOW CREATE EVENT eventname | 列出創建事件陳述句 |
| SHOW CREATE FUNCTION funcname | 列出創建函式陳述句 |
| SHOW CREATE PROCEDURE procname | 列出創建存盤程序陳述句 |
| SHOW CREATE TABLE [dbname.]tablename | 列出創建表陳述句 |
| SHOW CREATE TRIGGER triggername | 列出創建觸發器陳述句 |
| SHOW CREATE VIEW [dbname.]viewname | 列出創建視圖陳述句 |
| SHOW DATABASES [LIKE 'pattern'] | 列出資料庫 |
| SHOW ENGINE engine STATUS | 列出存盤引擎狀態(如:INNODB) |
| SHOW ENGINES | 列出服務器支持的存盤引擎 |
| SHOW ERRORS | 列出服務器出現的錯誤 |
| SHOW EVENTS | 列出事件 |
| SHOW FUNCTION CODE funcname | 列出函式代碼 |
| SHOW FUNCTION STATUS [LIKE 'pattern'] | 列出函式狀態 |
| SHOW GRANTS [FOR {user|'user'}@{host|'host'}] | 列出賬號權限 |
| SHOW INDEX FROM [dbname.]tablename | 列出索引 |
| SHOW [BINARY/MASTER] LOGS | 列出二進制日志檔案 |
| SHOW MASTER STATUS | 列出主庫狀態 |
| SHOW OPEN TABLES [FROM dbname] [LIKE 'pattern'] | 列出打開并快取的表 |
| SHOW PLUGINS | 列出已安裝的插件 |
| SHOW PROCEDURE CODE procname | 列出存盤程序代碼 |
| SHOW PROCEDURE STATUS [LIKE 'pattern'] | 列出存盤程序狀態 |
| SHOW PRIVILEGES | 列出權限 |
| SHOW PROCESSLIST | 列出服務器執行緒 |
| SHOW PROFILE [ALL|CPU|{BLOCK IO}|{PAGE FAULTS}|SOURCE][, ...] FOR QUERY query_id | 列出查詢的分析資訊 |
| SHOW PROFILES | 列出可分析的查詢 |
| SHOW RELAYLOG EVENTS [IN 'filename'] [FROM position] | 列出中繼日志事件 |
| SHOW SLAVE HOSTS | 列出從庫資訊 |
| SHOW SLAVE STATUS | 列出從庫狀態 |
| SHOW [SESSION|GLOBAL] STATUS [LIKE 'pattern'] | 列出狀態變數,默認為SESSION |
| SHOW TABLE STATUS [FROM dbname] [LIKE 'pattern'] | 列出表和視圖狀態 |
| SHOW [FULL] TABLES [FROM dbname] [LIKE 'pattern'] | 列出表和視圖 |
| SHOW TRIGGERS [FROM dbname] [LIKE 'pattern'] | 列出觸發器 |
| SHOW [SESSION|GLOBAL] VARIABLES [LIKE 'pattern'] | 列出系統變數 |
| SHOW WARNINGS | 列出服務器警告 |
FLUSH
關于FLUSH陳述句的詳情參閱官方檔案:https://dev.mysql.com/doc/refman/5.7/en/flush.html,
| 陳述句 | 作用 |
|---|---|
| FLUSH PRIVILEGES | 重繪權限,會重新讀取權限表 |
| FLUSH TABLES | 重繪表,會關閉所有打開的表,并重繪查詢快取 |
| FLUSH USER_RESOURCES | 重繪用戶資源限制,會重置為0 |
其他
| 陳述句 | 作用 |
|---|---|
| DESC tablename | statement |
| EXPLAIN tablename | statement |
| KILL processid | 殺死執行緒 |
| SET [SESSION|GLOBAL] [@|@@]variable=value | 設定變數值,預設為SESSION |
| SET NAMES charset | 同時修改當前會話的客戶端、連接、回傳結果字符集 |
| START SLAVE | 啟動從庫復制執行緒 |
| STOP SLAVE | 停止從庫復制執行緒 |
命令
上述陳述句使用mysql工具互動執行時都需要使用陳述句分隔符(通常為“;”)結尾,但命令不需要,
| 命令 | 簡寫 | 作用 |
|---|---|---|
| ? [topic] | ? | 同HELP,查看幫助,最頂層主題為contents |
| CLEAR | \c | 清除當前陳述句,不會執行 |
| CONNECT [dbname [host]] | \r | 重新連接服務器 |
| DELIMITER delimiter | \d | 設定陳述句分隔符 |
| EDIT | \e | 使用$EDITOR指定的編輯器編輯陳述句 |
| EGO | \G | 執行陳述句,將結果欄位縱向排列 |
| EXIT | \q | 同QUIT,退出 |
| GO | \g | 執行陳述句,將結果欄位橫向排列 |
| HELP [topic] | \h | 查看幫助 |
| NOPAGER | \n | 禁用pager,將結果列印至標準輸出 |
| NOTEE | \t | 禁用tee,不同時將結果追加至檔案 |
| PAGER [systemcommand] | \P | 設定pager,將結果使用指定的系統命令列印,而不是列印至標準輸出 |
| \p | 列印當前命令 | |
| PROMPT [prompt] | \R | 設定互動提示語 |
| QUIT | \q | 退出 |
| REHASH | \# | 重建自動完成哈希 |
| SOURCE filename | \. | 執行SQL檔案 |
| STATUS | \s | 查看服務器狀態 |
| SYSTEM [systemcommand] | \! | 執行系統命令 |
| TEE filename | \T | 設定tee,同時將結果追加至檔案 |
| USE dbname | \u | 切換資料庫 |
| CHARSET charset | \C | 設定字符集 |
| WARNINGS | \W | 顯示警告資訊 |
| NOWARNING | \w | 不顯示警告資訊 |
| RESETCONNECTION | \x | 重置連接回話背景關系 |
變數
@開頭的變數為用戶變數,@@開頭的變數為系統變數,預設為系統變數,
注釋
從#、--起至行末的內容都視為注釋,/*與*/之間所有行的內容也視為注釋,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26187.html
標籤:MySQL
上一篇:MySQL 表約束
