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