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