SQL子查詢


子查詢是另一個SQL查詢中的查詢,並嵌入在WHERE子句中。

重要規則:

  • 子查詢可以放在許多SQL子句中,如WHERE子句,FROM子句,HAVING子句。
  • 可以將子查詢與SELECTUPDATEINSERTDELETE語句以及=<>> =<=INBETWEEN等運算子一起使用。
  • 子查詢是另一個查詢中的查詢。外部查詢稱為主查詢,內部查詢稱為子查詢。
  • 子查詢位於比較運算子的右側。
  • 子查詢括在括號中。
  • 在子查詢中,不能使用ORDER BY命令。 但GROUP BY命令可用於執行與ORDER BY命令相同的功能。

1.帶有Select語句的子查詢

SQL子查詢最常與Select語句一起使用。

語法

SELECT column_name  
FROM table_name  
WHERE column_name expression operator   
( SELECT column_name  from table_name WHERE ... );

範例

假設EMPLOYEE表有以下記錄:

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
4 Alina 29 UK 6500.00
5 Kathrin 34 Bangalore 8500.00
6 Harry 42 China 4500.00
7 Jackson 25 Mizoram 10000.00

帶有SELECT語句的子查詢將是:

SELECT *   
    FROM EMPLOYEE  
    WHERE ID IN (SELECT ID   
    FROM EMPLOYEE   
    WHERE SALARY > 4500);

這將產生以下結果:

ID NAME AGE ADDRESS SALARY
4 Alina 29 UK 6500.00
5 Kathrin 34 Bangalore 8500.00
7 Jackson 25 Mizoram 10000.00

2.帶有INSERT語句的子查詢

SQL子查詢也可以與Insert語句一起使用。 在insert語句中,子查詢返回的資料用於插入另一個表。
在子查詢中,可以使用任何字元,日期函式修改所選資料。

語法:

INSERT INTO table_name (column1, column2, column3....)   
SELECT *  
FROM table_name  
WHERE VALUE OPERATOR

範例

假設有一個與EMPLOYEE類似的表EMPLOYEE_BKP。現在使用以下語法將完整的EMPLOYEE表複製到EMPLOYEE_BKP表中。

INSERT INTO EMPLOYEE_BKP  
   SELECT * FROM EMPLOYEE   
   WHERE ID IN (SELECT ID   
   FROM EMPLOYEE);

3.帶有UPDATE語句的子查詢

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

語法

UPDATE table  
SET column_name = new_value  
WHERE VALUE OPERATOR  
   (SELECT COLUMN_NAME  
   FROM TABLE_NAME  
   WHERE condition);

範例

假設有一個EMPLOYEE_BKP表,它是EMPLOYEE表的備份。要在EMPLOYEE表中為所有AGE大於或等於29的員工更新SALARY值更新增加 0.25 倍。

UPDATE EMPLOYEE  
   SET SALARY = SALARY * 0.25  
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP  
      WHERE AGE >= 29);

上面命令將影響三行,最後,EMPLOYEE表的記錄更新為如下。

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
4 Alina 29 UK 1625.00
5 Kathrin 34 Bangalore 2125.00
6 Harry 42 China 1125.00
7 Jackson 25 Mizoram 10000.00

4.帶有DELETE語句的子查詢

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

語法

DELETE FROM TABLE_NAME  
WHERE VALUE OPERATOR  
   (SELECT COLUMN_NAME  
   FROM TABLE_NAME  
   WHERE condition);

範例

假設有一張EMPLOYEE_BKP表,它是EMPLOYEE表的備份。要從EMPLOYEE表中刪除AGE大於或等於29的所有記錄。參考以下語句 -

DELETE FROM EMPLOYEE  
   WHERE AGE IN (SELECT AGE FROM EMPLOYEE_BKP  
      WHERE AGE >= 29 );

這將影響三行,最後,EMPLOYEE表將具有以下記錄。

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
7 Jackson 25 Mizoram 10000.00