位置:首頁 > 數據庫 > SQL教學 > SQL子查詢

SQL子查詢

子查詢或內部查詢或嵌套查詢在另一個SQL查詢的查詢和嵌入式WHERE子句中。

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

子查詢可以在SELECT,INSERT,UPDATE使用,而且隨著運算符如DELETE語句 =, <, >, >=, <=, IN, BETWEEN 等.

這裡有一些規則,子查詢必須遵循:

  • 子查詢必須被圓括號括起來。

  • 子查詢隻能在有一列的SELECT子句中,除非多個列中的子查詢,以比較其選定列主查詢。

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

  • 返回多於一個行子查詢隻能用於具有多個值運算符,如IN操作。

  • SELECT列表中不能包含到值計算到任何引用 BLOB, ARRAY, CLOB, 或NCLOB.

  • 子查詢不能立即封閉在一組函數。

  • 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])

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

現在,讓我們檢查下使用子查詢SELECT語句:

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

這將產生以下結果:

+----+----------+-----+---------+----------+
| ID | NAME     | AGE | ADDRESS | SALARY   |
+----+----------+-----+---------+----------+
|  4 | Chaitali |  25 | Mumbai  |  6500.00 |
|  5 | Hardik   |  27 | Bhopal  |  8500.00 |
|  7 | Muffy    |  24 | Indore  | 10000.00 |
+----+----------+-----+---------+----------+

子查詢的INSERT語句:

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

其基本語法如下:

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

示例:

考慮CUSTOMERS_BKP表的結構相似於CUSTOMERS表。考慮CUSTOMERS_BKP表的結構相似於CUSTOMERS表。

SQL> INSERT INTO CUSTOMERS_BKP
     SELECT * FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS) ;

子查詢的UPDATE語句:

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

其基本語法如下:

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

示例:

假設,我們的CUSTOMERS_BKP表是CUSTOMERS表的備份。

下麵的例子是在CUSTOMERS表更新0.25倍薪水,其年齡大於或等於27所有的客戶:

SQL> UPDATE CUSTOMERS
     SET SALARY = SALARY * 0.25
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE >= 27 );

這將影響到兩行,最後CUSTOMERS表將有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |   125.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  2125.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

子查詢的DELETE語句:

子查詢可配合使用像上述的任何其他語句DELETE語句。

其基本語法如下:

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

示例:

假設,我們的CUSTOMERS_BKP表是CUSTOMERS表的備份。

下麵的示例將刪除CUSTOMERS表記錄其年齡大於或等於27所有的客戶:

SQL> DELETE FROM CUSTOMERS
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE > 27 );

這將影響到兩行,最後CUSTOMERS表將有以下記錄:

+----+----------+-----+---------+----------+
| ID | NAME     | AGE | ADDRESS | SALARY   |
+----+----------+-----+---------+----------+
|  2 | Khilan   |  25 | Delhi   |  1500.00 |
|  3 | kaushik  |  23 | Kota    |  2000.00 |
|  4 | Chaitali |  25 | Mumbai  |  6500.00 |
|  6 | Komal    |  22 | MP      |  4500.00 |
|  7 | Muffy    |  24 | Indore  | 10000.00 |
+----+----------+-----+---------+----------+