WIKI使用導航
站長百科導航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機
- cPanel
- 網(wǎng)址導航專題
- 云計算
- 微博營銷
- 虛擬主機管理系統(tǒng)
- 開放平臺
- WIKI程序與應用
- 美國十大主機
MySQL中文參考手冊
導航: 上一頁 | ASP | PHP | JSP | HTML | CSS | XHTML | aJAX | Ruby | JAVA | XML | Python | ColdFusion
MySQL包含了一些可能在其他SQL數(shù)據(jù)庫找不到的擴充。要注意如果你使用他們,你的代碼把不與其他SQL服務器兼容。在一些情況下,你可以編寫包括MySQL擴展的代碼,但是仍然是可移植的,通過使用/*! ... */形式的注釋。在這種情況下,MySQL把進行詞法分析并且執(zhí)行在注釋內的代碼,好像它是任何其它MySQL語句,但是其他SQL服務器把忽略擴展。例如:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
如果你在'!'后增加一個版本數(shù)字,該語法把僅在MySQL版本是等于或比使用的版本數(shù)字新時才執(zhí)行:
CREATE /*!32302 TEMPORARY */ TABLE (a int);
上面的意思是如果你有3.23.02或更新,那么MySQL把使用TEMPORARY關鍵詞。
MySQL擴展被列在下面:
字段類型MEDIUMINT、SET、ENUM和不同的BLOB和TEXT類型。
字段屬性AUTO_INCREMENT、BINARY、UNSIGNED和ZEROFILL。
缺省地,所有的字符串比較是忽略大小寫的,由當前的字符集決定了(缺省為ISO-8859-1 Latin1)排序順序。如果你不喜歡這樣,你應該用BINARY屬性或使用BINARY強制符聲明列,它導致根據(jù)MySQL服務器主機的ASCII順序進行排序。
MySQL把每個數(shù)據(jù)庫映射一個MySQL數(shù)據(jù)目錄下面的目錄,把數(shù)據(jù)庫表映射到數(shù)據(jù)庫目錄下的數(shù)據(jù)庫文件名。這有2個含意:
在區(qū)分大小寫文件名的操作系統(tǒng)(象大多數(shù) Unix 系統(tǒng)一樣)上的MySQL中數(shù)據(jù)庫名字和表名是區(qū)分大小寫的。如果你有困難記得表名,接受一個一致的約定,例如總是用小寫名字創(chuàng)建數(shù)據(jù)庫和表。
數(shù)據(jù)庫、表、索引、列或別名可以以數(shù)字開始(但是不能僅由數(shù)字組成)。
你可以使用標準的系統(tǒng)命令備份、重命名、移動、刪除和拷貝表。例如,重命名一個表,重命名“.MYD”、“.MYI”和“.frm”文件為相應的表。
在SQL語句中,你可以用db_name.tbl_name語法訪問不同數(shù)據(jù)庫中的表。一些SQL服務器提供同樣的功能但是稱它們?yōu)檫@User space(用戶空間)。MySQL不支持類似在create table ralph.my_table...IN my_tablespace中的表空間。
LIKE在數(shù)字列上被允許。
在一SELECT語句里面使用INTO OUTFILE和STRAIGHT_JOIN。見7.12 SELECT句法.
在一個SELECT語句中SQL_SMALL_RESULT選項。
EXPLAIN SELECT得到怎么樣聯(lián)結表的描述。
在一個CREATE TABLE語句里面使用索引、在字段前綴上的索引和使用INDEX或KEY。見7.7 CREATE TABLE 句法。
CREATE TABLE使用TEMPORARY或IF NOT EXISTS。
使用COUNT(DISTINCT list),這里“l(fā)ist”超過一個元素。
在一個ALTER TABLE語句里面使用CHANGE col_name、DROP col_name或DROP INDEX。見7.8 ALTER TABLE句法。
在一個ALTER TABLE里面語句使用IGNORE。
在一個ALTER TABLE語句中使用多重ADD、ALTER、DROP或CHANGE子句。
使用帶關鍵詞IF EXISTS的DROP TABLE。
你能用單個DROP TABLE語句拋棄多個表。
DELETE語句的LIMIT子句。
INSERT和REPLACE語句的DELAYED子句。
INSERT, REPLACE, DELETE和UPDATE語句的LOW_PRIORITY子句。
使用LOAD DATA INFILE。在多數(shù)情況下,這句法與Oracle的LOAD DATA INFILE兼容。見7.16 LOAD DATA INFILE 句法。
OPTIMIZE TABLE語句。。
SHOW語句。見7.21 SHOW句法(得到表、列等的信息)。
字符串可以被“"”或“'”包圍,而不只是“'”。
使用“\”轉義字符。
SET OPTION語句。見7.25 SET OPTION句法。
你不需要命名所有在GROUP BY部分的被選擇的列。這為一些很特定的情況給出更好的性能,而不是一般的查詢。
為了方便來自于SQL環(huán)境其他為用戶,MySQL對許多函數(shù)支持別名。例如,所有的字符串功能都支持ANSI SQL句法和 ODBC句法。
MySQL理解||和&&意味著邏輯的OR和AND,就像在C程序語言中。在MySQL中,||和OR是同義詞,&&和AND是同義詞。正因為這個好的句法,MySQL對字符串并置的不支持ANSI SQL ||操作符;相反使用CONCAT(),因為CONCAT()接受任何數(shù)量的參數(shù),很容易把||操作符使用變換到MySQL。
CREATE DATABASE或DROP DATABASE。見7.5 CREATE DATABASE句法。
%操作符是MOD()一個同義詞,即,N % M等價于MOD(N,M)。%支持C程序員并與PostgreSQL兼容。
=, <>, <=,<, >=,>, <<, >>, <=>, AND, OR或LIKE操作符可以放在SELECT語句的FROM左邊用于比較列。例如:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
LAST_INSERT_ID()函數(shù)。見20.4.29 mysql_insert_id()。
擴展的正則表達式操作符REGEXP和NOT REGEXP。
CONCAT()或CHAR()有一個參數(shù)或超過2個參數(shù)。(在MySQL中,這些函數(shù)可取任何數(shù)量的參數(shù)。)
BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(),或WEEKDAY()函數(shù)。
使用TRIM()整修子串。ANSI SQL 只支持單個字符的刪除。
GROUP BY函數(shù)STD(), BIT_OR()和BIT_AND()。
使用REPLACE而不是DELETE+INSERT。見7.15 REPLACE句法。
FLUSH flush_option語句。
在一個語句用:=設置變量的可能性:
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
以ANSI模式運行MySQL
如果你用--ansi選項啟動mysqld,MySQL的下列行為改變。
||是字符串并置而不是OR。
可在一個函數(shù)名字之間與“(”有任何數(shù)量的空格。這也使所有的功能名字成為保留詞。
"把是一個標識符引號字符(象MySQL `引號字符一樣)而不是一個字符串引號字符。
REAL把是FLOAT一個同義詞,不是DOUBLE一個同義詞。
5.3 MySQL相比ANSI SQL92的差別
我們嘗試使得MySQL遵照ANSI SQL標準和ODBC SQL標準,但是在一些情況下,MySQL做一些不同的事情:
--只是一個注釋,如果后面跟一個白空字符。`--'作為一個注釋的開始。
對于VARCHAR列,當值被存儲時,拖后的空格被刪除。見E MySQL已知的錯誤和設計缺限。
在一些情況下,CHAR列偷偷地被改變?yōu)閂ARCHAR列。平靜的列指定變化。
當你刪除一個表時,對表的權限不自動地廢除。你必須明確地發(fā)出一個REVOKE來廢除對一個表的權限。見7.26 GRANT和REVOKE句法。
MySQL缺乏的功能
下列功能在當前的MySQL版本是沒有的。對于一張優(yōu)先級表指出何時新擴展可以加入MySQL, 你應該咨詢在線MySQL TODO 表。這是本手冊最新的TODO表版本。見F 我們想要在未來加入到MySQL的事情列表(TODO)。
子選擇
在MySQL中下列語句還不能工作:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
然而,在很多情況下,你可以重寫查詢,而不用子選擇:
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
對于更復雜的子查詢,通常你可以創(chuàng)建臨時的表保存子查詢。然而在一些情況下,這種選擇把行不通。最經(jīng)常遇到的情形是DELETE語句,對于它標準SQL不支持聯(lián)結(join)(除了在子選擇)。對于這種情況,有2個可用選擇,直到子選擇被MySQL支持。
第一個選擇是使用一種過程化的程序語言(例如Perl或PHP)來提交一個SELECT查詢獲得要被刪除記錄主鍵,并然后使用這些值構造DELETE語句(DELETE FROM ... WHERE ... IN (key1, key2, ...))。
第二個選擇是使用交互式SQL自動構造一套DELETE語句,使用MySQL擴展CONCAT()(代替標準||操作符)。例如:
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
FROM tab1, tab2
WHERE tab1.col1 = tab2.col2;
你可以把這個查詢放在一個腳本文件并且從它重定向輸入到mysql命令行解釋器,把其輸出作為管道返回給解釋器的第2個實例:
prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb
MySQL僅支持INSERT ... SELECT ...和REPLACE ... SELECT ...,獨立的子選擇把可能在3.24.0得到,然而,在其他環(huán)境下,你現(xiàn)在可以使用函數(shù)IN()。
SELECT INTO TABLE
MySQL還不支持Oracle SQL的擴展:SELECT ... INTO TABLE ....,相反MySQL支持ANSI SQL句法INSERT INTO ... SELECT ...,基本上他們是一樣的。
另外,你可使用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT解決你的問題。
事務處理
不支持事務處理。MySQL把在短時間內支持原子(atomic)操作,它象沒有回卷的事務。用原子操作,你能執(zhí)行一組INSERT/SELECT/whatever 命令并且保證沒有其他線程介入。在本文中,你通常不會需要回卷。目前,你可通過使用LOCK TABLES和UNLOCK TABLES命令阻止其他線程的干擾。見7.24 LOCK TABLES/UNLOCK TABLES句法。
存儲過程和觸發(fā)器
一個存儲過程是能在服務器中編譯并存儲的一套SQL命令。一旦這樣做了,顧客不需要一直重新發(fā)出全部查詢,而可以參考存儲過程。因為查詢僅需一次詞法分析并且較少的信息需要在服務器和客戶之間傳送,因此這提供了更好的性能。你與可以通過擁有在服務器中的函數(shù)庫提升概念上的層次。