一资厉、基本概念
1.多表查詢就必須消除兩張表之間存在的笛卡爾積厅缺,使用一個條件語句消除笛卡爾積,可以使用別名表達。
①要求顯示每個雇員的編號宴偿、姓名湘捎、職位、工 資窄刘、部門名稱窥妇、部門位置。
select e.empno,e.ename,e.job,e.sal ,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno;
②查詢雇員的編號娩践、姓名活翩、職位、工資翻伺、工資等級
select e.empno,e.ename,e.job,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
③查詢每個雇員的編號材泄、姓名、職位吨岭、工資拉宗、工資等級、部門名稱
select e.empno,e.ename,e.job,e.sal,s.grade,d.dname
from emp e,salgrade s,dept d
where e.sal between s.losal and s.hisal and e.deptno=d.deptno;
總結:沒有關聯(lián)字段或者關聯(lián)條件的兩張數(shù)據(jù)表是永遠不可能實現(xiàn)多表查詢的辣辫,復雜的查詢分步驟進行旦事。
二、表的連接
主要分為兩種形式:
內(nèi)連接(等值連接):所有滿足條件的數(shù)據(jù)都會被顯示出來急灭。
外連接(左外連接姐浮、右外連接、全外連接):控制左表和右表的數(shù)據(jù)是否全部顯示葬馋。
左外連接:字段+字段(+)卖鲤;
右外連接:字段(+)+字段肾扰;
①先插入一條數(shù)據(jù)測試
insert into emp(empno,ename,job)values(0001,'老張','CLERK');
②左連接
select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno(+);
③右連接
select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e,dept d
where e.deptno(+) = d.deptno;
如果發(fā)現(xiàn)查詢的數(shù)據(jù)不完成,就使用外連接來控制扫尖,不要刻意的去管是左連接還是右連接白对,只要能完成顯示數(shù)據(jù)就行。
三换怖、SQL:1999語法支持
“(+)”只有oracle才有,所以可以利用SQL:1999語法來實現(xiàn)查詢蟀瞧。
基本語法如下:
select [distinct]* | 列 [別名]
from 表名稱1
[cross join 表名稱2]
[natural join 表名稱2]
[join 表名稱 on(條件) | using(字段)]
[left | right | full outer join 表名稱2];
①cross join 交叉連接沉颂,主要用于產(chǎn)生笛卡爾積,簡單實現(xiàn)多表查詢
select* from emp cross join dept;
②natural join 自然連接,主要用于消除笛卡爾積
select* from emp natural join dept;
③using 如果說一張表內(nèi)有多個關聯(lián)字段存在悦污,那么可以使用using
select* from emp join dept using(deptno);
④on 子句铸屉,沒有關聯(lián)字段,則可以使用on設置條件
select*
from emp e join salgrade s
on (e.sal between s.losal and s.hisal);
⑤外連接
(1)左外連接
select* from emp left outer join dept using(deptno);
②右連接
select* from emp right outer join dept using(deptno);
③全外連接
select* from emp full outer join dept using(deptno);
四切端、數(shù)據(jù)的集合操作
將多個查詢結果連接為一個查詢結果返回
①union 將連個查詢結果合并在一起
select empno,ename,job from emp where deptno=10 union select empno,ename,job from emp;
②union all 所有重復的數(shù)據(jù)都會顯示出來
select empno,ename,job,deptno from emp where deptno=10 union all select empno,ename,job,deptno from emp;
③intersect 返回相同的部分彻坛,屬于交集操作
select empno,ename,job from emp where deptno=10 intersect select empno,ename,job from emp;
④minus 返回差集,是用第一個集合減去第二個集合
select empno,ename,job from emp minus select empno,ename,job from emp where deptno=10;
總結:只要是多表查詢就一定存在笛卡爾積踏枣,無法消除昌屉,一定存在一個或多個關聯(lián)字段,否則無法查詢茵瀑。