数据库-使用子查询,组合查询
子查询、UNION 、 INTERSECT 、 EXCEPT
数据库中是允许子查询的,也就是嵌套在其他查询中的查询。
利用子查询进行过滤
当我们想在另一表中过滤一些条件时我们就用到了子查询 例如:
SELECT cust_id
FROM Orders
WHERE order_num IN (
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'
);
在这个查询语句当中我们先查询OrderItems表中的数据,当查找完成后带回到主查询语句中完成查询并输出。
当然也并不是只能插入一个子查询,可以在子查询的WHERE
中再嵌套一个子查询。
而且我们也可以将其作为计算字段使用子查询 例如:
SELECT cust_name, cust_state, (SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id
) AS orders
FROM Customers
ORDER BY cust_name;
使用 UNION 、 INTERSECT 、 EXCEPT
更多的是用在自己和自己查询中使用。
使用这三种子句,这三种子句类似于数学当中的并集,交集,差集。
都是将不同的SELECT
语句组合起来。
UNION
是将不同的SELECT
语句,检查出来的结果做并集处理,简单来说就是将不同的SELECT
语句检索出来的信息组合到一起输出。 例如:SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_stste IN ('IL','IN','MI') UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_name = 'Fun4All' ORDER BY cust_name, cust_contact;
INTERSECT
是将不同的SELECT
语句检索出来的信息做交集处理并输出出来,就是找出两条语句检索出来的信息相同的地方输出出来。EXCEPT
是将不同的SELECT
语句检索出来的信息做差集处理并输出出来,就是将第一条语句中和第二条语句相同的地方删除将然后输出显示。
在组合查询中的ORDER BY
子句只能在最后一个SELECT
语句中出现,只允许排序一次,并不允许产生多次排序的问题。
如果单使用UNION
则DBMS会消除重复的行,如果并不想让给他消除可以使用UNION ALL
,这样即使重复的行他也不会消除了。
在嵌套查询中我们还可以用ANY
、ALL
、EXISTS
来确定子查询返回的值
ANY
表示其中一个ALL
表示全部所有EXISTS
表示内层返回值则为真,内层不返回值为假