MySQL 伺服器支援一些您不太可能在其他 SQL DBMS 中找到的擴展。請注意,如果您使用它們,您的程式碼很可能無法移植到其他 SQL 伺服器。在某些情況下,您可以編寫包含 MySQL 擴展的程式碼,但仍然可以透過使用以下形式的註解來移植
/*! MySQL-specific code */
在這種情況下,MySQL 伺服器會像解析和執行任何其他 SQL 陳述式一樣解析和執行註解中的程式碼,但其他 SQL 伺服器應該忽略這些擴展。例如,MySQL 伺服器會識別下列陳述式中的 STRAIGHT_JOIN
關鍵字,但其他伺服器則不會
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
如果在 !
字元後新增版本號碼,則只有當 MySQL 版本大於或等於指定的版本號碼時,才會執行註解中的語法。只有 MySQL 5.1.10 或更高版本的伺服器才會執行下列註解中的 KEY_BLOCK_SIZE
子句
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 陳述式語法
ANALYZE TABLE
、CHECK TABLE
、OPTIMIZE TABLE
和REPAIR TABLE
陳述式。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 節「變數指派的 SET 語法」。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 陳述式」。將
TEMPORARY
或IF NOT EXISTS
與CREATE TABLE
一起使用。將
IF EXISTS
與DROP TABLE
和DROP DATABASE
一起使用。能夠使用單一
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 節,〈彙總函式〉。您可以將
ASC
和DESC
與GROUP BY
一起指定,而不僅限於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 相容。在
SELECT
陳述式的輸出欄位清單(FROM
的左側)中,可以使用=
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
或LIKE
運算子。例如: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 節,〈彙總函式〉。