多表連接初步
引出
?思考如下問題筏养?
–寫一條查詢語(yǔ)句寻咒,查詢員工姓名谭胚、部門名稱徐块、工作地點(diǎn)?
寫一個(gè)查詢顯示員工姓名 員工編號(hào) 部門名稱 地址
笛卡爾積
selectemp.ename,emp.empno,emp.deptno,dept.deptno,dept.dname
from emp,dept
order by ename
--上述情況叫笛卡爾積現(xiàn)象
等值連接
利用關(guān)聯(lián)連接相等漏選掉多余數(shù)據(jù)
--多表連接實(shí)際上是利用意義相同的字段相同來漏選掉多余數(shù)據(jù)
select ename,empno,dname
from emp,dept
where emp.deptno=dept.deptno
order by ename
限制歧義別名
用 表名.列名
selectename,empno,emp.deptno,dept.deptno,dname
from emp,dept
where emp.deptno=dept.deptno
order by ename
練習(xí)1:
?1.寫一個(gè)查詢灾而,顯示所有員工姓名胡控,部門編號(hào),部門名稱旁趟。
?2.寫一個(gè)查詢铜犬,顯示所有工作在CHICAGO并且獎(jiǎng)金不為空的員工姓名,工作地點(diǎn)轻庆,獎(jiǎng)金
SELECT ename,loc,comm
from emp,dept
where emp.DEPTNO=dept.DEPTNO
and loc='CHICAGO'
and comm is not null;
?3.寫一個(gè)查詢癣猾,顯示所有姓名中含有A字符的員工姓名,工作地點(diǎn)余爆。
SELECT ename,loc FROM emp,dept
WHERE emp.deptno=dept.deptno
and INSTR(ename,'a')>0;
SELECT ename,loc FROM emp,dept
WHERE emp.deptno=dept.deptno
and ename like '%A%';
表別名
可以為表定義別名,上面的語(yǔ)句可以精簡(jiǎn)為:
兩種寫法 tablename as 別名 |tablename 別名
SELECT ename,loc,e.deptno
FROM emp as e,dept as d
WHERE e.deptno=d.deptno
and ename like '%A%';
多于兩個(gè)表的連接及非等值連接
查詢員工編號(hào)纷宇,員工姓名,工作崗位名稱蛾方,工作地點(diǎn)像捶,月工資,薪資等級(jí)
select e.empno,e.ename,e.job,d.LOC,e.sal,s.GRADE
from emp e,dept d,salgrade s
where e.deptno=d.DEPTNO
and e.sal BETWEEN s.LOSAL and s.HISAL;
多表連接的寫法
1桩砰、分析查詢結(jié)果都來自哪些表 產(chǎn)生from子句
2拓春、分析表之間的關(guān)聯(lián)條件 產(chǎn)生where子句(注意重復(fù)字段問題)
如果還有其他的限制條件上,就繼續(xù)向where子句中追加
3亚隅、如果涉及排序的硼莽,把order by寫上
4、分析要顯示哪些字段 產(chǎn)生select語(yǔ)句
自身連接
?思考:查詢每個(gè)員工的姓名和直接上級(jí)姓名煮纵?(把自己分身懂鸵,利用表別名)
查詢每個(gè)員工的姓名和直接上級(jí)姓名剪勿?
這種自已跟自己連接的寫法叫自身連接
select e.ename 員工姓名,m.ENAME 主管姓名
from emp e,emp m
where e.mgr=m.empno;
sql99寫法
美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)的SQL:1999標(biāo)準(zhǔn)的連接語(yǔ)法藕咏。
交叉連接(笛卡爾積)
select e.,d.
from emp e,dept d;
sql99寫法
select e.,d.
from emp e
cross join dept d;
例子:
a表 學(xué)生表(a,b,c,c)
b表 課程(java,oracle,jquery,c)
每個(gè)班的學(xué)生的選課系統(tǒng)
NATURAL JOIN 自然連接(了解,兩種寫法對(duì)比寫)
缺點(diǎn):無法控制用哪些字段連接衣撬。
兩個(gè)表里字段名相同的酿联,自動(dòng)加到連接條件里终息。
select e.,d.
from emp e,dept d
where e.deptno=d.deptno;
等價(jià)sql99寫法
select e.,d.
from emp e
NATURAL join dept d;
自然連接時(shí)是利用字段名稱和類型都相同的字段進(jìn)行連接夺巩。
用using子句(建議了解)
(可以控制用哪些字段進(jìn)行連接)
用using子句的寫法,指定用哪個(gè)字段將兩個(gè)表連接起來周崭。
select e.,d.
from emp e
join dept d using (deptno);
外連接(重點(diǎn)掌握)
引出:查詢所有員工的姓名及其主管姓名劲够,沒有主管的也要顯示出來
左外連接
(以左邊為基準(zhǔn),顯示左邊所有數(shù)據(jù)休傍,如果右邊沒有對(duì)應(yīng)數(shù)據(jù),就補(bǔ)充一個(gè)空數(shù)據(jù))
from emp e,emp m
查詢所有員工的姓名及其主管姓名蹲姐,沒有主管的也要顯示出來
select e.ENAME,m.ENAME
from emp e
LEFT OUTER JOIN emp m
on e.mgr=m.empno;
結(jié)果是:沒有主管的也能顯示出數(shù)據(jù)
右外連接
查詢所有雇員姓名磨取,部門編號(hào),部門名稱柴墩,包括沒有員工的部門也要顯示出來
select e.ENAME,d.DEPTNO,d.DNAME
from emp e
right join dept d
on e.deptno=d.deptno;
where連接條件注意事項(xiàng)
–在 WHERE子句中書寫連接條件忙厌。
–如果在多個(gè)表中出現(xiàn)相同的列名,則需要使用表名作為來自該表的列名的前綴江咳。
–N個(gè)表相連時(shí)逢净,至少需要N-1個(gè)連接條件。
練習(xí)4
?使用SQL-99寫法歼指,完成如下練習(xí)
?1.創(chuàng)建一個(gè)員工表和部門表的交叉連接爹土。
select e.,d.
from emp e cross join dept d;
2.使用自然連接,顯示入職日期在80年5月1日之后的員工姓名踩身,部門名稱胀茵,入職日期
select e.ENAME,d.DNAME,e.HIREDATE
from emp e
NATURAL join dept d
where e.hiredate>'1980-05-01';
作業(yè)
練習(xí)2
?1.查詢每個(gè)員工的編號(hào),姓名挟阻,工資琼娘,工資等級(jí),所在工作城市附鸽,按照工資等級(jí)進(jìn)行升序排序脱拼。
select empno,ename,sal,salgrade.grade,dept.loc
from emp,dept,salgrade
where emp.deptno=dept.deptno
and sal between losal and hisal
order by salgrade.grade
練習(xí)3
?1.查詢所有工作在NEW YORK和CHICAGO的員工姓名,員工編號(hào)坷备,以及他們的經(jīng)理姓名熄浓,經(jīng)理編號(hào)。
select e.ename,e.empno,m.ename,m.empno,loc
from emp e,emp m,dept d
where e.mgr = m.empno
and e.deptno=d.deptno
and (loc = 'NEW YORK' or loc = 'CHICAGO')
練習(xí)4
3.使用USING子句省撑,顯示工作在CHICAGO的員工姓名玉组,部門名稱,工作地點(diǎn)
select ename,dname,loc
from emp
join dept
using(deptno)
where loc = 'CHICAGO'
4.使用ON子句丁侄,顯示工作在CHICAGO的員工姓名惯雳,部門名稱,工作地點(diǎn)鸿摇,薪資等級(jí)
select ename,dname,loc,grade
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on sal between losal and hisal
where loc = 'CHICAGO'
5.使用左連接石景,查詢每個(gè)員工的姓名,經(jīng)理姓名,沒有經(jīng)理的King也要顯示出來潮孽。
select e.ename,m.ename
from emp e
left join emp m
on e.mgr = m.empno
?6.使用右連接揪荣,查詢每個(gè)員工的姓名,經(jīng)理姓名往史,沒有經(jīng)理的King也要顯示出來仗颈。
課后作業(yè)
3.顯示員工KING和FORD管理的員工姓名及其經(jīng)理姓名。
select e.empno,e.ename,m.ename
from emp e,emp m
where
(e.mgr=m.empno and e. mgr in(select empno from emp where ename in('KING','FORD') ))