一、JOIN
SQLite 的 Joins 子句用于結(jié)合兩個(gè)或多個(gè)數(shù)據(jù)庫中表的記錄谷誓。JOIN 是一種通過共同值來結(jié)合兩個(gè)表中字段的手段。
SQL 定義了三種主要類型的連接:
- 交叉連接 - CROSS JOIN
- 內(nèi)連接 - INNER JOIN
- 外連接 - OUTER JOIN
假設(shè)有兩張表吨凑,用于后面的示例扩所。
COMPANY:
DEPARTMENT:
交叉連接 - CROSS JOIN
交叉連接(CROSS JOIN)把第一個(gè)表的每一行與第二個(gè)表的每一行進(jìn)行匹配窝稿。如果兩個(gè)輸入表分別有 x 和 y 列,則結(jié)果表有 x+y 列。由于交叉連接(CROSS JOIN)有可能產(chǎn)生非常大的表遵绰,使用時(shí)必須謹(jǐn)慎较曼,只在適當(dāng)?shù)臅r(shí)候使用它們倾鲫。
交叉連接的含義可以用下圖表示:
語法:
SELECT ... FROM table1 CROSS JOIN table2 ...
針對(duì)COMPANY和DEPARTMENT兩張表贝搁,執(zhí)行:
SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
結(jié)果為:
內(nèi)連接 - INNER JOIN
內(nèi)連接(INNER JOIN)根據(jù)連接謂詞結(jié)合兩個(gè)表(table1 和 table2)的列值來創(chuàng)建一個(gè)新的結(jié)果表。查詢會(huì)把 table1 中的每一行與 table2 中的每一行進(jìn)行比較怠堪,找到所有滿足連接謂詞的行的匹配對(duì)揽乱。當(dāng)滿足連接謂詞時(shí),A 和 B 行的每個(gè)匹配對(duì)的列值會(huì)合并成一個(gè)結(jié)果行粟矿。
內(nèi)連接如下圖所示凰棉,藍(lán)色部分表示內(nèi)連接的交集。
內(nèi)連接(INNER JOIN)是最常見的連接類型陌粹,是默認(rèn)的連接類型撒犀。INNER 關(guān)鍵字是可選的。
下面是內(nèi)連接(INNER JOIN)的語法:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
為了避免冗余,并保持較短的措辭或舞,可以使用 USING 表達(dá)式聲明內(nèi)連接(INNER JOIN)條件荆姆。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
自然連接(NATURAL JOIN)類似于 JOIN...USING,只是它會(huì)自動(dòng)測試存在兩個(gè)表中的每一列的值之間相等值:
SELECT ... FROM table1 NATURAL JOIN table2...
基于上面的表映凳,我們可以寫一個(gè)內(nèi)連接(INNER JOIN)胆筒,如下所示:
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
結(jié)果為:
外連接 - OUTER JOIN
外連接(OUTER JOIN)是內(nèi)連接(INNER JOIN)的擴(kuò)展。雖然 SQL 標(biāo)準(zhǔn)定義了三種類型的外連接:LEFT魏宽、RIGHT腐泻、FULL决乎,但 SQLite 只支持左外連接(LEFT OUTER JOIN)队询。
外連接(OUTER JOIN)聲明條件的方法與內(nèi)連接(INNER JOIN)是相同的,使用 ON构诚、USING 或 NATURAL 關(guān)鍵字來表達(dá)蚌斩。最初的結(jié)果表以相同的方式進(jìn)行計(jì)算。一旦主連接計(jì)算完成范嘱,外連接(OUTER JOIN)將從一個(gè)或兩個(gè)表中任何未連接的行合并進(jìn)來送膳,外連接的列使用 NULL 值,將它們附加到結(jié)果表中丑蛤。
以下圖說明了LEFT JOIN執(zhí)行后的結(jié)果集(黃色部分)叠聋。
下面是左外連接(LEFT OUTER JOIN)的語法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
為了避免冗余,并保持較短的措辭受裹,可以使用 USING 表達(dá)式聲明外連接(OUTER JOIN)條件碌补。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
寫一個(gè)外連接(OUTER JOIN),如下所示:
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
上面的查詢會(huì)產(chǎn)生以下結(jié)果:
二棉饶、UNION
UNION 子句/運(yùn)算符用于將兩個(gè)或者更多的 SELECT 語句的運(yùn)算結(jié)果組合起來厦章。
在使用 UNION 的時(shí)候,每個(gè) SELECT 語句必須有相同數(shù)量的選中列照藻、相同數(shù)量的列表達(dá)式袜啃、相同的數(shù)據(jù)類型,并且它們出現(xiàn)的次序要一致幸缕,不過長度不一定要相同群发。
語法:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]