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        你可以使用標準的系統命令來備份、重命名、移動、刪除、并拷貝由MyISAMISAM存儲引擎管理的表。例如,要想重命名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 TABLECHECK TABLEOPTIMIZE TABLE,以及REPAIR TABLE語句。

o        CREATE DATABASEDROP DATABASE語句。請參見13.1.3節,“CREATE DATABASE語法”。

o        DO語句。

o        EXPLAIN SELECT獲取如何聯合表的介紹。

o        FLUSHRESET語句。

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_nameDROP col_name、或DROP INDEXIGNORERENAME。在ALTER TABLE語句中使用多個ADDALTERDROPCHANGE子句。請參見13.1.2節,“ALTER TABLE語法”。

o        使用索引名,字段前綴上的索引,并在CREATE TABLE語句中使用INDEXKEY。請參見13.1.5節,“CREATE TABLE語法”。

o        CREATE TABLE一起使用TEMPORARYIF NOT EXISTS

o        DROP TABLE一起使用IF EXISTS。

o        使用單個DROP TABLE語句,能夠舍棄多個表。

o        UPDATEDELETE語句的ORDER BYLIMIT子句。

o        INSERT INTO ... SET col_name = ... syntax.

o        INSERTREPLACE語句的DELAYED子句。

o        INSERTREPLACEDELETEUPDATE語句的LOW_PRIORITY子句。

o        SELECT語句中使用INTO OUTFILESTRAIGHT_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        列類型MEDIUMINTSETENUM、以及不同的BLOBTEXT類型。

o        列屬性AUTO_INCREMENTBINARYNULLUNSIGNED以及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左側使用=<><=<>=><<>><=>ANDORLIKE操作符。例如:

o                     mysql> SELECT col1=1 AND col2=2 FROM tbl_name;

o        返回最近AUTO_INCREMENT值的LAST_INSERT_ID()函數。請參見12.9.3節,“信息函數”。

o        允許在數值列上使用LIKE。

o        REGEXPNOT REGEXP擴展了常規的表達式操作符。

o        具有1個或2個以上參量的CONCAT()CHAR()。(在MySQL服務器中,這些函數可以有任意數目的參量)。

o        BIT_COUNT()CASEELT()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
北斗有巢氏 有巢氏北斗