清晰講解SQL語句中的外連接,通用於Mysql和Oracle,全是乾貨哦

来源:https://www.cnblogs.com/ncl-960301-success/archive/2019/04/22/10753559.html
-Advertisement-
Play Games

直入主題: 我們做一個操作,將員工SCOTT的部門去掉,再次通過內連接查看數據,看看會產生什麼現象? 使用內連接,查詢數據 問題:找不到SCOTT員工了,只有13條數據,這顯然不合理;這就是內連接的缺點 -- 內連接:只顯示匹配的數據-- 外連接:顯示匹配的數據,還顯示(部分或者全部)不匹配的數據, ...


直入主題:

我們做一個操作,將員工SCOTT的部門去掉,再次通過內連接查看數據,看看會產生什麼現象?

使用內連接,查詢數據

問題:找不到SCOTT員工了,只有13條數據,這顯然不合理;這就是內連接的缺點

-- 內連接:只顯示匹配的數據
-- 外連接:顯示匹配的數據,還顯示(部分或者全部)不匹配的數據,那就是顯示(全部)的數據

(1)左外連接:left join

特點:左表全部顯示,包括不匹配的數據,右表進行匹配顯示

(2)右外連接:right join

右表全部顯示,包括不匹配的數據,左表進行匹配顯示

(3)全外連接

左表和右表的數據都會顯示,包括不匹配的數據

註意:在oracle中支持full  join

   在mysql中不支持全外連接,但是,可以通過union 連接左外連接和右外連接,達到全外連接的效果

(4)自連接

 思路:將一張表看做兩張表  下級表   上級表

舉例:顯示沒有上級的員工(king)

 

 知識擴展:

三表查詢:

就是先查兩張表,將查出的結果看成一張表,然後跟第三張表進行聯合查詢,本質還是兩表查詢

準備工作:先添加一張薪資等級表

第一步:連接emp和dept表

 查詢員工的編號、姓名、薪水、部門編號、部門名稱

第二步:連接第三張表

-- 查詢員工的編號、姓名、薪水、部門編號、部門名稱、薪水等級

至此,全部的表連接講解完畢!

歡迎留言,指出問題,有則改之無則加勉

下麵,分享所有的SQL語句:

create table DEPT
(
  DEPTNO int(2) not null,
  DNAME  VARCHAR(14),
  LOC    VARCHAR(13)
);
alter table DEPT
  add constraint PK_DEPT primary key (DEPTNO);
create table EMP
(
  EMPNO    int(4) primary key,
  ENAME    VARCHAR(10),
  JOB      VARCHAR(9),
  MGR      int(4),
  HIREDATE DATE,
  SAL      double(7,2),
  COMM     double(7,2),
  DEPTNO   int(2)
);
alter table EMP
  add constraint FK_DEPTNO foreign key (DEPTNO)
  references DEPT (DEPTNO);
