Sqlite2009-06-29 22:22:25閱讀5評(píng)論0字號(hào):大中小
sql-statement ::= | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement |
INSERT語(yǔ)句有兩種基本形式。一種帶有"VALUES"關(guān)鍵字,在已有表中插入一個(gè)新的行。若不定義字段列表,那么值的數(shù)目將與表中的字段數(shù)目相同。否則值的數(shù)目須與字段列表中的字段數(shù)目相同。不在字段列表中的字段被賦予缺省值或NULL(當(dāng)未定義缺省值)。
INSERT的第二種形式從SELECT語(yǔ)句中獲取數(shù)據(jù)。若未定義字段列表,則從SELECT得到的字段的數(shù)目必須與表中的字段數(shù)目相同,否則應(yīng)與定義的字段列表中的字段數(shù)目相同。SELECT的每一行結(jié)果在表中插入一個(gè)新的條目。SELECT可以是簡(jiǎn)單的或者復(fù)合的。如果SELECT語(yǔ)句帶有ORDERBY子句,ORDER BY會(huì)被忽略。
在使用這一命令時(shí),利用可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。更多信息,參見 ON CONFLICT 。為了兼容MySQL,可以使用REPLACE代替"INSERT OR REPLACE".
conflict-clause ::= | ON CONFLICT conflict-algorithm |
conflict-algorithm ::= | ROLLBACK | ABORT | FAIL | IGNORE | REPLACE |
ON CONFLICT子句不是獨(dú)立的SQL命令。這是一條可以出現(xiàn)在許多其他SQL命令中的非標(biāo)準(zhǔn)的子句。由于它并不是標(biāo)準(zhǔn)的SQL語(yǔ)言,這里單獨(dú)介紹它。
ONCONFLICT子句的語(yǔ)法在如上的CREATE TABLE命令中示出。對(duì)于INSERT和UPDATE,關(guān)鍵詞"ONCONFLICT"由"OR"替代,這樣語(yǔ)法顯得自然。例如,不用寫"INSERT ON CONFLICT IGNORE"而是"INSERT ORIGNORE".二者表示相同的意思。
ON CONFLICT子句定義了解決約束沖突的算法。有五個(gè)選擇:ROLLBACK, ABORT, FAIL, IGNORE, 和REPLACE.缺省方案是ABORT.選項(xiàng)含義如下:
當(dāng)發(fā)生約束沖突,立即ROLLBACK,即結(jié)束當(dāng)前事務(wù)處理,命令中止并返回SQLITE_CONSTRAINT代碼。若當(dāng)前無(wú)活動(dòng)事務(wù)(除了每一條命令創(chuàng)建的默認(rèn)事務(wù)以外),則該算法與ABORT相同。
當(dāng)發(fā)生約束沖突,命令收回已經(jīng)引起的改變并中止返回SQLITE_CONSTRAINT。但由于不執(zhí)行ROLLBACK,所以前面的命令產(chǎn)生的改變將予以保留。缺省采用這一行為。
當(dāng)發(fā)生約束沖突,命令中止返回SQLITE_CONSTRAINT。但遇到?jīng)_突之前的所有改變將被保留。例如,若一條UPDATE語(yǔ)句在100行遇到?jīng)_突100th,前99行的改變將被保留,而對(duì)100行或以后的改變將不會(huì)發(fā)生。
當(dāng)發(fā)生約束沖突,發(fā)生沖突的行將不會(huì)被插入或改變。但命令將照常執(zhí)行。在沖突行之前或之后的行將被正常的插入和改變,且不返回錯(cuò)誤信息。
當(dāng)發(fā)生UNIQUE約束沖突,先存在的,導(dǎo)致沖突的行在更改或插入發(fā)生沖突的行之前被刪除。這樣,更改和插入總是被執(zhí)行。命令照常執(zhí)行且不返回錯(cuò)誤信息。當(dāng)發(fā)生NOT NULL約束沖突,導(dǎo)致沖突的NULL值會(huì)被字段缺省值取代。若字段無(wú)缺省值,執(zhí)行ABORT算法。
當(dāng)沖突應(yīng)對(duì)策略為滿足約束而刪除行時(shí),它不會(huì)調(diào)用刪除觸發(fā)器。但在新版中這一特性可能被改變。
INSERT或UPDATE的OR子句定義的算法會(huì)覆蓋CREATE TABLE所定義的。ABORT算法將在沒有定義任何算法時(shí)缺省使用。
PRAGMA命令是用于修改SQlite庫(kù)或查詢SQLite庫(kù)內(nèi)部數(shù)據(jù)(non-table)的特殊命令。PRAGMA 命令使用與其它SQLite命令(e.g. SELECT, INSERT)相同的接口,但在如下重要方面與其它命令不同:
可用的pragma命令有如下四個(gè)基本類型:
sql-statement ::= | PRAGMA name [= value] | PRAGMA function(arg) |
使用整數(shù)值value的pragma也可以使用符號(hào)表示,字符串"on", "true",和 "yes" 等同于1,"off", "false",和 "no"等同于0. 這些字符串大小寫不敏感且無(wú)須進(jìn)行引用。無(wú)法識(shí)別的字符串被當(dāng)作1且不會(huì)報(bào)錯(cuò)。value返回時(shí)是整數(shù)。
PRAGMA auto_vacuum;
PRAGMA auto_vacuum = 0 | 1;
查詢或設(shè)置數(shù)據(jù)庫(kù)的auto-vacuum標(biāo)記。
正常情況下,當(dāng)提交一個(gè)從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)的事務(wù)時(shí),數(shù)據(jù)庫(kù)文件不改變大小。未使用的文件頁(yè)被標(biāo)記并在以后的添加操作中 再次使用。這種情況下使用VACUUM命令釋放刪除得到的空間。
當(dāng)開啟auto-vacuum,當(dāng)提交一個(gè)從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)的事務(wù)時(shí),數(shù)據(jù)庫(kù)文件自動(dòng)收縮, (VACUUM命令在auto-vacuum開啟的數(shù)據(jù)庫(kù)中不起作用)。數(shù)據(jù)庫(kù)會(huì)在內(nèi)部存儲(chǔ)一些信息以便支持這一功能,這使得 數(shù)據(jù)庫(kù)文件比不開啟該選項(xiàng)時(shí)稍微大一些。
只有在數(shù)據(jù)庫(kù)中未建任何表時(shí)才能改變auto-vacuum標(biāo)記。試圖在已有表的情況下修改不會(huì)導(dǎo)致報(bào)錯(cuò)。
PRAGMA cache_size;
PRAGMA cache_size = Number-of-pages;
查詢或修改SQLite一次存儲(chǔ)在內(nèi)存中的數(shù)據(jù)庫(kù)文件頁(yè)數(shù)。每頁(yè)使用約1.5K內(nèi)存,缺省的緩存大小是2000. 若需要使用改變大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的內(nèi)存的話,可以增大緩存以提高性能。
當(dāng)使用cache_size pragma改變緩存大小時(shí),改變僅對(duì)當(dāng)前對(duì)話有效,當(dāng)數(shù)據(jù)庫(kù)關(guān)閉重新打開時(shí)緩存大小恢復(fù)到缺省大小。 要想永久改變緩存大小,使用default_cache_size pragma.
PRAGMA case_sensitive_like;
PRAGMA case_sensitive_like = 0 | 1;
LIKE運(yùn)算符的缺省行為是忽略latin1字符的大小寫。因此在缺省情況下'a' LIKE 'A'的值為真??梢酝ㄟ^(guò)打開 case_sensitive_like pragma來(lái)改變這一缺省行為。當(dāng)啟用case_sensitive_like,'a' LIKE 'A'為假而 'a' LIKE 'a'依然為真。
PRAGMA count_changes;
PRAGMA count_changes = 0 | 1;
查 詢或更改count-changes標(biāo)記。正常情況下INSERT, UPDATE和DELETE語(yǔ)句不返回?cái)?shù)據(jù)。 當(dāng)開啟count-changes,以上語(yǔ)句返回一行含一個(gè)整數(shù)值的數(shù)據(jù)——該語(yǔ)句插入,修改或刪除的行數(shù)。 返回的行數(shù)不包括由觸發(fā)器產(chǎn)生的插入,修改或刪除等改變的行數(shù)。
PRAGMA default_cache_size;
PRAGMA default_cache_size = Number-of-pages;
查詢或修改SQLite一次存儲(chǔ)在內(nèi)存中的數(shù)據(jù)庫(kù)文件頁(yè)數(shù)。每頁(yè)使用約1.5K內(nèi)存,它與 cache_sizepragma類似,只是它永久性地改變緩存大小。 利用該pragma,你可以設(shè)定一次緩存大小,并且每次重新打開數(shù)據(jù)庫(kù)時(shí)都繼續(xù)使用該值。
PRAGMA default_synchronous;
該語(yǔ)句在2.8版本中可用,但在3.0版中被去掉了。這條pragma很危險(xiǎn)且不推薦使用,安全起見在該文檔中不涉及此pragma的用法。
PRAGMA empty_result_callbacks;
PRAGMA empty_result_callbacks = 0 | 1;
查詢或更改empty-result-callbacks標(biāo)記。
empty- result-callbacks標(biāo)記僅僅影響sqlite3_exec API函數(shù)。正常情況下,empty-result-callbacks標(biāo)記清空, 則對(duì)返回0行數(shù)據(jù)的命令不調(diào)用sqlite3_exec()的回叫函數(shù),當(dāng)設(shè)置了empty-result-callbacks,則調(diào)用回叫 函數(shù)一次,置第三個(gè)參數(shù)為0 (NULL).這使得使用sqlite3_exec() API的程序即使在一條查詢不返回?cái)?shù)據(jù)時(shí)依然檢索字段名。
PRAGMA encoding;
PRAGMA encoding = "UTF-8";
PRAGMA encoding = "UTF-16";
PRAGMA encoding = "UTF-16le";
PRAGMA encoding = "UTF-16be";
在 第一種形式中,若主數(shù)據(jù)庫(kù)已創(chuàng)建,這條pragma返回主數(shù)據(jù)庫(kù)使用得文本編碼格式,為 "UTF-8", "UTF-16le" (little-endian UTF-16 encoding) 或者"UTF-16be" (big-endian UTF-16 encoding)中的一種。 若主數(shù)據(jù)庫(kù)未創(chuàng)建,返回值為當(dāng)前會(huì)話創(chuàng)建的主數(shù)據(jù)庫(kù)將要使用的文本編碼格式。
第二種及以后幾種形式只在主數(shù)據(jù)庫(kù)未創(chuàng)建時(shí)有效。這時(shí)該pragma設(shè)置當(dāng)前會(huì)話創(chuàng)建的主數(shù)據(jù)庫(kù)將要使用的文本編碼格式。 "UTF-16"表示"使用本機(jī)字節(jié)順序的UTF-16編碼"。若這些形式在主數(shù)據(jù)庫(kù)創(chuàng)建后使用,將被忽略且不產(chǎn)生任何效果。
數(shù)據(jù)庫(kù)的編碼格式設(shè)置后不能夠被改變。
ATTACH命令創(chuàng)建的數(shù)據(jù)庫(kù)使用與主數(shù)據(jù)庫(kù)相同的編碼格式。
PRAGMA full_column_names;
PRAGMA full_column_names = 0 | 1;
查詢或更改the full-column-names標(biāo)記。該標(biāo)記影響SQLite命名SELECT語(yǔ)句(當(dāng)字段表達(dá)式為表-字段或通配符"*"時(shí)) 返回的字段名的方式。正常情況下,當(dāng)SELECT語(yǔ)句將兩個(gè)或多個(gè)表連接時(shí), 這類結(jié)果字段的返回名為
若short-column-names和full-column-names標(biāo)記同時(shí)被設(shè)置,則使用full-column-names方式。
PRAGMA fullfsync
PRAGMA fullfsync = 0 | 1;
查詢或更改fullfsync標(biāo)記。該標(biāo)記決定是否在支持的系統(tǒng)上使用F_FULLFSYNC同步模式。缺省值為off.截至目前(2006-02-10) 只有Mac OS X 系統(tǒng)支持F_FULLFSYNC.
PRAGMA page_size;
PRAGMA page_size = bytes;
查詢或設(shè)置page-size值。只有在未創(chuàng)建數(shù)據(jù)庫(kù)時(shí)才能設(shè)置page-size。頁(yè)面大小必須是2的整數(shù)倍且大于等于512小于等于8192。 上限可以通過(guò)在編譯時(shí)修改宏定義SQLITE_MAX_PAGE_SIZE的值來(lái)改變。上限的上限是32768.
PRAGMA read_uncommitted;
PRAGMA read_uncommitted = 0 | 1;
查 詢,設(shè)置或清除READ UNCOMMITTED isolation(讀取未授權(quán)的分隔符).缺省的SQLite分隔符等級(jí)是SERIALIZABLE. 任何線程或進(jìn)程可選用READ UNCOMMITTED isolation,但除了共享公共頁(yè)和schema緩存的連接之間以外的地方也會(huì) 使用SERIALIZABLE.緩存共享通過(guò) sqlite3_enable_shared_cache() API開啟,且只在運(yùn)行同一線程的連接間有效。缺省情況下緩存共享是關(guān)閉的。
PRAGMA short_column_names;
PRAGMA short_column_names = 0 | 1;
查詢或更改the short-column-names標(biāo)記。該標(biāo)記影響SQLite命名SELECT語(yǔ)句(當(dāng)字段表達(dá)式為表-字段或通配符"*"時(shí)) 返回的字段名的方式。正常情況下,當(dāng)SELECT語(yǔ)句將兩個(gè)或多個(gè)表連接時(shí), 這類結(jié)果字段的返回名為
若short-column-names和full-column-names標(biāo)記同時(shí)被設(shè)置,則使用full-column-names方式。
PRAGMA synchronous;
PRAGMA synchronous = FULL; (2)
PRAGMA synchronous = NORMAL; (1)
PRAGMA synchronous = OFF; (0)
查 詢或更改"synchronous"標(biāo)記的設(shè)定。第一種形式(查詢)返回整數(shù)值。 當(dāng)synchronous設(shè)置為FULL (2), SQLite數(shù)據(jù)庫(kù)引擎在緊急時(shí)刻會(huì)暫停以確定數(shù)據(jù)已經(jīng)寫入磁盤。 這使系統(tǒng)崩潰或電源出問(wèn)題時(shí)能確保數(shù)據(jù)庫(kù)在重起后不會(huì)損壞。FULL synchronous很安全但很慢。 當(dāng)synchronous設(shè)置為NORMAL, SQLite數(shù)據(jù)庫(kù)引擎在大部分緊急時(shí)刻會(huì)暫停,但不像FULL模式下那么頻繁。 NORMAL模式下有很小的幾率(但不是不存在)發(fā)生電源故障導(dǎo)致數(shù)據(jù)庫(kù)損壞的情況。但實(shí)際上,在這種情況 下很可能你的硬盤已經(jīng)不能使用,或者發(fā)生了其他的不可恢復(fù)的硬件錯(cuò)誤。 設(shè)置為synchronous OFF (0)時(shí),SQLite在傳遞數(shù)據(jù)給系統(tǒng)以后直接繼續(xù)而不暫停。若運(yùn)行SQLite的應(yīng)用程序崩潰, 數(shù)據(jù)不會(huì)損傷,但在系統(tǒng)崩潰或?qū)懭霐?shù)據(jù)時(shí)意外斷電的情況下數(shù)據(jù)庫(kù)可能會(huì)損壞。另一方面,在synchronous OFF時(shí) 一些操作可能會(huì)快50倍甚至更多。
在SQLite 2中,缺省值為NORMAL.而在3中修改為FULL.
PRAGMA temp_store;
PRAGMA temp_store = DEFAULT; (0)
PRAGMA temp_store = FILE; (1)
PRAGMA temp_store = MEMORY; (2)
查詢或更改"temp_store"參數(shù)的設(shè)置。當(dāng)temp_store設(shè)置為DEFAULT (0),使用編譯時(shí)的C預(yù)處理宏 TEMP_STORE來(lái)定義儲(chǔ)存臨時(shí)表和臨時(shí)索引的位置。當(dāng)設(shè)置為MEMORY (2)臨時(shí)表和索引存放于內(nèi)存中。 當(dāng)設(shè)置為FILE (1)則存放于文件中。temp_store_directory pragma 可用于指定存放該文件的目錄。當(dāng)改變temp_store設(shè)置,所有已存在的臨時(shí)表,索引,觸發(fā)器及視圖將被立即刪除。
庫(kù)中的編譯時(shí)C預(yù)處理標(biāo)志TEMP_STORE可以覆蓋該pragma設(shè)置。下面的表給出TEMP_STORE預(yù)處理宏和 temp_store pragma交互作用的總結(jié):
TEMP_STORE PRAGMA
temp_store臨時(shí)表和索引
使用的存儲(chǔ)方式0 any 文件 1 0 文件 1 1 文件 1 2 內(nèi)存 2 0 內(nèi)存 2 1 文件 2 2 內(nèi)存 3 any 內(nèi)存
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory-name';
查詢或更改"temp_store_directory"設(shè)置——存儲(chǔ)臨時(shí)表和索引的文件所在的目錄。 僅在當(dāng)前連接有效,在建立新連接時(shí)重置為缺省值。
當(dāng)改變了temp_store_directory設(shè)置,所有已有的臨時(shí)表,索引,觸發(fā)器,視圖會(huì)被直接刪除。 建議在數(shù)據(jù)庫(kù)一打開時(shí)就設(shè)置好temp_store_directory.
directory-name需用單引號(hào)引起來(lái)。要想恢復(fù)缺省目錄,把directory-name設(shè)為空字符串。例如 PRAGMA temp_store_directory = ''.若directory-name未找到或不可寫會(huì)引發(fā)錯(cuò)誤。
臨時(shí)文件的缺省目錄與主機(jī)的系統(tǒng)有關(guān),使用Unix/Linux/OSX系統(tǒng)的主機(jī),缺省目錄是如下序列之中第一個(gè)可寫的 /var/tmp, /usr/tmp, /tmp,current-directory.對(duì)于Windows NT,缺省目錄由Windows決定,一般為 C:\Documents and Settings\user-name\Local Settings\Temp\. SQLite創(chuàng)建的臨時(shí)文件在使用完畢時(shí)就被unlink,所以操作系統(tǒng)可以在SQLite進(jìn)程進(jìn)行中自動(dòng)刪除臨時(shí)文件。 于是,正常情況下不能通過(guò)ls 或 dir命令看到臨時(shí)文件。
PRAGMA database_list;
對(duì)每個(gè)打開的數(shù)據(jù)庫(kù),使用該數(shù)據(jù)庫(kù)的信息調(diào)用一次回叫函數(shù)。使用包括附加的數(shù)據(jù)庫(kù)名和索引名在內(nèi)的參數(shù)。第一行用于主數(shù)據(jù)庫(kù),第二行用于存放臨時(shí)表的臨時(shí)數(shù)據(jù)庫(kù)。
PRAGMA foreign_key_list(table-name);
對(duì)于參數(shù)表中每個(gè)涉及到字段的外鍵,使用該外鍵的信息調(diào)用一次回叫函數(shù)。每個(gè)外鍵中的每個(gè)字段都將調(diào)用一次回叫函數(shù)。
PRAGMA index_info(index-name);
對(duì)該索引涉及到的每個(gè)字段,使用字段信息(字段名,字段號(hào))調(diào)用一次回叫函數(shù)。
PRAGMA index_list(table-name);
對(duì)表中的每個(gè)索引,使用索引信息調(diào)用回叫函數(shù)。參數(shù)包括索引名和一個(gè)指示索引是否唯一的標(biāo)志。
PRAGMA table_info(table-name);
對(duì)于表中的每個(gè)字段,使用字段信息(字段名,數(shù)據(jù)類型,可否為空,缺省值)調(diào)用回叫函數(shù)。
PRAGMA [database.]schema_version;
PRAGMA [database.]schema_version = integer ;
PRAGMA [database.]user_version;
PRAGMA [database.]user_version = integer ;
這兩條pragma分別用于設(shè)置schema-version和user-version的值。schema-version 和user-version均為32位有符號(hào)整數(shù),存放于數(shù)據(jù)庫(kù)頭中。
schema- version通常只由SQLite內(nèi)部操作。每當(dāng)數(shù)據(jù)庫(kù)的schema改變時(shí)(創(chuàng)建或撤消表或索引),SQLite 將這個(gè)值增大。schema版本在每一次query被執(zhí)行時(shí)被SQLite所使用,以確定編譯SQL query時(shí)內(nèi)部cache的schema與編譯后的query實(shí)際執(zhí)行時(shí)數(shù)據(jù)庫(kù)的schema相匹配。使用"PRAGMA schema_version"更改schema-version會(huì)破壞這一機(jī)制,有導(dǎo)致程序崩潰或數(shù)據(jù)庫(kù)損壞的潛在危險(xiǎn)。請(qǐng)小心使用!
user-version不在SQLite內(nèi)部使用,任何程序可以用它來(lái)做任何事。
PRAGMA integrity_check;
該命令對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行完整性檢查,查找次序顛倒的記錄,丟失的頁(yè),殘缺的記錄以及損壞的索引。若發(fā)現(xiàn)任何問(wèn)題則返回一形容問(wèn)題所在的字符串,若一切正常返回"ok".
PRAGMA parser_trace = ON; (1)
PRAGMA parser_trace = OFF; (0)
打開或關(guān)閉SQLite庫(kù)中的SQL語(yǔ)法分析追蹤,用于debug.只有當(dāng)SQLite不使用NDEBUG宏進(jìn)行編譯時(shí)該pragma才可用。
PRAGMA vdbe_trace = ON; (1)
PRAGMA vdbe_trace = OFF; (0)
打開或關(guān)閉SQLite庫(kù)中的虛擬數(shù)據(jù)庫(kù)引擎追蹤,用于debug.更多信息,察看 VDBE文檔。
PRAGMA vdbe_listing = ON; (1)
PRAGMA vdbe_listing = OFF; (0)
打開或關(guān)閉虛擬機(jī)程序列表,當(dāng)開啟列表功能,整個(gè)程序的內(nèi)容在執(zhí)行前被打印出來(lái),就像在每條語(yǔ)句之前自動(dòng)執(zhí)行EXPLAIN. 語(yǔ)句在打印列表之后正常執(zhí)行。用于debug.更多信息,察看 VDBE文檔。
sql-statement ::= | REINDEX collation name |
sql-statement ::= | REINDEX [database-name .] table/index-name |
REINDEX命令用于刪除并從草稿重建索引。當(dāng)比較順序改變時(shí)該命令顯得很有效。
在第一種形式中,所有附加數(shù)據(jù)庫(kù)中使用該比較順序的索引均被重建。在第二種形式中, [database-name.]table/index-name標(biāo)識(shí)出一個(gè)表,所有關(guān)聯(lián)該表的索引被重建。若標(biāo)識(shí)出索引,則僅僅該索引被刪除并重建。
若不指定database-name而指定表/索引名以及比較順序,只有關(guān)聯(lián)該比較順序的索引被重建。在重建索引時(shí)總是指定database-name可以消除這一歧義。
sql-statement ::= | REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) | REPLACE INTO [database-name .] table-name [( column-list )] select-statement |
REPLACE命令用于替代INSERT的"INSERT OR REPLACE"變體,以更好的兼容MySQL。查看 INSERT命令文檔獲取更多信息。
sql-statement ::= | SELECT [ALL | DISTINCT] result [FROM table-list] [WHERE expr] [GROUP BY expr-list] [HAVING expr] [compound-op select]* [ORDER BY sort-expr-list] [LIMIT integer [( OFFSET | , ) integer]] |
result ::= | result-column [, result-column]* |
result-column ::= | * | table-name . * | expr [ [AS] string ] |
table-list ::= | table [join-op table join-args]* |
table ::= | table-name [AS alias] | ( select ) [AS alias] |
join-op ::= | , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN |
join-args ::= | [ON expr] [USING ( id-list )] |
sort-expr-list ::= | expr [sort-order] [, expr [sort-order]]* |
sort-order ::= | [ COLLATE collation-name ] [ ASC | DESC ] |
compound_op ::= | UNION | UNION ALL | INTERSECT | EXCEPT |
SELECT語(yǔ)句用于查詢數(shù)據(jù)庫(kù)。一條SELECT命令的返回結(jié)果是零或多行每行有固定字段數(shù)的數(shù)據(jù)。字段的數(shù)目由在SELECT和FROM之間的表達(dá)式列表定義。任意的表達(dá)式都可以被用作結(jié)果。若表達(dá)式是 *則表示所有表的所有字段。若表達(dá)式是表的名字后接.*則結(jié)果為該表中的所有字段。
DISTINCT關(guān)鍵字的使用會(huì)使返回的結(jié)果是原結(jié)果的一個(gè)不含相同行的子集。NULL值被認(rèn)為是相同的。缺省行為是返回所有的行,為清楚起見可以使用關(guān)鍵字ALL。
查詢對(duì)FROM之后定義的一個(gè)或多個(gè)表進(jìn)行。若多個(gè)表用逗號(hào)連接,則查詢針對(duì)它們的交叉連接。所有的SQL-92連接語(yǔ)法均可以用于定義連接。圓括號(hào)中的副查詢可能被FROM子句中的任意表名替代。當(dāng)結(jié)果中僅有一行包含表達(dá)式列表中的結(jié)果的行時(shí),整個(gè)的FROM子句會(huì)被忽略。
WHERE子句可以限定查詢操作的行數(shù)目。
GROUP BY子句將一行或多行結(jié)果合成單行輸出。當(dāng)結(jié)果有聚集函數(shù)時(shí)這將尤其有用。GROUP BY子句的表達(dá)式不須是出現(xiàn)在結(jié)果中的表達(dá)式。HAVING子句與WHERE相似,只是HAVING用于過(guò)濾分組創(chuàng)建的行。HAVING子句可能包含值,甚至是不出現(xiàn)在結(jié)果中的聚集函數(shù)。
ORDERBY子句對(duì)所得結(jié)果根據(jù)表達(dá)式排序。表達(dá)式無(wú)須是簡(jiǎn)單SELECT的結(jié)果,但在復(fù)合SELECT中每個(gè)表達(dá)式必須精確對(duì)應(yīng)一個(gè)結(jié)果字段。每個(gè)表達(dá)式可能跟隨一個(gè)可選的COLLATE關(guān)鍵字以及用于排序文本的比較函數(shù)名稱和/或關(guān)鍵字ASC或DESC,用于說(shuō)明排序規(guī)則。
LIMIT子句限定行數(shù)的最大值。負(fù)的LIMIT表示無(wú)上限。后跟可選的OFFSET說(shuō)明跳過(guò)結(jié)果集中的前多少行。在一個(gè)復(fù)合查詢中,LIMIT子句只允許出現(xiàn)在最終SELECT語(yǔ)句中。限定對(duì)于所有的查詢均適用,而不僅僅是添加了LIMIT子句的那一行。注意OFFSET關(guān)鍵字用于LIMIT子句中,則限制值是第一個(gè)數(shù)字,而偏移量(offset)是第二個(gè)數(shù)字。若用逗號(hào)替代OFFSET關(guān)鍵字,則偏移量是第一個(gè)數(shù)字而限制值是第二個(gè)數(shù)字。這是為了加強(qiáng)對(duì)遺留的SQL數(shù)據(jù)庫(kù)的兼容而有意造成的矛盾。
復(fù)合的SELECT由兩個(gè)或更多簡(jiǎn)單SELECT經(jīng)由UNION, UNION ALL,INTERSECT,EXCEPT中的一個(gè)運(yùn)算符連接而成。在一個(gè)復(fù)合SELECT中,各個(gè)SELECT需指定相同個(gè)數(shù)的結(jié)果字段。僅允許一個(gè)ORDERBY子句出現(xiàn)在SELECT的末尾。UNION和UNIONALL運(yùn)算符從左至右將所有SELECT的結(jié)果合成一個(gè)大的表。二者的區(qū)別在于UNION的所有結(jié)果行是不相同的而 UNIONALL允許重復(fù)行。INTERSECT運(yùn)算符取左右兩個(gè)SELECT結(jié)果的交。EXCEPT從左邊SELECT的結(jié)果中除掉右邊SELECT的結(jié)果。三個(gè)或更多SELECT復(fù)合時(shí),它們從左至右結(jié)合。
聯(lián)系客服