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

链接: https://www.fly63.com/course/32_1568