MySql的回顧五:多表查詢下(內聯/左外/右外/自連接/交叉)-1999語法

来源:https://www.cnblogs.com/jxearlier/archive/2020/07/25/13376452.html
-Advertisement-
Play Games

好好吃飯,好好休息,聽著很簡單,實際落實缺失不那麼容易。 繼續回顧MySql的多表查詢之1999語法 #二,SQL1999語法 語法: SELECT 查詢列表 FROM 表1 別名 【連接類型】 JOIN 表2 別名 ON 鏈接條件 【WHERE 篩選條件】 【GROUP BY 分組】 【HAVIN ...


  好好吃飯,好好休息,聽著很簡單,實際落實缺失不那麼容易。

       繼續回顧MySql的多表查詢之1999語法

#二,SQL1999語法
語法:
    SELECT 查詢列表
    FROM 表1 別名 【連接類型】
    JOIN 表2 別名
    ON 鏈接條件
    【WHERE 篩選條件】
    【GROUP BY 分組】
    【HAVING 篩選條件】
    【ORDER BY 排序列表ASC|DESC】

分類(連接類型):
    內連接(★): INNER
    外聯結
        左外(★):LEFT 【OUTER】
        右外(★):RIGHT 【OUTER】
    全外:FULL 【OUTER】
    交叉連接:CROSS                

===============================================================================

一、內連接
語法:
    SELECT 查詢列表
    FROM 表1 別名
    INNER JOIN 表2 別名
    ON 連接條件
    【WHERE 篩選條件】
    【GROUP BY 分組】
    【HAVING 篩選分組】
    【ORDER BY 排序列表 ASC|DESC】

分類:
    等值
    非等值
    自連接
     特點:
    ①添加排序,分組,篩選
    ②INNER可以省略
    ③篩選條件放在WHERE後面,連接條件放在ON後面,提高分離性,便於閱    
       讀。
    ④INNER JOIN連接和SQL1992語法中的等值連接效果是一樣的,都是查 
       詢交集部分。    
#1.等值連接
#案例1.查詢員工名,部門名。交換連接條件不影響結果。
SELECT last_name AS 員工名,department_name AS 部門名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id;
SELECT last_name AS 員工名,department_name AS 部門名
FROM employees d
INNER JOIN departments e
ON e.department_id=d.department_id;

#案例2.查詢名字中包含e的員工和工種名(篩選)
SELECT last_name AS 員工名,job_title AS 工種名
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE '%e%';

#案例3.查詢部門個數>3的城市名和部門個數。(分組+篩選)
分步:先把每個城市的部門個數查出來,在篩選滿足條件的。
SELECT city AS 城市,COUNT(*) AS 個數
FROM locations l
INNER JOIN departments d
ON l.location_id=d.location_id
GROUP BY city
HAVING COUNT(*) > 3;

#案例4.查詢哪個部門員工個數>3的部門名和員工個數,並按個數降序排序。
分步:
1.查詢每個部門的員工個數,
2.在上面的結果上篩選出員工數大於3的記錄,
3.把員工數排序
SELECT COUNT(*) AS 員工個數,d.department_name AS 部門名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
GROUP BY d.department_name
HAVING COUNT(*) > 3
ORDER BY 員工個數 DESC;

#案例5.查詢員工名,部門名,工種名,並按部門名降序。三表連接註意條件。
SELECT last_name AS 員工名,department_name AS 部門名,
job_title AS 工種名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
INNER JOIN jobs j
ON e.job_id=j.job_id
ORDER BY d.department_name DESC;

#2.非等值連接。範圍(間接)
#案例1.查詢員工的工資級別。
SELECT salary AS 月薪,grade_level AS 工資等級
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

#案例2.查詢每個工資的級別的個數>20,並且按降序排列。
SELECT j.grade_level AS 等級,COUNT(*) 個數
FROM employees e
INNER JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal
GROUP BY j.grade_level
HAVING COUNT(*) > 20
ORDER BY 個數 DESC;

#3.自連接
#案例1.查詢員工的名字,上級的名字。
SELECT e.last_name AS 員工名,m.last_name AS 上級名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id;

#案例2.查詢員工的名字,上級的名字,名字中包含字元k。
SELECT e.last_name AS 員工名,m.last_name AS 上級名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';

#二,外連接

