UNION
之前学习了连接,因此我们掌握了结合多张表列的方法
今天学习如何结合多张表的行
案例一
首先,原始表格如下
现在我们针对表格中的“order_date”的具体日期,来为每一行的order进行标签,即新增一列来描述其状态,如active
代码
SELECT
order_id,
order_date,
'Active' AS status
FROM orders
WHERE order_date >= '2019-01-01'
结果
然后为其它订单日期的行也赋予archive状态
代码
SELECT
order_id,
order_date,
'Archived' As status
FROM orders
WHERE order_date < '2019-01-01'
结果
使用UNION连接上述两个代码的返回列表
代码
SELECT
order_id,
order_date,
'Active' As status
FROM orders
WHERE order_date >= '2019-01-01'
UNION
SELECT
order_id,
order_date,
'Archived' As status
FROM orders
WHERE order_date < '2019-01-01'
结果
案例二
刚刚上述操作是基于同一个表格实现的
现在我们基于不同的表格写查询,并将结果合并到一个结果集
代码
SELECT first_name
FROM customers
UNION
SELECT name
FROM shippers
结果
注意
1 查询返回的列的数量一定要一样,否则报错
示例
SELECT first_name,last_name
FROM customers
UNION
SELECT name
FROM shippers
2 查询返回的列的数量一定要一样,否则报错
如果两次查询返回的列名不一致,则使用UNION后返回的列名以第一个列表返回列名为主
练习
使得查询后,返回customer表如下数据
SELECT
customer_id,
first_name,
points,
'Bronze' AS type
From customers
WHERE points <= 2000
UNION
SELECT
customer_id,
first_name,
points,
'Silver' AS type
From customers
WHERE points BETWEEN 2000 AND 3000 --WHERE 3000 >= points >2000 这样是错误表示!
UNION
SELECT
customer_id,
first_name,
points,
'Gold' AS type
From customers
WHERE points > 3000
如果想要列表按照type的gold、silver、bronze排序的话,可以在上述代码最后插入一段:
order by points DESC
或者在编写代码时,就按顺序写