圖解SQL的inner join(join)、left join、right join、full outer join、union、union all的區別...

對于SQL的Join,在學習起來可能是比較亂的。我們知道,SQL的Join語法有很多inner的,有outer的,有left的,有時候,對于Select出來的結果集是什么樣子有點不是很清楚。Coding Horror上有一篇文章,通過文氏圖 Venn diagrams 解釋了SQL的Join。我覺得清楚易懂,轉過來。

假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:讓我們看看不同JOIN的不同

A表
idname
1Pirate
2Monkey
3Ninja
4Spaghetti
B表
idname
1Rutabaga
2Pirate
3Darth Vade
4Ninja

1.INNER JOIN

JOIN其實是INNER JOIN的常見簡寫。

SELECT * FROM TableA?INNER JOIN?TableB ON TableA.name = TableB.name

結果集
(TableA.)(TableB.)
idnameidname
1Pirate2Pirate
3Ninja4Ninja

Inner join 產生的結果集中,是A和B的交集。

2.FULL [OUTER] JOIN?
(1)
SELECT * FROM TableA?FULL OUTER JOIN?TableB ON TableA.name = TableB.name?
結果集
(TableA.)(TableB.)
idnameidname
1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull
nullnull1Rutabaga
nullnull3Darth Vade
Full outer join 產生A和B的并集。但是需要注意的是,對于沒有匹配的記錄,則會以null做為值。
可以使用IFNULL判斷。
(2)
SELECT * FROM TableA?FULL OUTER JOIN?TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
結果集
(TableA.)(TableB.)
idnameidname
2Monkeynullnull
4Spaghettinullnull
nullnull1Rutabaga
nullnull3Darth Vade
產生A表和B表沒有交集的數據集。
3.LEFT [OUTER] JOIN
(1)
SELECT * FROM TableA?LEFT OUTER JOIN?TableB ON TableA.name = TableB.name
結果集
(TableA.)(TableB.)
idnameidname
1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull
Left outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
(2)
SELECT * FROM TableA?LEFT OUTER JOIN?TableB ON TableA.name = TableB.nameWHERE TableB.id IS null
結果集
(TableA.)(TableB.)
idnameidname
2Monkeynullnull
4Spaghettinullnull

產生在A表中有而在B表中沒有的集合。

4.RIGHT [OUTER] JOIN
RIGHT OUTER?JOIN 是后面的表為基礎,與LEFT OUTER JOIN用法類似。這里不介紹了。
5.UNION??UNION ALL
UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。UNION 只選取不重復記錄,而UNION ALL會列出所有記錄。
不同點:union all效率要比union來得高。
(1)SELECT?name FROM?TableA?UNION?SELECT name FROM TableB
新結果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade
選取不同值
(2)SELECT?name FROM?TableA?UNION ALL?SELECT name FROM TableB
新結果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

全部列出來

(3)注意:

SELECT?* FROM?TableA?UNION?SELECT * FROM TableB
新結果集
idname
1Pirate
2Monkey
3Ninja
4Spaghetti
1Rutabaga
2Pirate
3Darth Vade
4Ninja
由于 id 1 Pirate?? 與 id 2 Pirate 并不相同,不合并
還需要注冊的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:SELECT * FROM TableA CROSS JOIN TableB
這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。

轉載于:https://www.cnblogs.com/fromzerotohero/p/3727197.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫---四中連接查詢(交叉、左連接、右連接、完整查詢)

個人博客 :https://www.siyuan.run CSDN:https://blog.csdn.net/siyuan 微信小程序:思遠Y 1、交叉連接查詢 : (基本不適用---得到的是兩張表數據的乘積) 語法:SELECT * FROM 表1,表2; PS:與表關系無關 示例&#xff…

如何用C#語言構造蜘蛛程序

"蜘蛛"(Spider)是Internet上一種很有用的程序,搜索引擎利用蜘蛛程序將Web頁面收集到數據庫,企業利用蜘蛛程序監視競爭對手的網站并跟蹤變動,個人用戶用蜘蛛程序下載Web頁面以便脫機使用,開發者利…

數據庫---練習題(45道)

