24.1什么是子查询
子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他SQL查询的WHERE子句中的查询。
子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
子查询可以在SELECT、INSERT、UNDATE和DELETE语句中,同=、<、>、>=、<=、IN、BETWEEN等运算符一起使用。
使用子查询必须遵循以下几个规则:
· 子查询必须括在圆括号中。
· 子查询的SELECT子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列想比较。
· 子查询不能使用ORDER BY,不过主查询可以,在子查询中,GROUP BY可以起到同ORDER BY相同的作用。
· 返回多行数据的子查询只能同多值操作符一起使用,比如IN操作符。
· SELECT列表中不能包含任何对BLOB、ARRAY、CLOB或者NCLOB类型值得引用。
·子查询不能直接用在集合函数中。
· BETWEEN操作符不能同子查询一起使用,但是BETWEEN操作符可以用在子查询中。
24.2 SELECT子查询语句
通常情况下子查询都与SELECT语句一起使用,其基本语法如下所示:
SELECT column_name [,column_name] FROM table1 [,table2] WHERE column_name OPERATION ( SELECT column_name [,column_name] FROM table1 [,table2] [WHERE] )
示例数据库中有“Customers”表和“Orders”表
在SELECT语句中进行子查询:
SELECT * FROM Customers WHERE 客户 ID IN ( SELECT 客户 ID FROM Orders WHERE 员工 ID=9 );
24.3 INSERT子查询语句
子查询还可以用在INSERT语句中。INSERT语句可以将子查询查询返回的数据插入到其他表中。子查询中选取的数据可以被任何字符、日期或者数值函数所修饰。
其基本语法如下所示:
INSERT INTO table_name [(column1 [,column2])] SELECT [* |column1 [,column2] FROM table [,table2] [WHERE VALUE OPERATION] ]
示例:考虑与Customers表拥有相似结构的Customer_bak表。现在要将上面查询的结果插入到Customers_bak表中
INSERT INTO Customers_bak SELECT * FROM Customers WHERE 客户 ID IN ( SELECT 客户 ID FROM Orders WHERE 员工 ID=9);
24.4 UNDATE子查询语句
子查询可以用在UNDATE语句中。当子查询同UPDATE一起使用的时候,既可以更新单个列,也可以更新多个列。
其基本语法如下:
UNDATE table SET column_name=new_value [WHERE OPERATION [VALUE] (SELECT column_name FROM table-name) [WHERE] ]
示例:
将“Customers”表中在“Orders”表里有发货的客户,他们所在的城市要加一个“市”字
UPDATE Customers SET 城市=城市+‘市‘ WHERE 客户 ID IN (SELECT 客户 ID FROM Orders);
24.5 DELETE子查询语句
如同前面提到的其他语句一样,子查询还可以同DELETE语句一起使用。
其基本语法如下:
DELETE FROM table_name [WHERE OPERATOR [VALUE] (SELECT column_name FROM table_name) [WHERE] ]
示例:删除在“Orders”表中有购买记录的客户信息
DELETE FROM Customers WHERE 客户 ID IN (SELECT 客户 ID FROM Orders);
24.6 批注
原则上子查询嵌套不要超过三层。超过的话可以考虑使用临时表将子查询结果先保存,再和其他查询进行关联。
原文:https://www.cnblogs.com/yongzhao/p/14900778.html