MySql中的資料查詢語言(DQL)三:連線查詢
技術標籤:C_資料庫階段C1_MySql資料庫javamysql
一、概念
1、什麼是連線查詢?
連線查詢:也可以叫跨表查詢,需要關聯多個表進行查詢
在實際開發中,大部分的情況下都不是從單表中查詢資料,一般都是多張表聯合查詢取出最終的結果。
在實際開發中,一般一個業務都會對應多張表,比如:學生和班級,起碼兩張表。
學生和班級資訊儲存到一張表中,結果就像上面一樣,資料會存在大量的重複,導致資料的冗餘。
2、連線查詢的分類?
根據語法出現的年代來劃分的話,包括:
SQL92(一些老的DBA可能還在使用這種語法。DBA:DataBase Administrator,資料庫管理員)
SQL99
根據表的連線方式來劃分,包括:
內連線:
- 等值連線
- 非等值連線
- 自連線
外連線:
- 左外連線(左連線)
- 右外連線(右連線)
- 全連線(這個不講,很少用!)
3、笛卡爾積現象
在表的連線查詢方面有一種現象被稱為:笛卡爾積現象。(笛卡爾乘積現象)
A集合和B集合相乘,包含了集合A中元素和集合B中元素相結合的所有的可能性。既兩個集合相乘得到的新集合的元素個數是 A集合的元素個數 × B集合的元素個數;
舉例:
案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。
select ename,dname from emp,dept;
±-------±-----------+
±-------±-----------+
| SMITH | ACCOUNTING |
| SMITH | RESEARCH |
| SMITH | SALES |
| SMITH | OPERATIONS |
| ALLEN | ACCOUNTING |
| ALLEN | RESEARCH |
| ALLEN | SALES |
| ALLEN | OPERATIONS |
…
56 rows in set (0.00 sec)
笛卡爾積現象: 當兩張表進行連線查詢的時候,沒有任何條件進行限制,最終的查詢結果條數是兩張表記錄條數的乘積
關於表的別名:
select e.ename,d.dname from emp e,dept d;
表的別名有什麼好處?
- 第一:執行效率高。
- 第二:可讀性好。
4、怎麼避免笛卡爾積現象?
當然是加條件進行過濾。
思考:避免了笛卡爾積現象,會減少記錄的匹配次數嗎?
不會,次數還是56次。只不過顯示的是有效記錄。
案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。
mysql> select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;//SQL92,以後不用。
二、內連線
內連線之等值連線:
最大特點是:條件是等量關係。
舉例;
案例:查詢每個員工的部門名稱,要求顯示員工名和部門名。
SQL92:(太老,不用了)
mysql> select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;
SQL99:(常用的)
// inner可以省略的,帶著inner目的是可讀性好一些。
mysql> select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;
語法:
-
... A join B on 連線條件 where ...
SQL99語法結構更清晰一些:表的連線條件和後來的where條件分離了。
Sql92語法和sql99語法的區別:99語法可以做到表的連線和查詢條件分離,特別是多個表進行連線的時候,會比sql92更清晰
內連線之非等值連線:
最大的特點是:連線條件中的關係是非等量關係。
舉例:
案例:找出每個員工的工資等級,要求顯示員工名、工資、工資等級。
// inner可以省略
mysql> select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
自連線:
最大的特點是:一張表看做兩張表。自己連線自己。
案例:找出每個員工的上級領導,要求顯示員工名和對應的領導名。
員工的領導編號 = 領導的員工編號
select
a.ename as '員工名',b.ename as '領導名'
from
emp a
inner join
emp b
on
a.mgr = b.empno;
三、外連線
1、什麼是外連線,和內連線有什麼區別?
內連線:
假設A和B表進行連線,使用內連線的話,凡是A表和B表能夠匹配上的記錄查詢出來,這就是內連線。
AB兩張表沒有主副之分,兩張表是平等的。
外連線:
假設A和B表進行連線,使用外連線的話,AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的資料,捎帶著查詢副表,當副表中的資料沒有和主表中的資料匹配上,副表自動模擬出NULL與之匹配。
2、外連線的分類?
左外連線(左連線):表示左邊的這張表是主表。
右外連線(右連線):表示右邊的這張表是主表。
左連線有右連線的寫法,右連線也會有對應的左連線的寫法。
舉例1:
案例:找出每個員工的上級領導?(所有員工必須全部查詢出來。)
內連線:
mysql> select a.ename as '員工',b.ename as '領導' from emp a inner join emp b on a.mgr = b.empno;
外連線:(左外連線/左連線)// outer可以省略。
mysql> select a.ename as '員工',b.ename as '領導' from emp a left outer join emp b on a.mgr = b.empno;
外連線:(右外連線/右連線):// outer可以省略。
mysql> select a.ename as '員工',b.ename as '領導' from emp b right outer join emp a on a.mgr = b.empno;
外連線最重要的特點是:主表的資料無條件的全部查詢出來。
舉例2:
案例:找出哪個部門沒有員工?
第一步:查找出所有部門的具體員工資訊
mysql> select d.* ,e.ename from emp e right join dept d on e.deptno = d.deptno;
第二步:找出沒有員工的部門
mysql> select d.* from emp e right join dept d on e.deptno = d.deptno where e.ename is null;
四、三表查詢
三張表怎麼連線查詢?
案例:找出每一個員工的部門名稱以及工資等級。
注意,解釋一下:
-
.... A join B join C on ...
表示:A表和B表先進行表連線,連線之後A表繼續和C表進行連線。
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
+--------+------------+-------+
| ename | dname | grade |
±-------±-----------±------+
| SMITH | RESEARCH | 1 |
| ALLEN | SALES | 3 |
| WARD | SALES | 2 |
| JONES | RESEARCH | 4 |
| MARTIN | SALES | 2 |
| BLAKE | SALES | 4 |
| CLARK | ACCOUNTING | 4 |
| SCOTT | RESEARCH | 4 |
| KING | ACCOUNTING | 5 |
| TURNER | SALES | 3 |
| ADAMS | RESEARCH | 1 |
| JAMES | SALES | 1 |
| FORD | RESEARCH | 4 |
| MILLER | ACCOUNTING | 2 |
±-------±-----------±------+
案例:找出每一個員工的部門名稱、工資等級、以及上級領導。
mysql> select a.ename '員工',b.ename '領導',d.dname,s.grade from
emp a join dept d on a.deptno = d.deptno left join emp b on
a.mgr = b.empno join salgrade s on a.sal between s.losal and hisal;
±-------±------±-----------±------+
| 員工 | 領導 | dname | grade |
±-------±------±-----------±------+
| SMITH | FORD | RESEARCH | 1 |
| ALLEN | BLAKE | SALES | 3 |
| WARD | BLAKE | SALES | 2 |
| JONES | KING | RESEARCH | 4 |
| MARTIN | BLAKE | SALES | 2 |
| BLAKE | KING | SALES | 4 |
| CLARK | KING | ACCOUNTING | 4 |
| SCOTT | JONES | RESEARCH | 4 |
| KING | NULL | ACCOUNTING | 5 |
| TURNER | BLAKE | SALES | 3 |
| ADAMS | SCOTT | RESEARCH | 1 |
| JAMES | BLAKE | SALES | 1 |
| FORD | JONES | RESEARCH | 4 |
| MILLER | CLARK | ACCOUNTING | 2 |
±-------±------±-----------±------+
14 rows in set (0.00 sec)