MySQL服務器包含一些其他SQL DBMS中不具備的擴展。注意,如果使用了它們,將無法把代碼移植到其他SQL服務器。在某些情況下,你可以編寫包含MySQL擴展的代碼,但仍保持其可移植性,方法是用“/*... */”注釋掉這些擴展。在本例中,MySQL服務器能夠解析并執行注釋中的代碼,就像對待其他MySQL語句一樣,但其他SQL服務器將忽略這些擴展。例如:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
如果在字符“!”后添加了版本號,僅當MySQL的版本等于或高于指定的版本號時才會執行注釋中的語法:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
這意味著,如果你的版本號為3.23.02或更高,MySQL服務器將使用TEMPORARY關鍵字。
下面按類別介紹了各種MySQL擴展。
· 磁盤上的數據組織
MySQL服務器會將每個數據庫映射到MySQL數據目錄下的1個目錄中,并將數據庫中的表映射到數據庫目錄下的文件名。它具有下述含義:
o 如果操作系統的文件名區分大小寫(如大多數Unix系統),當MySQL服務器運行在這類操作系統上時,數據庫名和表名也區分大小寫。請參見9.2.2節,“識別符大小寫敏感性”。
o 你可以使用標準的系統命令來備份、重命名、移動、刪除、并拷貝由MyISAM或ISAM存儲引擎管理的表。例如,要想重命名MyISAM表,可重命名表對應的.MYD、.MYI、以及.frm文件。
數據庫、表、索引、列或別名能夠以數字開頭(但或許不能全部由數字構成)。
· 通用語言語法
o 可以使用“””或“’”括住字符串,而不僅是“’”。
o 在字符串中使用“”作為轉義字符。
o 在SQL語句中,可以使用“db_name.tbl_name”語法訪問不同數據庫中的表。某些SQL服務器提供了相同的功能,但調用該用戶空間除外。MySQL服務器不支持表空間,如下述語句中使用的那樣: CREATE TABLE ralph.my_table...IN my_tablespace.
· SQL語句的語法
o ANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLE,以及REPAIR TABLE語句。
o CREATE DATABASE和DROP DATABASE語句。請參見13.1.3節,“CREATE DATABASE語法”。
o DO語句。
o EXPLAIN SELECT獲取如何聯合表的介紹。
o FLUSH和RESET語句。
o SET語句。請參見13.5.3節,“SET語法”。
o SHOW語句。請參見13.5.4節,“SHOW語法”。
o 使用LOAD DATA INFILE。在很多情況下,該語法與Oracle的LOAD DATA INFILE兼容。請參見13.2.5節,“LOAD DATA INFILE語法”。
o RENAME TABLE的使用。請參見13.1.9節,“RENAME TABLE語法”。
o 使用REPLACE取代DELETE + INSERT。請參見13.2.6節,“REPLACE語法”。
o 在ALTER TABLE語句中使用CHANGE col_name、DROP col_name、或DROP INDEX、IGNORE或RENAME。在ALTER TABLE語句中使用多個ADD、ALTER、DROP或CHANGE子句。請參見13.1.2節,“ALTER TABLE語法”。
o 使用索引名,字段前綴上的索引,并在CREATE TABLE語句中使用INDEX或KEY。請參見13.1.5節,“CREATE TABLE語法”。
o 與CREATE TABLE一起使用TEMPORARY或IF NOT EXISTS。
o 與DROP TABLE一起使用IF EXISTS。
o 使用單個DROP TABLE語句,能夠舍棄多個表。
o UPDATE和DELETE語句的ORDER BY和LIMIT子句。
o INSERT INTO ... SET col_name = ... syntax.
o INSERT和REPLACE語句的DELAYED子句。
o INSERT、REPLACE、DELETE和UPDATE語句的LOW_PRIORITY子句。
o 在SELECT語句中使用INTO OUTFILE和STRAIGHT_JOIN。請參見13.2.7節,“SELECT語法”。
o SELECT語句中的SQL_SMALL_RESULT選項。
o
不需要在GROUP BY部分命名所有選擇的列。對于某些十分特殊但相當正常的查詢,它能提供更好的性能。請參見12.10節,“與GROUP BY子句同時使用的函數和修改程序”。
o 可以與GROUP BY一起指定ASC和DESC。
o 能夠在帶有“:=”賦值操作符的語句中設置變量。
o mysql> SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg
o -> FROM test_table;
o mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
· 列類型
o 列類型MEDIUMINT、SET、ENUM、以及不同的BLOB和TEXT類型。
o 列屬性AUTO_INCREMENT、BINARY、NULL、UNSIGNED以及ZEROFILL。
· 函數和操作符
o 為了使其他SQL環境下的用戶更容易入手,MySQL服務器對很多函數均支持別名特性。例如,所有的字符串函數均支持標準SQL語法和ODBC語法。
o MySQL服務器能夠理解“||”和“&&”操作符,將其當作邏輯OR和AND,就像在C編程語言中那樣。在MySQL服務器中,||和OR是同義詞,&&和AND也是同義詞。由于采用了該優異的語法體系,MySQL服務器不支持SQL針對字符串連接的“||”操作符,而采用了CONCAT()取而代之。由于CONCAT()能夠接受任意數目的參量,很容易將使用“||”操作符的情況轉換為MySQL服務器支持的類型。
o 請在有多于1個元素的場合下使用COUNT(DISTINCT list)。
o 默認情況下,所有的字符串比較均區分大小寫,其分類順序由當前字符集確定(默認為cp1252 Latin1)。如果你不喜歡該點,應使用BINARY屬性或BINARY cast聲明列,這樣,就會使用基本的字符代碼值進行比較,而不是詞匯順序。
o “%”操作符等同于MOD()。也就是說“N % M”等同于MOD(N,M)。Cyuyan的程序員支持“%”,而且它也是為了兼容PostgreSQL而使用的。
o 在列比較中,可在SELECT語句的FROM左側使用=、<>、<=、<、>=、>、<<、>>、<=>、AND、OR或LIKE操作符。例如:
o mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
o 返回最近AUTO_INCREMENT值的LAST_INSERT_ID()函數。請參見12.9.3節,“信息函數”。
o 允許在數值列上使用LIKE。
o REGEXP和NOT REGEXP擴展了常規的表達式操作符。
o 具有1個或2個以上參量的CONCAT()或CHAR()。(在MySQL服務器中,這些函數可以有任意數目的參量)。
o BIT_COUNT()、CASE、ELT()、FROM_DAYS()、FORMAT()、IF()、PASSWORD()、ENCRYPT()、MD5()、ENCODE()、DECODE()、PERIOD_ADD()、PERIOD_DIFF()、TO_DAYS()、以及WEEKDAY()函數。
o 使用TRIM()來調整子字符串。標準SQL僅支持單個字符的刪除。
GROUP BY函數STD()、BIT_OR()、BIT_AND()、BIT_XOR()、以及GROUP_CONCAT()。請參見12.10節,“與GROUP BY子句同時使用的函數和修改程序
”。