多表聯合查詢:須要獲取的數據分佈在多張表中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;