數據庫中的連接查詢


1、概述
2、連接查詢原理及笛卡爾積現象
3、內連接
---3.1等值連接
---3.2非等值連接
---3.3自連接
4、外連接
---4.1概述
---4.2例子
5、三張表以上的連接查詢
---5.1大致語法
---5.2例子

概述

1、在實際開發中,大部分的情況下都不是從單表中查詢數據,一般都是多張表聯合查詢取出最終的結果。一個業務都會對應多張表,比如:學生和班級,起碼兩張表。(避免產生數據的冗余)
2、連接查詢的分類
①根據語法出現的年代來划分:
SQL92(一些老的DBA可能還在使用這種語法。)
SQL99(比較新的語法)
②根據表的連接方式來划分:
內連接:等值連接、非等值連接、自連接。
外連接:左外連接(左連接)、右外連接(右連接)、全連接。

連接查詢原理及笛卡爾積現象

(以下屬於SQL92)

  • 笛卡爾積現象
    1、在表的連接查詢方面有一種現象被稱為:笛卡爾積現象。
    2、例子:找出每一個員工的部門名稱,要求顯示員工名和部門名。
    emp表:
    emp表
    dept表:
    dept表
SELECT e.ENAME, d.dname 
FROM emp e, dept d;

(從e表中拿一個ENAME與d表中的所有dname一一匹配)
在這里插入圖片描述
3、查詢出來的結果有56條(14*4)。當兩張表進行連接查詢的時候,沒有任何條件進行限制,最終的查詢結果條數是兩張表記錄條數的乘積。這就是笛卡爾積現象。
4、關於表的別名的優點:執行效率高;可讀性好。

  • 如何避免笛卡爾積現象?
    加條件進行過濾,還有會查56條,但只會顯示有效記錄。
SELECT e.ename, d.dname 
FROM emp e, dept d
where e.DEPTNO = d.DEPTNO;

在這里插入圖片描述

內連接

等值連接
  • 內連接之等值連接
    最大的特點是:條件是等量關系。
  • SQL99(最常用)
SELECT e.ename, d.dname 
FROM emp e
join dept d
on e.DEPTNO = d.DEPTNO;

1、語法:

...
   A
(inner) join
   B
on
   連接條件
where
   ...

inner可省略,加上可讀性更強
2、SQL99語法結構更清晰一些,表的連接條件和后來的where條件分離了。

非等值連接
  • 內連接之非等值連接
    最大的特點是:連接條件中的關系是非等量關系。
  • 例子:
    找出每個員工的工資等級,要求顯示員工名、工資、工資等級。
SELECT e.ename, e.sal, s.grade 
FROM 
emp as e
inner join 
salgrade as s
on 
e.sal between losal and hisal
order by grade;

在這里插入圖片描述

自連接
  • 自連接
    自連接就是一張表看做兩張表,自己連接自己。
  • 例子:
    找出每個員工的上級領導,要求顯示員工名和對應的領導名。
    emp表:
    在這里插入圖片描述
    關鍵:
    一張表起兩個別名,當做兩張表用。
    員工的領導編號 = 領導的員工編號。
SELECT a.ename as emp, 
b.ename as mgr
from emp as a
inner join 
emp as b
on a.mgr = b.empno;

在這里插入圖片描述

外連接

概述
  • 內連接和外連接的區別
    1、內連接:
    假設A和B表進行連接,使用內連接的話,凡是A表和B表能夠匹配上的記錄查詢出來,這就是內連接。AB兩張表沒有主副之分,兩張表是平等的。
    2、外連接:
    假設A和B表進行連接,使用外連接的話, AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數據,捎帶着查詢副表。當副表中的數據沒有和主表中的數據匹配上,副表自動模擬出NULL與之匹配。
    3、外連接的分類:
    左外連接(左連接):表示左邊的這張表是主表。
    右外連接(右連接):表示右邊的這張表是主表。
    4、左連接有右連接的寫法,右連接也會有對應的左連接的寫法。
    5、外連接最重要的特點是:主表的數據無條件的全部查詢出來。
例子

1、找出每個員工的上級領導,要求顯示員工名和對應的領導名。

  • 左連接:
SELECT a.ename as emp, 
b.ename as mgr
from emp as a
left outer join 
emp as b
on a.mgr = b.empno;

outer可以省略
在上面內連接的基礎上將inner換為left (outer),emp as a表示左邊,emp as b表示右邊;因為是left,所以左邊的a為主表。b為副表。

  • 右連接
SELECT a.ename as emp, 
b.ename as mgr
from emp as b
right outer join 
emp as a
on a.mgr = b.empno;

outer可以省略
這時emp as b表示左邊,emp as a表示右邊;right表示右邊的a為主表。b為副表。
在這里插入圖片描述
上述結果中雖然KING沒有上級,但是有null與之匹配。(內連接就沒有)
2、找出哪個部門沒有員工?

SELECT dept.*
FROM emp
right outer join
dept
on 
emp.deptno = dept.deptno
where
emp.empno is null;

在這里插入圖片描述

三張表以上的連接查詢

大致語法
...
     A
inner join 
     B
on
...
inner join 
     C
on
...

表示:A表和B表先進行表連接,連接之后A表繼續和c表進行連接。

例子

找出每一個員工的部門名稱以及工資等級、領導。

SELECT e.ename emp, d.dname, s.grade, ee.ename mgr
FROM emp e
inner join dept d
on e.deptno=d.deptno 
inner join salgrade s
on e.sal between s.losal and s.hisal
left join emp ee
on e.mgr=ee.empno;

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM