SQLite - 子查詢



子查詢(也稱為內嵌查詢或巢狀查詢)是另一個 SQLite 查詢中的查詢,嵌入在 WHERE 子句中。

子查詢用於返回資料,這些資料將在主查詢中用作條件,以進一步限制要檢索的資料。

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

子查詢必須遵循以下一些規則:

  • 子查詢必須用括號括起來。

  • 除非主查詢中有多個列供子查詢比較其選擇的列,否則子查詢的 SELECT 子句中只能有一列。

  • 雖然主查詢可以使用 ORDER BY,但在子查詢中不能使用 ORDER BY。可以使用 GROUP BY 來執行與子查詢中的 ORDER BY 相同的功能。

  • 返回多行的子查詢只能與多值運算子一起使用,例如 IN 運算子。

  • BETWEEN 運算子不能與子查詢一起使用;但是,BETWEEN 可以用在子查詢中。

帶有 SELECT 語句的子查詢

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

SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
   (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

示例

考慮包含以下記錄的 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

現在,讓我們檢查一下帶有 SELECT 語句的以下子查詢。

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000) ;

這將產生以下結果。

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

帶有 INSERT 語句的子查詢

子查詢也可以與 INSERT 語句一起使用。INSERT 語句使用子查詢返回的資料插入到另一個表中。子查詢中選擇的資料可以使用任何字元、日期或數字函式進行修改。

以下基本語法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

示例

考慮一個與 COMPANY 表結構類似的 COMPANY_BKP 表,可以使用相同的 CREATE TABLE 語句建立,使用 COMPANY_BKP 作為表名。要將完整的 COMPANY 表複製到 COMPANY_BKP,語法如下:

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

帶有 UPDATE 語句的子查詢

子查詢可以與 UPDATE 語句一起使用。使用子查詢與 UPDATE 語句時,可以更新表中的單個或多個列。

以下基本語法如下:

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

示例

假設我們有 COMPANY_BKP 表,它是 COMPANY 表的備份。

以下示例將 COMPANY 表中所有年齡大於或等於 27 的客戶的 SALARY 更新為原來的 0.50 倍。

sqlite> UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

這將影響兩行,最終 COMPANY 表將包含以下記錄:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

帶有 DELETE 語句的子查詢

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

以下基本語法如下:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

示例

假設我們有 COMPANY_BKP 表,它是 COMPANY 表的備份。

以下示例刪除 COMPANY 表中所有年齡大於或等於 27 的客戶的記錄。

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

這將影響兩行,最終 COMPANY 表將包含以下記錄:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0
廣告
© . All rights reserved.