1. 程式人生 > 其它 >Oracle筆記11——Oracle集合運算

Oracle筆記11——Oracle集合運算

1.建立員工歷史崗位表 emp_jobhistory:
CREATE TABLE emp_jobhistory(
    id NUMBER,--流水號
    empno NUMBER,--員工編號
    job VARCHAR2(9),--崗位
    begindate DATE,--開始日期
    sal Number(7,2)--在該崗位時工資
)

2.插入如下資料:
INSERT INTO emp_jobhistory VALUES(1,7839,'TRAINEE','17-11月-81',500);
INSERT INTO emp_jobhistory VALUES(2,7839
,'SALESMAN','17-2月-82',1800); INSERT INTO emp_jobhistory VALUES(3,7839,'CLERK','17-2月-83',2000); INSERT INTO emp_jobhistory VALUES(4,7839,'SALESMAN','17-2月-85',1800); INSERT INTO emp_jobhistory VALUES(5,7839, 'MANAGER','17-2月-87',3000); commit;

一、聯合運算(UNION)

1.去重複

2.預設第一列升序排序

3.所有SQL語句的列數一致、型別一致、列名可以不一致,預設使用第一個SQL語句作為列名

4.每個SQL語句不能有自己的order by語句

1.查詢編號為7839的員工當前工資、崗位及歷史工資、崗位?
SELECT * FROM emp WHERE empno = 7839;           --7839的員工當前工資、崗位
SELECT * FROM emp_jobhistory WHERE empno = 7839;--7839的員工歷史工資、崗位

--多表連線(不適用)
SELECT * FROM emp e,emp_jobhistory h WHERE e.empno = h.empno;

--聯合運算
SELECT empno 僱員編號,sal 工資,job 崗位 FROM
emp WHERE empno = 7839 --7839的員工當前工資、崗位 1條資料 UNION SELECT empno,sal,job FROM emp_jobhistory WHERE empno = 7839 ORDER BY 崗位;--7839的員工歷史工資、崗位 5條資料

二、完全聯合運算(UNION ALL)

1.不去重複

2.不排序

3.所有SQL語句的列數一致、型別一致、列名可以不一致,預設使用第一個SQL語句作為列名

4.每個SQL語句不能有自己的order by語句

5.完全聯合運算(UNION ALL)效率高於聯合運算(UNION),因為UNION ALL不需要去重,也不需要排序

1.查詢編號為7839的員工當前工資、崗位及歷史工資、崗位,要求不要去除重複資料
--完全聯合運算
SELECT empno 僱員編號,sal 工資,job 崗位 FROM emp WHERE empno = 7839       --7839的員工當前工資、崗位   1條資料
UNION ALL
SELECT empno,sal,job FROM emp_jobhistory WHERE empno = 7839 ORDER BY 崗位;--7839的員工歷史工資、崗位   5條資料

三、相交運算(INTERSECT)

取多個SQL語句之間的共有資料

1.查詢哪些員工做過崗位調動?
SELECT empno FROM emp--所有的員工
INTERSECT
SELECT empno FROM emp_jobhistory;--呼叫過的員工編號

四、相減運算(MINUS)

取A-B的資料,即第一個SQL有,第二個SQL沒有的資料

1.查詢哪些員工沒有做過崗位調動?
SELECT empno FROM emp--所有的員工
MINUS
SELECT empno FROM emp_jobhistory;--呼叫過的員工編號