SQL 子查詢

2020-12-04 09:05 更新

SQL 子查詢


 子查詢(Sub Query)或者說(shuō)內(nèi)查詢(Inner Query),也可以稱作嵌套查詢(Nested Query),是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢。

 子查詢用于為主查詢返回其所需數(shù)據(jù),或者對(duì)檢索數(shù)據(jù)進(jìn)行進(jìn)一步的限制。

 子查詢可以在 SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句中,同 =、<、>、>=、<=、IN、BETWEEN 等運(yùn)算符一起使用。

 使用子查詢必須遵循以下幾個(gè)規(guī)則:

  • 子查詢必須括在圓括號(hào)中。
  • 子查詢的 SELECT 子句中只能有一個(gè)列,除非主查詢中有多個(gè)列,用于與子查詢選中的列相比較。
  • 子查詢不能使用 ORDER BY,不過(guò)主查詢可以。在子查詢中,GROUP BY 可以起到同 ORDER BY 相同的作用。
  • 返回多行數(shù)據(jù)的子查詢只能同多值操作符一起使用,比如 IN 操作符。
  • SELECT 列表中不能包含任何對(duì) BLOB、ARRAY、CLOB 或者 NCLOB 類型值的引用。
  • 子查詢不能直接用在聚合函數(shù)中。
  • BETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中。

SELECT 語(yǔ)句中的子查詢


 通常情況下子查詢都與 SELECT 語(yǔ)句一起使用,其基本語(yǔ)法如下所示:

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 |
+----+----------+-----+-----------+----------+

 現(xiàn)在,讓我們?cè)囈幌略?SELECT 語(yǔ)句中進(jìn)行子查詢:

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

 上述語(yǔ)句的執(zhí)行結(jié)果如下所示:

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

INSERT 語(yǔ)句中的子查詢:


 子查詢還可以用在 INSERT 語(yǔ)句中。INSERT 語(yǔ)句可以將子查詢返回的數(shù)據(jù)插入到其他表中。子查詢中選取的數(shù)據(jù)可以被任何字符、日期或者數(shù)值函數(shù)所修飾。

 其基本語(yǔ)法如下所示:

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

示例:


 考慮與 CUSTOMERS 表?yè)碛邢嗨平Y(jié)構(gòu)的 CUSTOMERS_BKP 表?,F(xiàn)在要將 CUSTOMER 表中所有的數(shù)據(jù)復(fù)制到 CUSTOMERS_BKP 表中,代碼如下:

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

UPDATE 語(yǔ)句中的子查詢:


 子查詢可以用在 UPDATE 語(yǔ)句中。當(dāng)子查詢同 UPDATE 一起使用的時(shí)候,既可以更新單個(gè)列,也可更新多個(gè)列。

 其基本語(yǔ)法如下:

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

示例:


 假設(shè)我們有一份 CUSTOMERS_BKP 表作為 CUSTOMERS 表的備份。

 下面的示例將 CUSTOMERS 表中所有 AGE 大于或者等于 27 的客戶的 SALARY 字段都變?yōu)榱嗽瓉?lái)的 0.25 倍:

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

 這將影響兩行數(shù)據(jù),隨后 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 語(yǔ)句中的子查詢:


 如同前面提到的其他語(yǔ)句一樣,子查詢還可以同 DELETE 語(yǔ)句一起使用。

 其基本語(yǔ)法如下所示:

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

示例:


 假設(shè)我們有一份 CUSTOMERS_BKP 表作為 CUSTOMERS 表的備份。

 下面的示例將從 CUSTOMERS 表中刪除所有 AGE 大于或者等于 27 的記錄:

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

 這將影響兩行數(shù)據(jù),隨后 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 |
+----+----------+-----+---------+----------+


章節(jié)小測(cè)


 現(xiàn)在,通過(guò)以下題目測(cè)測(cè)看您對(duì)“SQL 子查詢”的掌握程度吧!

 SQL 子查詢:在本部分測(cè)驗(yàn)中,您將練習(xí)使用 SQL 子查詢。

 點(diǎn)擊此處進(jìn)行測(cè)試>>

注:以上測(cè)試為付費(fèi)測(cè)試,高級(jí)VIP免費(fèi)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)