應用場景:用於查詢一個表中有,另一個表沒有的記錄。
特點:
1.外連接的查詢結果為主表中的所有記錄
如果從表中有和它匹配的,則顯示匹配的值
如果從表中沒有和它匹配的,則顯示null
外連接查詢結果=內連接結果+主表中有而從表沒有的記錄
2.左外連接,LEFT JOIN左邊的是主表
右外連接,RIGHT JOIN右邊的是主表
3.左外和右外交換兩個表的順序,可以實現同樣的效果。
4.全外連接=內連接的結果+表1中有但表2中沒有的+表2中有但表一沒有的(Mysql不支持)
引入:
SELECT * FROM beauty;
SELECT * FROM boys;

#引入:查詢男朋友不在男神表的女神名
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id;

#左外連接
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;
#選從表中的主鍵列
#右外連接,得到同樣的結果。
SELECT b.NAME,bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

#把beauty表中的id為10行的boyfriend_id從4改到6.才能查詢出如下結果。
SELECT b.*,bo.*
FROM boys bo
LEFT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE b.id IS NULL;

#案例1.哪個部門沒有員工。
#左外寫法
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id=e.department_id
WHERE e.department_id IS NULL;
==============================
#右外寫法
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;

#全外連接查出的結果有三部分組成(舉例,Mysql不支持)語法結構演示
  先把兩張表的交集查出來,在把缺失的填充查出來,在把其他無關聯的查出來
  語法結構示例
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
#交叉連接,使用1999的語法標準實現的
笛卡爾乘積
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

#SQL1992語法 與 SQL 1999語法 相比
功能:SQL1999支持的較多
可讀性:SQL1999實現連接條件和篩選條件的分離,可讀性提高

總結:

SELECT <select_list>
FROM A
INNER JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY
WHERE B.KEY IS NULL;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL
OR B.KEY IS NULL;

   簡單的多表查詢已結束,相信看到這裡的基本對簡單多表連接應該手到擒來,至於看不懂的emmm...

用我們楊老師的話就是,自己去寫個二三十遍就有感覺了。o(^▽^)o。

         高考結束,大學生活的開始,世界是屬於你們的倒計時開啟了...不管你們選擇什麼專業,只要是你自己選擇的,一定要相信自己會在這個專業留下一筆....。

    

 


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

-Advertisement-
Play Games
更多相關文章
  • 百度網盤:Python項目開發實戰(第2版)PDF高清完整版免費下載 提取碼:exep 內容簡介 本書來自真正的開發現場,是BePROUD公司眾多極客在真實項目中的經驗總結和智慧結晶。作者從Python的環境搭建開始講起,介紹了Web應用的開發方法、項目管理及審查、測試與高效部署、伺服器調試等內容, ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:彥頁走刀口 今天我們來看看用ghpython怎麼實現koch曲線的分形效果,前兩天分享的雪花分形是利用grasshopper的迴圈插件anemone實現的,然後有個小伙 ...
  • 前言 在朋友的項目有個自定義配置文件user.yml,其內容如下 user: userId: 1 name: 張三 email: [email protected] 其映射實體內容為如下 @Data @AllArgsConstructor @NoArgsConstructor @Builder @Pro ...
  • 在我們開發各種應用的時候,都會碰到很多不同的問題,這些問題涉及架構、模塊組合、界面處理、共同部分抽象等方面,我們這裡以Winform開發為例,從系統模塊化、界面組件選擇、業務模塊場景劃分、界面基類和輔助類處理、代碼生成工具輔助開發等方面介紹在實際項目開發過程中碰到的困境和相關的解決方案,以便分析其中... ...
  • 1、資料庫 根據需要附加或者還原U9對應資料庫; 2、配置IIS ①:打開IIS管理器,在網站預設節點(Default Web Site),添加應用程式; ②:配置應用程式(文件夾必須是非漢字命名); 3、Classview訪問 Classview訪問(部署在本地訪問地址為:http://127.0 ...
  • 通過對 Microsoft.AspNetCore.Cors 的內部實現的剖析,我們瞭解到,其實現 CORS 的原理非常簡單,結構清晰,就算不用系統自帶的 CORS 組件,自行實現一個 CORS 策略,也是非常容易的。 ...
  • 達夢存儲過程的語法與oracle的高度相似,但有好多細節還是有差異。我在這次項目遷移中踩過不少小坑,在這裡給大家分享一下。 說明一下,我用的版本是達夢8,遷移時碰到的問題有些我已經反饋給達夢的官方群管理員,估計以後會有修複。 rpad問題 達夢的rpad函數,計算中文時永遠是認為一個中文字元中兩個字 ...
  • 從MySQL的MRR開始 開始之前,先從MySQL入手,看一下MySQL中的MRR機制原理,也就是Multi-Range Read。MySQL中在按照非聚集索引的範圍查找且需要回表的情況下,比如select * from t where c2>100 and c2<200;c2為非聚集索引。如果直接 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...