程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

〖Python 數據庫開發實戰 - MySQL篇⑳〗- 數據表的內連接

編輯:Python
萬葉集 隱約雷鳴,陰霾天空。 但盼風雨來,能留你在此。


前言
作者簡介:渴望力量的哈士奇 ,大家可以叫我 哈士奇 ,一位致力於 TFS - 全棧 賦能的博主
CSDN博客專家認證、新星計劃第三季全棧賽道 MVP 、華為雲享專家、阿裡雲專家博主
如果文章知識點有錯誤的地方,請指正!和大家一起學習,一起進步
人生格言:優於別人,並不高貴,真正的高貴應該是優於過去的自己。
如果感覺博主的文章還不錯的話,還請關注、點贊、收藏三連支持一下博主哦


專欄系列(點擊解鎖)學習路線(點擊解鎖)知識定位Python全棧白皮書 零基礎入門篇 以淺顯易懂的方式輕松入門,讓你徹底愛上Python的魅力。 語法進階篇 主要圍繞多線程編程、正則表達式學習、含貼近實戰的項目練習 。 自動化辦公篇 實現日常辦公軟件的自動化操作,節省時間、提高辦公效率。 自動化測試實戰篇 從實戰的角度出發,先人一步,快速轉型測試開發工程師。 數據庫開發實戰篇掌握關系型與非關系數據庫知識,提升數據庫實戰開發能力。 爬蟲入門與實戰更新中數據分析篇更新中前端入門+flask 全棧篇更新中django+vue全棧篇更新中拓展-人工智能入門更新中網絡安全之路 踩坑篇 記錄學習及演練過程中遇到的坑,便於後來居上者 網安知識掃盲篇 三天打魚,不深入了解原理,只會讓你成為腳本小子。 vulhub靶場漏洞復現 讓漏洞復現變得簡單,讓安全研究者更加專注於漏洞原理本身。 shell編程篇 不涉及linux基礎,最終案例會偏向於安全加固方向。 [待完結] WEB漏洞攻防篇2021年9月3日停止更新,轉戰先知社區等安全社區及小密圈 滲透工具使用集錦2021年9月3日停止更新,轉戰先知社區等安全社區及小密圈點點點工程師 測試神器 - Charles 軟件測試數據包抓包分析神器 測試神器 - Fiddler 一文學會 fiddle ,學不會倒立吃翔,稀得! 測試神器 - Jmeter 不僅是性能測試神器,更可用於搭建輕量級接口自動化測試框架。 RobotFrameWorkPython實現的自動化測試利器,該篇章僅介紹UI自動化部分。 Java實現UI自動化文檔寫於2016年,Java實現的UI自動化,仍有借鑒意義。 MonkeyRunner該工具目前的應用場景已不多,文檔已刪,為了排版好看才留著。


文章目錄

  • 從多張表中提取數據
  • 表連接的分類
  • 內連接的簡介與語法
    • 內連接衍生語法的運行效果
    • 內連接小練習 ①
    • 內連接小練習 ②

該章節的內容為多表連接查詢的內連接,因為 MySQL 是關系型數據庫,數據是拆分重組在多個數據表裡面的。所以我們勢必要從多個數據表中提取數據,通過 SQL 語句的內連接與外連接就能夠實現多表查詢了。這部分內容是需要我們重點學習的,學習的過程中會穿插多種的案例來強化對表連接的語法的運用。(簡單一點來說,其實就是從多張表裡查詢數據集,這一大段是我為了給摘要湊字數用的!)



從多張表中提取數據


  • 如果要從多張表中提取數據,必須指定其關聯的條件。如果沒有定義關聯的條件,就會出現無條件的連接,表與表之間的每一條數據都會進行匹配連接,於是就產生了笛卡爾積。
  • 舉個例子,比如說員工表中的某個員工 “deptno” 的部門編號所屬是 “10”,他能夠與 部門表中的 “10” 所進行連接,這就是連接條件;如果沒有關聯的條件,那就是無條件的連接表中的記錄了。見下方的 SQL 語句與圖片
SELECT empno, ename, dname
FROM t_emp
JOIN t_dept;
-- 這是一中造成笛卡爾積的錯誤語法示例
-- 這種例句實不符合現實邏輯的,所以我們在做表連接的時候一定要給出連接條件才行

  • 如果規定了 “連接條件” 的表連接語句,就不會出現笛卡爾積了。見下方的 SQL 語句與圖片
SELECT e.empno, e.ename, d.dname
FROM t_emp e JOIN t_dept d
ON e.deptno = d.deptno;
-- 使用 ON 子句 規定 "連接條件",這個條件就是 "員工表"中的"部門編號" 要與 "部門表"中的"部門編號"是相等的 
-- 需要注意的是,一定要針對連接的表與表之間起一個別名,否則直接使用 "ON deptno = deptno" 的話,MySQL 會不知道這個字段屬於哪個表
-- "t_emp" 表的別名為 "e" ; "t_dept" 表的別名為 "d"

從圖中我們可以看到沒有產生 "笛卡爾積" ,所以說最關鍵的地方就在於 "ON" 子句 規定了表連接。



