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语句一起使用。基本语法如下:
示例
考虑以下记录的CUSTOMERS表 –
现在,让我们使用SELECT语句检查以下的子查询。
这将产生以下结果。
在INSERT语句中使用子查询
子查询也可以与INSERT语句一起使用。INSERT语句使用从子查询返回的数据插入到另一个表中。子查询中选定的数据可以使用任何字符、日期或数字函数进行修改。
基本语法如下。
示例
假设有一个与CUSTOMERS表结构类似的表CUSTOMERS_BKP。现在要将完整的CUSTOMERS表复制到CUSTOMERS_BKP表中,您可以使用以下语法。
UPDATE语句中的子查询
子查询可以与UPDATE语句一起使用。在使用UPDATE语句时,可以更新表中的一个或多个列。
基本语法如下所示。
示例
假设我们有一个名为CUSTOMERS_BKP的表,这是CUSTOMERS表的备份。以下示例将更新CUSTOMERS表中年龄大于或等于27岁的所有客户的工资,将其增加0.25倍。
这将影响两行,最终 CUSTOMERS 表将有以下记录。
使用DELETE语句的子查询
与上面提到的其他语句一样,子查询可以与DELETE语句一起使用。
基本语法如下所示。
示例
假设我们有一个备份了CUSTOMERS表的CUSTOMERS_BKP表可用。下面的示例会删除CUSTOMERS表中年龄大于等于27的所有客户的记录。
这将影响两行,并最终CUSTOMERS表将具有以下记录。