本文章更新於2020-06-14,使用MySQL 5.7,操作系統為Deepin 15.9。
說明:下文中,小寫為自定義變量,根據實際情況填寫(個別小寫的參數除外)。使用[]引起表示內容可選,使用{}引起表示內容為一個整體,|表示使用左側或右側內容,...表示重復之前內容。
實際上,所有語句和命令的關鍵字(文中大寫)都不區分大小寫。
以下部分語句是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 | 重置連接回話上下文 |
變量
@開頭的變量為用戶變量,@@開頭的變量為系統變量,缺省為系統變量。
注釋
從#、--起至行末的內容都視為注釋。/*與*/之間所有行的內容也視為注釋。