表連接的分類


  • 表連接分為兩種:內連接與外連接
  • 內連接是結果集中只保留符合連接條件的記錄,不符合連接條件的記錄是絕對不會出現在結果集中的。(該章節主要介紹的就是 "內連接")
  • 外連接是不管符不符合連接條件,查詢到的記錄多會保留在結果集中。(至於為何會這樣,在後續的外連接章節再為大家詳細的介紹吧)


內連接的簡介與語法


  • 內連接是最常見的一種表連接,用於查詢多張關系表符合連接條件的記錄。(也就是符合連接條件的交集的部分)

內連接常用語法:

SELECT ...... FROM 表1 JOIN 表2 ON 連接條件;
-- 這是最標准的內連接語法,用 "JOIN" 關鍵字連接兩張表,"ON" 子句規定連接的條件。

內連接的變種語法①:

-- 思考一個問題先:既然 "ON" 子句規定的是連接條件篩選符合條件的記錄,那麼是否可以將連接條件寫在 "WHERE" 子句中呢?
-- 答案是完全可以的,與是就有了下面這種語法。
SELECT ...... FROM 表1 JOIN 表2 WHERE 連接條件;
-- 忽略 "ON" 子句,使用 "WHERE" 子句來替代

內連接的變種語法②:(基於 "變種語法①" 衍生出來的語法)

SELECT ...... FROM 表1, 表2 WHERE 連接條件;
-- 將 "JOIN" 關鍵字去掉,使用 "," 來代替。
-- 想連接多少張表,直接在 "FROM" 子句後面寫上表名即可,最後再 "WHERE" 子句裡定義好連接條件就可以了。


內連接衍生語法的運行效果


內連接衍生語法 SQL 語句示例如下①:

SELECT e.empno, e.ename, d.dname
FROM t_emp e JOIN t_dept d
WHERE e.deptno = d.deptno;
-- 將 "ON" 子句替換為 "WHERE" 子句

內連接衍生語法 SQL 語句示例如下②:

SELECT e.empno, e.ename, d.dname
FROM t_emp e , t_dept d
WHERE e.deptno = d.deptno;
-- 將 "JOIN" 關鍵字省略替換為 "," 逗號

PS:以上的寫法都是正確的內連接,在運行效率上沒有什麼區別。當然了,運行結果也都是一樣的。所以內連接攜程什麼樣子,完全就看個人的喜好、好惡了。



內連接小練習 ①


  • 查詢每個員工的工號、姓名、部門名稱、底薪、職位、工資等級
SELECT e.empno, e.ename, d.dname, e.sal, e.job, s.grade
FROM t_emp e
JOIN t_dept d ON e.deptno = d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND hisal;
-- 先利用 "員工表" 的 "部門編號" 關聯 "部門表" 的 "部門編號"
-- 再利用 "薪資等級表" 的 "薪資等級區間" 關聯 "員工表" 的 "月薪" 進行等級的匹配

同樣的,在這個小案例裡,我們也發現了一個問題:在內連接的數據表中,不一定必須要有同名的字段,只要字段之間符合邏輯關系就可以了,同樣可以把數據表連接起來。



內連接小練習 ②


  • 查詢與 “SCOTT” 相同部門的員工都有誰? 這裡需要注意兩個條件
    • 第一個未知:不知道 "SCOTT" 的部門是什麼?
    • 第二個未知:不知道誰與 "SCOTT" 是同一個部門的?
    • `關於未知的條件,大家可能第一時間想到的就是利用子查詢來實現,OK,那就先來使用 “子查詢” 實現

子查詢 SQL 示例如下:

SELECT ename
FROM t_emp
WHERE deptno = (SELECT deptno FROM t_emp WHERE ename = "SCOTT")
AND ename != "SCOTT";

這個查詢語句,還是非常好理解的哈。非常的符合人的思考邏輯,但是並不推薦這種寫法。因為子查詢的查詢效率是非常的慢的,因為 “FROM” 子句查詢的是 “t_emp” 員工表,從 “員工表” 提取出來的每一個記錄在 “WHERE” 子句裡進行條件匹配的時候會與 “子查詢” 都會重新執行一遍。當 “員工表” 裡存在大量的數據的時候(比如上萬條),則 “WHERE” 子句會將子查詢也都會重新執行一遍。

試想一下,這樣的效率是不是很低的,雖然說這樣的寫法非常的符合人的思考與邏輯思維,但是數據庫執行起來真的會效率非常的低下。所以這個時候,最好的解決方案就得需要利用 “表連接” 的方式來實現了!


內連接 SQL 示例如下:

SELECT e2.ename
FROM t_emp e1 JOIN t_emp e2 ON e1.deptno = e2.deptno
WHERE e1.ename = "SCOTT"
AND e2.ename != "SCOTT";
-- 可能大家會覺得 "員工表" 與 "員工表" (自己與自己)做表連接很奇怪,但是在實際語法上,這是可行且沒有錯誤的
-- 原理其實就是在同一個數據表中,分別提取不同的數據而已;如此語法在效率上要遠遠的超過子查詢的效率

從這個案例我們也同樣得到一個結果:“相同的數據表也是可以做表連接的在語法與邏輯關系上都沒有問題。”




  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved