一文搞懂的SQLite的3大組合查詢語句

1. SQLite Unions 子句

1.1 UNION 子局

1.2 UNION ALL 子句

2. SQLite 子查詢

2.1 SELECT 子查詢使用

2.2 INSERT 子查詢使用

2.3 UPDATE 子查詢使用

2.4 DELETE 子查詢使用

3. SQLite Join

3.1 交叉連接 - CROSS JOIN

3.2 內連接 - INNER JOIN

3.3 外連接 - OUTER JOIN


1. SQLite Unions 子句

SQLite的 UNION 子句/運算符用於合併兩個或多個 SELECT 語句的結果,不返回任何重複的行。

為了使用 UNION,每個 SELECT 被選擇的列數必須是相同的,相同數目的列表達式,相同的數據類型,並確保它們有相同的順序,但它們不必具有相同的長度。

1.1 UNION 子句

語法

UNION 的基本語法如下:

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

UNION

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

這裡給定的條件根據需要可以是任何表達式。


實例

假設有下面兩個表:

(1)COMPANY 表如下所示:

sqlite> select * from COMPANY;

ID NAME AGE ADDRESS SALARY

---------- -------------------- ---------- ---------- ----------

1 Paul 32 California 20000.0

2 Allen 25 Texas 15000.0

3 Teddy 23 Norway 20000.0

4 Mark 25 Rich-Mond 65000.0

5 David 27 Texas 85000.0

6 Kim 22 South-Hall 45000.0

7 James 24 Houston 10000.0


(2)另一個表是 DEPARTMENT,如下所示:

ID DEPT EMP_ID

---------- -------------------- ----------

1 IT Billing 1

2 Engineering 2

3 Finance 7

4 Engineering 3

5 Finance 4

6 Engineering 5

7 Finance 6


現在,讓我們使用 SELECT 語句及 UNION 子句來連接兩個表,如下所示:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID

UNION

SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID;


這將產生以下結果:

EMP_ID NAME DEPT

---------- -------------------- ----------

1 Paul IT Billing

2 Allen Engineerin

3 Teddy Engineerin

4 Mark Finance

5 David Engineerin

6 Kim Finance

7 James Finance


1.2 UNION ALL 子句

UNION ALL 運算符用於結合兩個 SELECT 語句的結果,包括重複行。

適用於 UNION 的規則同樣適用於 UNION ALL 運算符。


語法

UNION ALL 的基本語法如下:

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

UNION ALL

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

這裡給定的條件根據需要可以是任何表達式。


實例

現在,讓我們使用 SELECT 語句及 UNION ALL 子句來連接兩個表,如下所示:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID

UNION ALL

SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID;


這將產生以下結果:

EMP_ID NAME DEPT

---------- -------------------- ----------

1 Paul IT Billing

2 Allen Engineerin

3 Teddy Engineerin

4 Mark Finance

5 David Engineerin

6 Kim Finance

7 James Finance

1 Paul IT Billing

2 Allen Engineerin

3 Teddy Engineerin

4 Mark Finance

5 David Engineerin

6 Kim Finance

7 James Finance


2. SQLite 子查詢

子查詢或內部查詢或嵌套查詢是在另一個 SQLite 查詢內嵌入在 WHERE 子句中的查詢。

使用子查詢返回的數據將被用在主查詢中作為條件,以進一步限制要檢索的數據。

子查詢可以與 SELECT、INSERT、UPDATE 和 DELETE 語句一起使用,可伴隨著使用運算符如 =、、>=、<=、IN、BETWEEN 等。


以下是子查詢必須遵循的幾個規則:

  • 子查詢必須用括號括起來。
  • 子查詢在 SELECT 子句中只能有一個列,除非在主查詢中有多列,與子查詢的所選列進行比較。
  • ORDER BY 不能用在子查詢中,雖然主查詢可以使用 ORDER BY。可以在子查詢中使用 GROUP BY,功能與 ORDER BY 相同。
  • 子查詢返回多於一行,只能與多值運算符一起使用,如 IN 運算符。
  • BETWEEN 運算符不能與子查詢一起使用,但是,BETWEEN 可在子查詢內使用。


2.1 SELECT 語句中的子查詢使用

子查詢通常與 SELECT 語句一起使用。基本語法如下:

SELECT column_name [, column_name ]

FROM table1 [, table2 ]

WHERE column_name OPERATOR

(SELECT column_name [, column_name ]

FROM table1 [, table2 ]

[WHERE])


2.2 INSERT 語句中的子查詢使用

子查詢也可以與 INSERT 語句一起使用。INSERT 語句使用子查詢返回的數據插入到另一個表中。在子查詢中所選擇的數據可以用任何字符、日期或數字函數修改。

基本語法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ]

SELECT [ *|column1 [, column2 ]

FROM table1 [, table2 ]

[ WHERE VALUE OPERATOR ]


2.3 UPDATE 語句中的子查詢使用

子查詢可以與 UPDATE 語句結合使用。當通過 UPDATE 語句使用子查詢時,表中單個或多個列被更新。

基本語法如下:

UPDATE table

SET column_name = new_value

[ WHERE OPERATOR [ VALUE ]

(SELECT COLUMN_NAME

FROM TABLE_NAME)

[ WHERE) ]


2.4 DELETE 語句中的子查詢使用

子查詢可以與 DELETE 語句結合使用,就像上面提到的其他語句一樣。

基本語法如下:

DELETE FROM TABLE_NAME

[ WHERE OPERATOR [ VALUE ]

(SELECT COLUMN_NAME

FROM TABLE_NAME)

[ WHERE) ]


3. SQLite Join

SQLite 的 Join 子句用於結合兩個或多個數據庫中表的記錄。JOIN 是一種通過共同值來結合兩個表中字段的手段。

SQL 定義了三種主要類型的連接:

  • 交叉連接 - CROSS JOIN
  • 內連接 - INNER JOIN
  • 外連接 - OUTER JOIN


3.1 交叉連接 - CROSS JOIN

交叉連接(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 行,則結果表有 x*y 行。由於交叉連接(CROSS JOIN)有可能產生非常大的表,使用時必須謹慎,只在適當的時候使用它們。

交叉連接的操作,它們都返回被連接的兩個表所有數據行的笛卡爾積,返回到的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。


下面是交叉連接(CROSS JOIN)的語法:

SELECT ... FROM table1 CROSS JOIN table2 ...


基於上面的表,我們可以寫一個交叉連接(CROSS JOIN),如下所示:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;


3.2 內連接 - INNER JOIN

內連接(INNER JOIN)根據連接謂詞結合兩個表(table1 和 table2)的列值來創建一個新的結果2表。查詢會把 table1 中的每一行與 table2 中的每一行進行比較,找到所有滿足連接謂詞的行的匹配對。當滿足連接謂詞時,A 和 B 行的每個匹配對的列值會合併成一個結果行。


內連接(INNER JOIN)是最常見的連接類型,是默認的連接類型。INNER 關鍵字是可選的。


下面是內連接(INNER JOIN)的語法:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...


為了避免冗餘,並保持較短的措辭,可以使用 USING 表達式聲明內連接(INNER JOIN)條件。這個表達式指定一個或多個列的列表:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...


自然連接(NATURAL JOIN)類似於 JOIN...USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:

SELECT ... FROM table1 NATURAL JOIN table2...


基於上面的表,我們可以寫一個內連接(INNER JOIN),如下所示:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID;


3.3. 外連接 - OUTER JOIN

外連接(OUTER JOIN)是內連接(INNER JOIN)的擴展。雖然 SQL 標準定義了三種類型的外連接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外連接(LEFT OUTER JOIN)。


外連接(OUTER JOIN)聲明條件的方法與內連接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主連接計算完成,外連接(OUTER JOIN)將從一個或兩個表中任何未連接的行合併進來,外連接的列使用 NULL 值,將它們附加到結果表中。


下面是左外連接(LEFT OUTER JOIN)的語法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...


為了避免冗餘,並保持較短的措辭,可以使用 USING 表達式聲明外連接(OUTER JOIN)條件。這個表達式指定一個或多個列的列表:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...


基於上面的表,我們可以寫一個外連接(OUTER JOIN),如下所示:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT

ON COMPANY.ID = DEPARTMENT.EMP_ID;


分享到:


相關文章: