Oracle【多表查詢操做(SQL92&SQL99)】

多表聯合查詢:須要獲取的數據分佈在多張表中ide

SQL92:
測試

1 --笛卡爾積:將多個表的數據進行一一對應,所得的結果爲多表的笛卡爾積
2 select * from emp;
3 select * from dept;
4 select * from emp,dept;--進行全排列 14*5=70

 1 --等值鏈接:先笛卡爾積,而後篩選,篩選條件爲等值篩選
 2  --查詢員工的姓名,工做,薪資,部門名稱
 3  --可直接在select子句中使用字段獲取數據,但效率低,建議字段前明確表名
 4 select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--效率低
 5  --兩張表存在的公衆字段,必須明確表名:emp.deptno=dept.deptno
 6 select emp.ename,emp.job,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;--效率高  
 7  --給表添加別名(推薦)
 8 select e.ename,e.job,e.sal,d.dname
 9 from emp e,dept d
10 where e.deptno=d.deptno;

1 --查詢員工的姓名,工做,工資,工資等級
2 select e.ename,e.job,e.sal,s.grade
3 from emp e,salgrade s
4 where e.sal>=s.losal and e.sal<=s.hisal;

1 --自鏈接
2  --查詢員工的姓名,工做,薪資,及上級領導的姓名
3 select e1.ename,e1.job,e1.sal,e2.ename
4 from emp e1,emp e2
5 where e1.mgr=e2.empno;
6 ----------------下面SQL可詳細查看到對應的領導姓名詳情-------------------
7 select e1.empno,e1.ename,e1.job,e1.sal,e1.mgr,e2.ename
8 from emp e1,emp e2
9 where e1.mgr=e2.empno;



外鏈接:左外鏈接&&右外鏈接spa

1 --左外連接
2  --查詢員工的姓名,工做,薪資,部門名稱及沒有部門的員工信息(刪除SMITH的部門編號測試)
3 select e.ename,e.job,e.sal,d.dname
4 from emp e,dept d
5 where e.deptno=d.deptno(+);

1 --右外鏈接
2  --查詢員工的姓名,工做,薪資,部門名稱及沒有員工的部門信息
3 select e.ename,e.job,e.sal,d.dname
4 from emp e,dept d
5 where e.deptno(+)=d.deptno;

SQL99:
1:可給表添加別名
2:若是使用on或者usering關鍵字對結果進行篩選,必須使用inner join做爲表與表的鏈接,其中inner可缺省
3:外鏈接的outer可缺省
4:依然能夠使用分組,having,排序等。
3d

1 --笛卡爾積:使用關鍵字 cross join
2  --select * from 表名1 cross join 表名2;
3 select * from emp cross join dept;

1 --篩選
2  --天然鏈接:使用關鍵字 natural join
3  --特色1:底層先笛卡爾積,而後按照全部同名同值字段自動進行等值篩選
4  --查詢員工的姓名,工做,薪資,部門名稱
5 select e.ename,e.job,e.sal,d.dname from emp e natural join dept d;

問題1:若是隻想按照部分字段結束篩選?
解決1:使用using關鍵字
做用1:指明使用指定的字段對聯合查詢的結果進行等值篩選
注意1:指明字段必須是兩表的同名同值字段
使用:select * from 表名 inner join 表名 using(字段名1,字段名2...);code

1 --查詢員工的姓名,工做,薪資,部門名稱
2 select emp.ename,emp.job,emp.sal,dept.dname 
3 from emp 
4 inner join dept using(deptno);

問題2:若是按照字段名不一樣,可是值相同進行等值篩選?
解決2:使用on關鍵字進行自定義條件篩選(等值,不等值)
注意1:普通篩選條件使用where進行篩選,不要使用on。(增長SQL語句的閱讀性)
使用:select 內容 from 表名 inner join 表名 on 鏈接條件 where 普通篩選條件;blog

1 --查詢員工的姓名,工做,薪資,部門名稱並工資大於等於2000
2 select emp.ename,emp.job,emp.sal,dept.dname 
3 from emp 
4 inner join dept 
5 on emp.deptno=dept.deptno where sal>=2000;



外連接
--左外鏈接:select 內容 from 表名 left outer join 表名 on 鏈接條件排序

1 --查詢員工的姓名,工做,薪資,部門名稱及沒有部門的員工信息(刪除SMITH的部門編號測試) 
2 select e.ename,e.job,e.sal,d.dname 
3 from emp e 
4 left outer join dept d 
5 on e.deptno=d.deptno;


--右外鏈接:select 內容 from 表名 right outer join 表名 on 鏈接條件it

1 --查詢員工的姓名,工做,薪資,部門名稱及沒有員工的部門信息
2 select e.ename,e.job,e.sal,d.dname 
3 from emp e 
4 right outer join dept d 
5 on e.deptno=d.deptno;
1 --全外鏈接:select 內容 from 表名 full outer join 表名 on 鏈接條件
2 select e.ename,e.job,e.sal,d.dname 
3 from emp e 
4 full outer join dept d 
5 on e.deptno=d.deptno;
1 --自連接:
2   --查詢員工的姓名,工做,薪資,及上級領導的姓名
3 select e1.ename,e1.job,e1.sal,e2.ename 
4 from emp e1 
5 inner join emp e2 
6 on e1.mgr=e2.empno;



SQL92 && SQL99 詳細比對:event

 1 -------------------------------------------------- SQL92 && SQL99 詳細比對 --------------------------------------------------
 2 --SQL92
 3  --笛卡爾積
 4 select * from emp,dept;--進行全排列 
 5 --SQL99
 6  --笛卡爾積:使用關鍵字 cross join
 7 select * from emp cross join dept;
 8 
 9 
10 --SQL92
11  --等值鏈接
12  --查詢員工的姓名,工做,薪資,部門名稱
13 select e.ename,e.job,e.sal,d.dname
14 from emp e,dept d
15 where e.deptno=d.deptno;
16 --SQL99
17  --天然鏈接:使用關鍵字 natural join
18  --查詢員工的姓名,工做,薪資,部門名稱
19 select e.ename,e.job,e.sal,d.dname 
20 from emp e 
21 natural join dept d;
22  --查詢員工的姓名,工做,薪資,部門名稱
23 select emp.ename,emp.job,emp.sal,dept.dname 
24 from emp 
25 inner join dept using(deptno);
26 
27 
28 --SQL92
29  --不等值鏈接
30  --查詢員工的姓名,工做,工資,工資等級
31 select e.ename,e.job,e.sal,s.grade
32 from emp e,salgrade s
33 where e.sal>=s.losal and e.sal<=s.hisal;
34 --SQL99
35  --查詢員工的姓名,工做,工資,工資等級
36 select e.ename,e.job,e.sal,s.grade
37 from emp e
38 natural join salgrade s 
39 where e.sal>=s.losal and e.sal<=s.hisal;
40 
41 
42 --SQL92
43  --自鏈接
44  --查詢員工的姓名,工做,薪資,及上級領導的姓名
45 select e1.ename,e1.job,e1.sal,e2.ename
46 from emp e1,emp e2
47 where e1.mgr=e2.empno;
48 --SQL99
49  --查詢員工的姓名,工做,薪資,及上級領導的姓名
50 select e1.ename,e1.job,e1.sal,e2.ename 
51 from emp e1 
52 inner join emp e2 
53 on e1.mgr=e2.empno;
54 
55 
56 --SQL92
57  --左外連接
58  --查詢員工的姓名,工做,薪資,部門名稱及沒有部門的員工信息(刪除SMITH的部門編號測試)
59 select e.ename,e.job,e.sal,d.dname
60 from emp e,dept d
61 where e.deptno=d.deptno(+);
62 --SQL99
63 select e.ename,e.job,e.sal,d.dname
64 from emp e
65 left outer join dept d 
66 on e.deptno=d.deptno
67 
68 
69 --SQL92
70  --右外鏈接
71  --查詢員工的姓名,工做,薪資,部門名稱及沒有員工的部門信息
72 select e.ename,e.job,e.sal,d.dname
73 from emp e,dept d
74 where e.deptno(+)=d.deptno;
75 --SQL99
76 select e.ename,e.job,e.sal,d.dname 
77 from emp e 
78 right outer join dept d 
79 on e.deptno=d.deptno;
80 
81 
82 --SQL99
83  --全外鏈接:select 內容 from 表名 full outer join 表名 on 鏈接條件
84 select e.ename,e.job,e.sal,d.dname 
85 from emp e 
86 full outer join dept d 
87 on e.deptno=d.deptno;
SQL92 && SQL99 詳細比對
相關文章
相關標籤/搜索