create table SALGRADE
(
  GRADE int primary key,
  LOSAL double(7,2),
  HISAL double(7,2)
);
create table BONUS
(
  ENAME VARCHAR(10),
  JOB   VARCHAR(9),
  SAL   double(7,2),
  COMM  double(7,2)
);
commit;
insert into DEPT (DEPTNO, DNAME, LOC)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (DEPTNO, DNAME, LOC)
values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (DEPTNO, DNAME, LOC)
values (30, 'SALES', 'CHICAGO');
insert into DEPT (DEPTNO, DNAME, LOC)
values (40, 'OPERATIONS', 'BOSTON');
commit;
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
commit;
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (5, 3001, 9999);
commit;
-- 一、內連接
-- 交叉連接 cross JOIN
-- 笛卡爾積現象
SELECT * 
FROM emp
CROSS JOIN dept;
-- 使用using,只顯示指定的同名欄位
SELECT * 
FROM emp e
CROSS JOIN dept d
USING (deptno);
-- 使用on,指定不同名的欄位
SELECT *
FROM emp e
CROSS JOIN dept d
ON(e.deptno = d.deptno);
-- natural join 自然連接 所有同名列只顯示一次
SELECT *
FROM emp
NATURAL JOIN dept;
-- 二、外連接
-- 左外連接  emp左表,dept 右表,左表全部顯示,包括沒有數據的列
SELECT *
FROM emp e -- 左表
LEFT JOIN dept d -- 右表
on(e.deptno = d.deptno);
-- 右外連接  emp左表, dept右表,右表全部顯示,包括沒有數據的列
SELECT * 
FROM emp e  -- 左表
RIGHT JOIN dept d -- 右表
on(e.deptno = d.deptno);
-- 全外連接 ,oracle支持,mysql不支持
-- 可以通過關鍵字union進行解決,左表和右表的無對應數據列都會顯示
SELECT *
FROM emp e
LEFT JOIN dept d
on(e.deptno = d.deptno);
UNION 
SELECT * 
FROM emp e
RIGHT JOIN dept d
on(e.deptno = d.deptno);
-- 三、三表查詢
SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;
-- 第一步,先查兩張表
SELECT e.empno,e.ename,e.sal,d.deptno,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;
-- 第二步,連接第三張表
SELECT e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade
FROM emp e
JOIN dept d
ON e.deptno = d.deptno 
JOIN salgrade sg
ON e.sal BETWEEN sg.losal AND sg.hisal; 
-- 四、自連接
-- 不是所有表都可以進行自連接,只有表中的兩列有關聯關係,才可以進行自連接查詢
-- 將自身分解成兩張表
SELECT e.empno,e.ename,e.mgr,m.empno,m.ename
FROM emp e
LEFT JOIN emp m
ON e.mgr = m.empno;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 概念與由來 LVM:邏輯捲管理(Logical Volume Manager) 普通的磁碟分區管理方式在邏輯分區劃分好之後就無法改變其大小,當一個邏輯分區存放不下某文件時,這個文件因為受上層文件系統的限制,不能跨越多個分區存放,所以也不能放到多個磁碟上。 而當某個分區空間耗盡時,解決的方法通常 ...
  • 胖友,如果你的電腦是windows系統,下麵這十八招windows快捷鍵都不會,還敢說你會用windows? 說到windows的快捷鍵,當然不是只有ctrl+c,ctrl+v這麼簡單,今天我整理了一下一些windows常用的使用快捷鍵技巧,用於提高辦公效率。來吧,一起玩一下。 1,新建文件夾(Ct ...
  • if [ 1 -ne 1 ];then...fi這是指當1不等於1時執行then後的語句-eq:等於-ne:不等於-le:小於等於-ge:大於等於-lt:小於-gt:大於 ...
  • vsftpd丶NFS丶SAMBA nfs基於rpcsamba基於cifs(smb) DRBD:ftp:File Transfer protocol 文件傳輸協議 兩個連接: tcp:命令連接 tcp:數據連接 在被動模式下數據傳輸埠是隨機的除非自己指定 主動模式:伺服器端通過20埠主動連接客戶端 ...
  • PXE介紹 Preboot Excution Environment 預啟動執行環境 Intel公司研發 基於Client/Server的網路模式,支持遠程主機通過網路從遠端伺服器下載映像,並由此支持通過網路啟動操作系統 PXE可以引導和安裝Windows,linux等多種操作系統 所謂的PXE是P ...
  • 由於需要對ADC進行驅動設計,因此學習了一下Linux驅動的IIO子系統。本文翻譯自《Linux Device Drivers Development 》--John Madieu,本人水平有限,若有錯誤請大家指出。 IIO Framework 工業I / O(IIO)是專用於模數轉換器(ADC)和 ...
  • Redis的數據結構類型,指的是redis的值的value類型; Redis的常用數據結構類型:string,list,set,sortedSet,hash 一.sting的類型 string類型是redis最常見的數據結構類型,存儲的值為字元串。 1.1String相關命令 set key val ...
  • Shell 腳本中經常需要用到一些括弧、引號表達式,功能各不相同,本文詳細介紹一下。 1、雙引號 " " 雙引號常用於包含一組字元串,在雙引號中,除了 "$"、"\"、" ` (反引號)"有特殊含義外,其餘字元(如IFS、換行符、回車符等)沒有特殊含義。 輸出結果為 3,在雙引號中 $ 符仍有特殊含 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...