MySQL學習筆記(3):SQL


本文章更新於2020-06-14,使用MySQL 5.7,操作系統為Deepin 15.9。

說明:下文中,小寫為自定義變量,根據實際情況填寫(個別小寫的參數除外)。使用[]引起表示內容可選,使用{}引起表示內容為一個整體,|表示使用左側或右側內容,...表示重復之前內容。

實際上,所有語句和命令的關鍵字(文中大寫)都不區分大小寫。

以下部分語句是MySQL擴展,非標准SQL。

DDL語句

DDL語句,即數據定義語句(Data Definition Languages)。其關鍵字包括:CREATEDROPALTER

在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 NULLDEFAULT value,字段默認是可空的。

reference_option可取如下值,表示本表有關聯記錄時,關聯表更新或刪除采取何種操作:

  • RESTRICTNO ACTION:禁止關聯表更新或刪除。
  • CASCADE:更新或刪除本表對應記錄。
  • SET NULL:本表的對應字段設置為NULL
  • SET DEFAULT:本表的對應字段設置為默認值。

如使用MERGE存儲引擎,則可使用UNION=(tablename[, ...]) INSERT_METHOD=insert_methodINSERT_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可為:YEARQUARTERMONTHDAYHOURMINUTEWEEKSECONDYEAR_MONTHDAY_HOURDAY_MINUTEDAY_SECONDHOUR_MINUTEHOUR_SECONDMINUTE_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)。其關鍵字包括:INSERTUPDATEDELETESELECT

插入記錄

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)。其關鍵字包括:GRANTREVOKE

授予權限

可同時創建用戶。

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'}]

其他語句

分析、檢查、優化、修復表

ANALYZECHECKOPTIMIZEREPAIR執行期間都會對表進行鎖定。

分析表,使得SQL能夠生成正確的執行計划。如果感覺實際的執行計划並不符合預期,進行分析表可能會解決問題:

ANALYZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...]

檢查表,用於檢查表或視圖是否有錯誤(如視圖定義中被引用的表不存在):

CHECK TABLE tablename[, ...] [{QUICK|FAST|MEDIUM|EXTENDED|CHANGED}[...]]

優化表,可以將表中的碎片空間進行合並。如果已經刪除表的很大一部分數據,或已經對含有可變長度行(含有VARCHARBLOBTEXT的列)的表進行很多更改,則應該進行優化表:

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,將結果使用指定的系統命令打印,而不是打印至標准輸出
PRINT \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 重置連接回話上下文

變量

@開頭的變量為用戶變量,@@開頭的變量為系統變量,缺省為系統變量。

注釋

#--起至行末的內容都視為注釋。/**/之間所有行的內容也視為注釋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM