SQL join語句總結

2021-03-02 PHP在線

微信公眾號:PHP在線

早上一起床就刷微信(真想拍死自己),看到一篇很有意思的推送,名為《圖解SQL join語句》,講的是用Venn圖圖解SQL join語句。看的過程中有點疑惑,乾脆就用MySQL實踐一下,順帶複習下MySQL嘛。這一實踐下來,還發現了另外的有趣的問題,比如MySQL中並沒有full outer join, 那要怎麼在MySQL中模擬full outer join的問題。這麼一來二去,涉及的內容就更加有意思了,不記下來有點可惜,另外國慶實在是一個放鬆的好時機啊,又想偷懶了,那就寫博客來防止自己偷懶吧!
由於寫出排版美觀的博客比較費時間,所以這一系列的博客可能比較潦草,希望各位看官海涵。

為了防止遺漏,先直接上各種連接對應的Venn圖,圖片引自推送,原作者已不可考。另外,自然連接是無法用Venn圖表示的。

假設有兩個表,A表,B表,表結構與數據如下:

複習MySQL:

進入MySQL的命令:mysql -u root -p 接著輸入密碼
查看資料庫:show databases; 注意複數,有分號
查看資料庫表:show tables;   注意複數,有分號
創建表:create table A(id int, name varchar(32));
插入數據: insert into A values(1, 'Pirate'); 注意字符串加單引號,另外如果只是插入部分欄位,只需在表名後打括號,指定欄位名,欄位名無需加單引號

內連接 inner join:只生成匹配連接條件的記錄,最常見沒啥好講。對應Venn圖的求交。

全外連接 full outer join: 會生產表A與表B的記錄全集,包含兩邊都匹配的記錄(inner join的結果集),另外如果有一邊沒有匹配,缺失的一邊為null。然而,請注意,全外連接與產生笛卡爾積結果集的自然連接是不同的!全外連接可以理解為left join與right join的併集。對應Venn圖求並。

由於MySQL中沒有提供full outer join關鍵字,我們需要用left join 與right join 再結合 union來模擬full outer join,用union當然是因為union會去重。

注意一定是A left join B union  A right join B, 這樣union 的結果才會是真正的模擬到full outer join。(而不是A left join B  union  B left join A,即兩次查詢表的順序要相同,因為union在去重的時候,只是單純的看每一行是否完全相同, 1 Pirate 2 Pirate 與 2 Pirate 1Pirate會被視為不同的記錄(廢話),儘管我們人腦一看就知道這是一條重複的記錄)

左連接 left join:生成左表的全部記錄,對於右表中沒有匹配的記錄,用null補。對應Venn圖就是左集合。

左連接 right join:生成右表的全部記錄,對於左表中沒有匹配的記錄,用null補。對應Venn圖就是右集合。

比較有趣並引起我的疑惑的是一開始給出的圖中,關於下面這張圖的SQL的寫法,讓我發現了自己一直以來在SQL語句執行順序中的一個誤區。

推送的說法是「為了生成只在表A裡而不在表B中的記錄,我們同樣使用left join, 再用where B.id is null 來排除A與B的交集 」。一直以來我以為where B.id is null是作用在from B的集上的,事實證明我是錯的。 在join後面的where是作用在join on篩選後的結果集上的。
這裡附上SQL語句的執行順序,明確SQL語句的執行順序很重要。

(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list> 
邏輯查詢處理階段簡介
FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian product)(交叉聯接),生成虛擬表VT1
ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
OUTER(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表為止。
WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
SELECT:處理SELECT列表,產生VT8.
DISTINCT:將重複的行從VT8中移除,產生VT9.
ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成遊標(VC10).
TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。

相關焦點

  • Spark SQL 之 Join 實現
    SparkSQL總體流程介紹在闡述Join實現之前,我們首先簡單介紹SparkSQL的總體流程,一般地,我們有兩種方式使用SparkSQL,一種是直接寫sql語句,這個需要有元資料庫支持,例如Hive等,另一種是通過Dataset/DataFrame編寫Spark應用程式。
  • 面試必知的 Spark SQL 幾種 Join 實現
    SparkSQL總體流程介紹在闡述Join實現之前,我們首先簡單介紹SparkSQL的總體流程,一般地,我們有兩種方式使用SparkSQL,一種是直接寫sql語句,這個需要有元資料庫支持,例如Hive等,另一種是通過Dataset/DataFrame編寫Spark應用程式。
  • 【面試必備】SQL中left join、right join、inner join的區別
    sql語句如下:select * from Aleft join B on A.aID = B.bID結果如下:aID     aNum     bID     bName1     a20050111    1     20060324012     a20050112    2     2006032402
  • SQL常用語句總結
    Moratuwa大學生物信息學研究員Vijini Mallawaarachchi總結了常用的SQL語句用法,可供參考和溫習。本文總結了常用的SQL語句,尤其適合在面試前複習你的SQL知識。你可以嘗試文中的例子,溫習下你很久以前在資料庫系統課程上學到的知識。為了演示每個命令的用法,我們將使用一個樣例資料庫。
  • mysql常用sql語句總結
    eg:select goods_name,goods.cat_id,cat_name,shop_price from goods left join category on goods.cat_id =category.cat_id;交叉聯接查詢交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。
  • 為什麼代碼規範要求SQL語句不要過多的join?
    面試官:在項目開發中如果需要使用join語句,如何優化提升性能?我:對於1.數據規模較小 全部幹進內存就完事了嗷2.數據規模較大可以通過增加索引來優化join語句的執行速度可以通過冗餘信息來減少join的次數儘量減少表連接的次數,一個SQL語句表連接的次數不要超過5次面試官:可以總結為join語句是相對比較耗費性能
  • Oracle優化:sql語句的執行順序
    理解 sql 語句的執行順序對我們優化 sql 有很大的幫助,那麼 sql 語句的執行順序是怎樣的呢,以一條簡單的的語句做分析:① 先執行 from 子句,明確數據的來源,從哪個表或哪個視圖來查詢② 接著執行
  • 詳細匯總 SQL 語句 Join 連接方式與用法.
    相當於自動添加了where語句,自動檢查了兩個表的哪幾個屬性相同。:select name, title from takes join course using(course_id, course_name);join...using...形式的語句可以很方便地指定「相等」條件,SQL同樣提供了指定其他條件的方式,也就是join...on...。
  • SQL語句別再帶過多的JOIN了,這樣寫才優秀!
    面試官:在項目開發中如果需要使用join語句,如何優化提升性能?我:分為兩種情況,數據規模小的,數據規模大的。我:對於1.數據規模較小 全部幹進內存就完事了嗷2.數據規模較大面試官:可以總結為join語句是相對比較耗費性能,對嗎?我:是的面試官:為什麼?
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • 優化SQL查詢:如何寫出高性能SQL語句
    select*from contact where username like 『%yue%』關鍵詞%yue%,由於yue前面用到了「%」,因此該查詢必然走全表掃描,除非必要,否則不要在關鍵詞前加%,12、數據類型的隱式轉換對查詢效率的影響sql
  • SQL 資料庫語句
    9、說明:創建視圖:create view viewname as select statement刪除視圖:drop view viewname10、說明:幾個簡單的基本的sql語句選擇:select * from table1 where 範圍插入:insert into table1(field1,field2) values(value1
  • Spark SQL重點知識總結
    4、可以通過將DataFrame註冊成為一個臨時表的方式,來通過Spark.sql方法運行標準的SQL語句來查詢。_這個隱式轉換,可以將DataFrame隱式轉換成RDD(2)、SQL風格:a、需要將DataFrame註冊成一張表格,如果通過CreateTempView這種方式來創建,那麼該表格Session有效,如果通過CreateGlobalTempView來創建,那麼該表格跨Session有效,但是SQL語句訪問該表格的時候需要加上前綴global_tempb、需要通過sparkSession.sql
  • inner join 與 left join 之間的區別
    ,才知道問題出在inner join 上了。一、sql的left join 、right join 、inner join之間的區別  left join(左聯接) 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄   right join(右聯接) 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄  inner join(等值連接) 只返回兩個表中聯結欄位相等的行舉例如下:
  • 面試官靈魂一問: 為什麼 SQL 語句不要過多的 join?
    以上圖片源:https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html面試官:在項目開發中如果需要使用join語句,如何優化提升性能我:對於可以通過增加索引來優化join語句的執行速度 可以通過冗餘信息來減少join的次數 儘量減少表連接的次數,一個SQL語句表連接的次數不要超過5次面試官:可以總結為join語句是相對比較耗費性能,對嗎?
  • 經典SQL語句大全
    9、說明:創建視圖:create view viewname as select statement刪除視圖:drop view viewname10、說明:幾個簡單的基本的sql語句選擇:select * from table1 where 範圍插入:insert into table1(field1,field2
  • 我想說:mysql的join 真的很弱
    查詢sql是: 我來分析一下這個語句:4張表等值join,還有一個子查詢。算是比較簡單的sql語句了(相比ERP動就10張表的哦,已經很簡單了)。我 還會分解這個語句成3個簡單的sql: 我來分析下:第一句,就是查詢最高分,得到最高分590分。
  • SQL語言中,inner join 、left join 、right join和full join的定義和圖示
    sql中的連接查詢有inner join(內連接)、left join(左連接)、right join(右連接)、full join(全連接)四種方式,它們之間其實並沒有太大區別,僅僅是查詢出來的結果有所不同。 例如我們有兩張表:
  • SQL數據分析實戰(三):Join語句介紹
    SQL語句的使用很簡單,重點在於理解資料庫表(結果集)的行列結構,這是關係型資料庫的核心概念之一。對分析師來說,理解了行列結構,掌握並能靈活應用join語句,在取數據工作中,能起到事半功倍的效果。在SQL專題文章中,我將SQL分成了三個部分,分別是JOIN、UNION、和其他函數。
  • sql語句總結,大家可以收藏了面試一定有用!!!
    8、創建視圖,刪除視圖create view viewname as select statement drop view viewname9、幾個簡單的基本的sql語句選擇:select * from table1 where 範圍插入