- A+
-- 使用集合操作符 ----
--4个:union union all 、intersect、minus
--集合操作就是按照特定的规则,将两个查询的结果集合并成一个
--所有的集合操作必须满足:
--要合并的两个查询的select列表必须在数量上以及相应列的数据类型上保持一致。
--1、union
--直接将两个查询的结果集合并在一起
--特点:
--1)会去掉两个结果集中的重复行
--2)最终结果集默认以第一个查询的第一个列做升序排序
--查询所有雇员当前的和曾经干过的工作
SELECT employee_id,job_id
FROM employees
UNION
SELECT employee_id,job_id
FROM job_history;
--2、union all
--直接将两个查询的结果集合并在一起
--特点:
--1)不会去掉两个结果集中的重复行
--2)最终结果集不排序
--查询所有雇员当前的和曾经干过的工作和部门
SELECT employee_id,job_id,department_id
FROM employees
UNION ALL
SELECT employee_id,job_id,department_id
FROM job_history
order by employee_id;
--3、intersect:交集
--返回两个查询结果集中的重复行
--特点:
--1)最终结果集默认以第一个查询的第一个列做升序排序
--查询现在干的工作和曾经换过的某个工作相同的雇员的信息
SELECT employee_id,job_id
FROM employees
intersect
SELECT employee_id,job_id
FROM job_history;
--4、minus:减
--从第一个查询的结果集中减去第二个查询结果集中的重复行,第一个查询结果集中剩下的
--行就是所要的
--特点:
--1)最终结果集默认以第一个查询的第一个列做升序排序
--查询从未换过工作的雇员的编号
SELECT employee_id
FROM employees
minus
SELECT employee_id
FROM job_history;
-- 手工匹配select列表 ---
--问题:以下两个查询能否直接合并?
SELECT location_id,department_name
from departments;
SELECT location_id,state_province
FROM locations;
--不能直接合并。因为department_name和state_province列的业务含义不一样,
--直接合并在一起显示,会造成混淆。
--解决办法:把业务含义不一样的列错开,在原来的位置上补字面量null或者0(根据
--列的数据类型)
SELECT location_id,department_name,to_char(null) state_province
FROM departments
union
SELECT location_id, to_char(null) ,state_province
FROM locations;
--注意:最终结果集的列标题是由第一个查询的select列表决定的,和第二个查询的
--列名没有任何关系
--使用order by子句--
--只能写在最后面的查询中。
本文由 路远 首发于【路远网(http://www.luyuan.io)】未经允许不得以任何方式转载,违者必将追究法律责任。
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