数据库-使用子查询,组合查询

子查询、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,这样即使重复的行他也不会消除了。

在嵌套查询中我们还可以用ANYALLEXISTS来确定子查询返回的值

  • ANY表示其中一个
  • ALL表示全部所有
  • EXISTS表示内层返回值则为真,内层不返回值为假

Posts in this Series