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

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

本文章目的:力求清晰明瞭講解SQL語句的內連接的各種應用,沒有深奧的理解! 前奏:這篇文章和下篇文章會將內連接和外連接講解清楚SQL語句的多表查詢常用的有以下幾種:兩表聯合查詢(1)內連接(2)外連接(分左外連接、右外連接)(3)全外連接(4)自連接三表查詢(1)三表查詢本片講解兩表聯合查詢的內連接 ...


本文章目的:力求清晰明瞭講解SQL語句的內連接的各種應用,沒有深奧的理解!

前奏:這篇文章和下篇文章會將內連接外連接講解清楚
SQL語句的多表查詢常用的有以下幾種:
兩表聯合查詢
(1)內連接
(2)外連接(分左外連接、右外連接)
(3)全外連接
(4)自連接
三表查詢
(1)三表查詢
本片講解兩表聯合查詢的內連接
第一步:準備表,員工表emp,部門表dept
關聯關係:員工表的“deptno”欄位關聯部門表的“deptno”

建表語句如下:

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);

表結構如下:

插入數據:

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');
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);

第二步:講解內連接

(1)笛卡爾積現象:(什麼是笛卡爾積,在此不在講解,如果有需要,可以留言,我再補充)

通過關鍵字:CROSS JOIN

優點:有助於理解多表查詢

缺點:交叉連接會產生笛卡爾積,產生多條無用結果

解決方案:(1)使用natural子句,即自然連接

     (2)使用using子句

              (3)使用on 子句

方案一:使用自然連接

優點:會自動的按照所有的同名列進行匹配,並且同名列只顯示一次,簡便

缺點:會自動的按照“所有的”同名列進行匹配,如果希望按照某一個同名列進行匹配,自然連接無能為力

解決方案:使用using

方案(2):使用using子句

優點:只顯示指定的同名欄位

缺點:如果兩張表的關聯欄位不同名怎麼辦?

解決方案:使用on

方案(3):使用on子句

優點:不管是否有同名列,都可以使用;雖然稍顯複雜,但是可讀性高,很好的解決了自然連接和using子句的缺陷

  因此,在開發中,推薦使用on子句

至此,多表查詢的內連接講解完畢,總結一下:

交叉連接(cross join):會產生笛卡爾積,產生大量無用數據,無用

自然連接(natural):會自動的按照所有的同名列進行匹配,並且同名列只顯示一次,顯示繁瑣

使用(using):按照某一個同名列進行匹配,指定了同名列,一定程度減少了自然連接的顯示量

使用(on):如果兩張表的關聯欄位不同名,自然連接和using無能為力,只有通過on子句。推薦使用on子句

完結!

註:下篇文章,講解外連接,有問題要交流的歡迎留言,有則改之無則加勉。

 


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

-Advertisement-
Play Games
更多相關文章
  • 胖友,如果你的電腦是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,在雙引號中 $ 符仍有特殊含 ...
  • 直入主題: 我們做一個操作,將員工SCOTT的部門去掉,再次通過內連接查看數據,看看會產生什麼現象? 使用內連接,查詢數據 問題:找不到SCOTT員工了,只有13條數據,這顯然不合理;這就是內連接的缺點 -- 內連接:只顯示匹配的數據-- 外連接:顯示匹配的數據,還顯示(部分或者全部)不匹配的數據, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...