1. UNION、UNION ALL
UNION 关键字的作用?
合并两个或多个 SELECT 语句的结果。发挥的作用与 or 非常相似
UNION关键字生效的前提?
- 每个 SELECT 语句必须拥有相同数量的列。
- 每个 SELECT 语句中的列的顺序必须相同。
- 列必须拥有相似的数据类型。
SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;
UNION、UNION ALL的区别?
union 会对合并之后的查询结果集进行去重操作。
union all 是直接将查询结果集合并,不进行去重操作。
因此,union all 和 union 都可以完成的话,优先选择 union all,因为其不需要去重,所以效率高一些。
UNION 后的结果集格式?
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
1.1 实例
数据库中有两张表,结构如图
需求:查询两个表中的 conutry,并去重
分析:将两表查出的 conutry 进行 union。
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
从两表中选取所有的 conutry 为中国(CN)的数据(不去重):
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
2. EXISTS
EXISTS 运算符用于判断查询子句是否有记录,如果查询子句存在记录则返回 True,否则返回 False。
更具体来说,采用的是一种轮询的做法
案例:订单信息保存在 t_order 表中,顾客信息保存在 t_customer 表中。现在我们要查询有过订单的顾客信息
#对于t_customer表中的每行记录,EXISTS子查询都会执行一次,去检查t_order表中是否存在至少一条记录,其customer_id与当前t_customer表中的customer_id相匹配。
#当EXISTS子查询找到至少一条匹配的订单记录时,即o.customer_id = c.customer_id为真的情况下,子查询的结果是TRUE。
#这个TRUE结果会被外层的WHERE子句接收,因此WHERE EXISTS (...)条件得到满足,这意味着当前正在检查的t_customer表中的这一行记录将被视为满足查询条件。
#因此,t_customer表中所有拥有至少一个相关订单记录的客户行都会被包含在外层查询的最终结果集中。
select *
from t_customer c
where exists(select * from t_order o where o.customer_id=c.customer_id);
案例:查询没有下过订单的顾客信息
select *
from t_customer c
where not exists(select * from t_order o where o.customer_id=c.customer_id);