準備工作 CREATE DATABASE STUDENTS; CREATE TABLE STUDENT( SNO VARCHAR(32) PRIMARY KEY NOT NULL, SNAME VARCHAR(32) NOT NULL, SSEX VARCHAR(32) NOT NULL, SBIRTHDAY DATETIME, CLASS VARCHAR(20) ); CREATE TABLE COURSE( CNO VARCHAR(20) PRIMARY KEY NOT NULL, CNAM…

LeetCode OJ - Populating Next Right Pointers in Each Node II

題目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant extra space.For example,Given the fo…

數據庫---JDBC

1.1 JDBC概述JDBC(Java DataBase Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API。JDBC是Java訪問數據庫的標準規范,可以為不同的關系型數據庫提供統一訪問,它由一組用Java語言編寫的接口和類組成。 JDBC需要連接驅…

23種設計模式之簡單工廠

簡單工廠模式描述的是,通過類的繼承關系,父類(工廠類)與子類(產品類),調用父類中的方法,實際干活兒的是子類中的方法;封裝需求的不確定性,做出通用的編程&…

原生JDBC操作數據庫流程

1、class.forName()加載數據驅動 2、DriverManager.getConnection()獲取數據庫連接對象。 3、根據SQL或sql會話對象,有兩種方式Statement、PreparedStatement。 4、執行sql處理結果集,如果有參數就設置參數。 5、關閉結果集,關閉會話&#xf…

verilog HDL 編碼風格

1、有意義且有效的名字。 2、同一信號在不同層次應該保持一致。 3、添加有意義的后綴,使信號的有效性更加明確。 4、模塊輸出寄存器化,使得輸出的驅動強度和輸入延時是可以預測的。 5、使用括號表明優先級。 6、每一個if都應該有一個else。如果esle沒有任…

為什么要使用PreparedStatement

(個人理解:執行速度,使用方便,代碼的可讀性維護性,提高性能,安全性 五個方面考慮) 1、PreparedStatement接口繼承Statement,PreparedStatement實例包含了預編譯的SQL語句,所以PreparedStatement…

session中存放一個對象,只修改對象的屬性,不將修改后的對象存放session,發現session中存放的對象也發生改變!

標題簡單描述:先將一個對象放入session,只對對象屬性值進行修改,但不將修改后的對象存放session中,發現session中存放的對象屬性值也相對應的改變。Person personnew PerSon(); request.getSession().setAttribute("person&q…

利用三層交換機實現VLAN間路由配置

利用三層交換機實現VLAN間路由配置 實驗目標: 一、 掌握交換機Tag VLAN的配置; 二、掌握三層交換機基本配置方法; 三、 掌握三層交換機的VLAN路由的配置方法; 四、通過三層交換機實現VLAN見相互通信; 技術原理&#xf…

Maven,在pom.xml配置JDK 9版本。

<build><plugins><!-- 設置JDK 9版本 --><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> …

【leetcode】Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each paths sum equals the given sum. For example:Given the below binary tree and sum 22, 5/ \4 8/ / \11 13 4/ \ / \7 2 5 1 return [[5,4,11,2],[5,8,4,5] ] 下午做了個筆試沒睡覺…

easyui、表格中添加操作一列,將操作下設置為修改,點擊修改彈出該行對象的編號。

頁面中的代碼(自己引入easy插件)&#xff1a; <body> <div id"table"></div> </body> <script type"text/javascript"> $(function(){$(#table).datagrid({ url:tt.json, //顯示的數據striped:true, …

被LTRIM(RTRIM())害死了,差點

LTRIM(character_expression)去掉前置空格 LTRIM(RTRIM())就是把前置和后置空格都去掉。 character_expression可以是常量、變量或列。character_expression必須屬于某個可隱式轉換為varchar的數據類型(text、ntext和image除外)。否則&#xff0c;請使用CAST顯示轉換character_…

Mybatis、使用注解的方式編寫用戶和角色一對多關系,并使用延遲加載

1、數據庫準備 CREATE TABLE role ( ID INT(11) NOT NULL COMMENT 編號,ROLE_NAME VARCHAR(30) DEFAULT NULL COMMENT 角色名稱,ROLE_DESC VARCHAR(60) DEFAULT NULL COMMENT 角色描述,PRIMARY KEY (ID) ) ENGINEINNODB DEFAULT CHARSETutf8;INSERT INTO role(ID,ROLE_NAME,…

織夢標簽大全

關鍵描述調用標簽&#xff1a; <meta name"keywords" content"{dede:field namekeywords/}"> <meta name"description" content"{dede:field namedescription functionhtml2text(me)/}"> -------------------------------…

spring的注入

1、構造函數注入的是設計到的標簽&#xff1a;constructor-arg屬性&#xff1a;index:指定參數在構造函數參數列表的索引位置type:指定參數在構造函數中的數據類型name:指定參數在構造函數中的名稱上面三個都是找誰 &#xff0c;給誰賦值&#xff0c;下面兩個指的是賦什么值 va…

.Net中堆棧和堆的區別

首先堆棧和堆&#xff08;托管堆&#xff09;都在進程的虛擬內存中。&#xff08;在32位處理器上每個進程的虛擬內存為4GB&#xff09; 堆棧stack 1、堆棧中存儲值類型 2、堆棧實際上是向下填充&#xff0c;即由高內存地址指向低內存地址填充 3、堆棧的工作方式是先分配內存的變…

spring的IOC注解

1、創建對象的注解 含義&#xff1a;使用注解的形式創建對象&#xff0c;交給Spring容器管理(需要配置在類上) Component:組件 Controller:web層 Service:service層 Repository:Dao層默認&#xff1a;創建對象的唯一標識&#xff0c;當前類名首字母小寫value屬性&#xff1a;指…