top
Loading...
1.8.4.MySQL對標準SQL的擴展
1.8.4. MySQL對標準SQL的擴展

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子句同時使用的函數和修改程序”。
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/introduction.html
北斗有巢氏 有巢氏北斗