MySQL 伺服器支援一些在其他 SQL DBMS 中不太可能找到的擴展。請注意,如果您使用它們,您的程式碼很可能無法移植到其他 SQL 伺服器。在某些情況下,您可以編寫包含 MySQL 擴展的程式碼,但仍然可以移植,方法是使用以下形式的註解:
/*! MySQL-specific code */
在這種情況下,MySQL 伺服器會像解析其他 SQL 語句一樣解析並執行註解中的程式碼,但其他 SQL 伺服器應該忽略這些擴展。例如,MySQL 伺服器會識別以下語句中的 STRAIGHT_JOIN
關鍵字,但其他伺服器不應該識別:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
如果您在 !
字元後新增版本號碼,則只有當 MySQL 版本大於或等於指定的版本號碼時,才會執行註解中的語法。以下註解中的 KEY_BLOCK_SIZE
子句僅由 MySQL 5.1.10 或更高版本的伺服器執行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
以下描述列出了 MySQL 擴展,依類別組織。
磁碟上資料的組織
MySQL 伺服器將每個資料庫對應到 MySQL 資料目錄下的目錄,並將資料庫中的表格對應到資料庫目錄中的檔案名稱。因此,在具有區分大小寫檔案名稱的作業系統(例如大多數 Unix 系統)上,MySQL 伺服器中的資料庫和表格名稱是區分大小寫的。請參閱 第 11.2.3 節,「識別符號的大小寫敏感度」。
一般語言語法
預設情況下,字串可以用
"
以及'
括起來。如果啟用ANSI_QUOTES
SQL 模式,則字串只能用'
括起來,並且伺服器會將用"
括起來的字串解讀為識別符號。\
是字串中的逸出字元。在 SQL 語句中,您可以使用
db_name.tbl_name
語法存取不同資料庫中的表格。某些 SQL 伺服器提供相同的功能,但稱之為User space
。MySQL 伺服器不支援像這樣語句中使用的表空間:CREATE TABLE ralph.my_table ... IN my_tablespace
。
SQL 語句語法
CREATE DATABASE
、DROP DATABASE
和ALTER DATABASE
語句。請參閱 第 15.1.12 節,「CREATE DATABASE 語句」、第 15.1.24 節,「DROP DATABASE 語句」 和 第 15.1.2 節,「ALTER DATABASE 語句」。DO
語句。EXPLAIN SELECT
以取得查詢最佳化器如何處理表格的描述。SET
語句。請參閱 第 15.7.6.1 節,「設定變數分配的語法」。SHOW
語句。請參閱 第 15.7.7 節,「SHOW 語句」。許多 MySQL 特有的SHOW
語句產生的資訊可以透過使用SELECT
來查詢INFORMATION_SCHEMA
,以更標準的方式取得。請參閱 第 28 章,「INFORMATION_SCHEMA 表格」。使用
LOAD DATA
。在許多情況下,此語法與 OracleLOAD DATA
相容。請參閱 第 15.2.9 節,「LOAD DATA 語句」。使用
REPLACE
取代DELETE
加INSERT
。請參閱 第 15.2.12 節,「REPLACE 語句」。在
ALTER TABLE
語句中使用CHANGE
、col_name
DROP
或col_name
DROP INDEX
、IGNORE
或RENAME
。在ALTER TABLE
語句中使用多個ADD
、ALTER
、DROP
或CHANGE
子句。請參閱 第 15.1.9 節,「ALTER TABLE 語句」。在
CREATE TABLE
語句中使用索引名稱、欄位前綴上的索引以及使用INDEX
或KEY
。請參閱 第 15.1.20 節,「CREATE TABLE 語句」。搭配
CREATE TABLE
使用TEMPORARY
或IF NOT EXISTS
。搭配
DROP TABLE
和DROP DATABASE
使用IF EXISTS
。能夠使用單一
DROP TABLE
語句刪除多個表格。INSERT INTO
語法。tbl_name
SETcol_name
= ...在
SELECT
語句中使用INTO OUTFILE
或INTO DUMPFILE
。請參閱 第 15.2.13 節,「SELECT 語句」。在
SELECT
語句中使用諸如STRAIGHT_JOIN
或SQL_SMALL_RESULT
之類的選項。您不需要在
GROUP BY
子句中命名所有選取的欄位。這對於某些非常特定但相當常見的查詢來說,可以提供更好的效能。請參閱第 14.19 節,「彙總函式」。您可以在
GROUP BY
中指定ASC
和DESC
,而不僅僅是在ORDER BY
中。能夠在語句中使用
:=
賦值運算符來設定變數。請參閱第 11.4 節,「使用者定義變數」。
資料類型
函式和運算符
為了方便從其他 SQL 環境遷移的使用者,MySQL 伺服器支援許多函式的別名。例如,所有字串函式都支援標準 SQL 語法和 ODBC 語法。
MySQL 伺服器理解
||
和&&
運算符,表示邏輯 OR 和 AND,如同 C 程式語言中一樣。在 MySQL 伺服器中,||
和OR
是同義詞,&&
和AND
也是同義詞。由於這種簡潔的語法,MySQL 伺服器不支援標準 SQL 的||
運算符用於字串串接;請改用CONCAT()
。因為CONCAT()
可以接受任意數量的引數,因此很容易將||
運算符的使用轉換為 MySQL 伺服器。使用
COUNT(DISTINCT
,其中value_list
)value_list
具有多個元素。預設情況下,字串比較不區分大小寫,排序順序由目前字元集的校對規則決定,預設值為
utf8mb4
。若要改為執行區分大小寫的比較,您應該使用BINARY
屬性宣告您的欄位,或使用BINARY
轉換,這會導致比較是使用底層字元代碼值而不是語彙排序。%
運算符是MOD()
的同義詞。也就是說,
等同於N
%M
MOD(
。N
,M
)%
支援 C 程式設計人員,並與 PostgreSQL 相容。=
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
或LIKE
運算符可以被用於SELECT
陳述式中輸出欄位列表(FROM
的左側)的表達式中。例如mysql> SELECT col1=1 AND col2=2 FROM my_table;
LAST_INSERT_ID()
函式會傳回最近的AUTO_INCREMENT
值。請參閱第 14.15 節,「資訊函式」。LIKE
允許用於數值。REGEXP
和NOT REGEXP
延伸正規表示式運算符。CONCAT()
或CHAR()
帶有一個引數或超過兩個引數。(在 MySQL 伺服器中,這些函式可以接受可變數量的引數。)BIT_COUNT()
、CASE
、ELT()
、FROM_DAYS()
、FORMAT()
、IF()
、MD5()
、PERIOD_ADD()
、PERIOD_DIFF()
、TO_DAYS()
和WEEKDAY()
函式。使用
TRIM()
來修剪子字串。標準 SQL 僅支援移除單個字元。GROUP BY
函式STD()
、BIT_OR()
、BIT_AND()
、BIT_XOR()
和GROUP_CONCAT()
。請參閱第 14.19 節,「彙總函式」。