1. 程式人生 > 其它 >MySql中的資料查詢語言(DQL)三:連線查詢

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;
±-------±-----------+

| ename | dname |
±-------±-----------+
| 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)