連接的原理(待修改)

搞數據庫?個避不開的概念就是Join,翻譯成中?就是連接。

相信很多?伙伴在初學連接的時候有些?臉懵逼,理解了連接的語義之后?可能不明?各個表中的記 錄到底是怎么連起來的,以?于在使?的時候常常陷?下邊兩種誤區:

誤區?:業務?上,管他三七???,再復雜的查詢也?在?個連接語句中搞定。

誤區?:敬?遠之,上次 DBA 那給報過來的慢查詢就是因為使?了連接導致的,以后再也不敢?了。

連接簡介 連接的本質 為了故事的順利發展,我們先建?兩個簡單的表并給它們填充?點數據:

mysql> CREATE TABLE t1 (m1 int, n1 char(1));

Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE t2 (m2 int, n2 char(1));

Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');

Query OK, 3 rows affected (0.00 sec) Records: 3? Duplicates: 0? Warnings: 0

mysql> INSERT INTO t2 VALUES(2, 'b'), (3, 'c'), (4, 'd');

Query OK, 3 rows affected (0.00 sec) Records: 3? Duplicates: 0? Warnings: 0

我們成功建?了t1、t2兩個表,這兩個表都有兩個列,?個是INT類型的,?個是CHAR(1)類型的,填充好數據的兩個表?這樣:

mysql> SELECT * FROM t1;

+------+------+

| m1?? | n1?? |

+------+------+

|??? 1 | a??? |

|??? 2 | b??? |

|??? 3 | c??? |

+------+------+

3 rows inset (0.00 sec)

mysql> SELECT * FROM t2;

+------+------+

| m2?? | n2?? |

+------+------+

|??? 2 | b??? |

|??? 3 | c??? |

|??? 4 | d??? |

+------+------+

3 rows inset (0.00 sec)

連接的本質就是把各個連接表中的記錄都取出來依次匹配的組合加?結果集并返回給?戶。所以我們把t1和t2兩個表連接起來的過程如下圖所示:

這個過程看起來就是把t1表的記錄和t2的記錄連起來組成新的更?的記錄,所以這個查詢過程稱之為連接查詢。連接查詢的結果集中包含?個表中的每?條記錄 與另?個表中的每?條記錄相互匹配的組合,像這樣的結果集就可以稱之為笛卡爾積。因為表t1中有3條記錄,表t2中也有3條記錄,所以這兩個表連接之后的笛卡 爾積就有3×3=9?記錄。在MySQL中,連接查詢的語法也很隨意,只要在FROM語句后邊跟多個表名就好了,?如我們把t1表和t2表連接起來的查詢語句可以寫成這 樣:

?

連接過程簡介

如果我們樂意,我們可以連接任意數量張表,但是如果沒有任何限制條件的話,這些表連接起來產?的笛卡爾積可能是?常巨?的。??說3個100?記錄的表連接 起來產?的笛卡爾積就有100×100×100=1000000?數據!所以在連接的時候過濾掉特定記錄組合是有必要的,在連接查詢中的過濾條件可以分成兩種:

涉及單表的條件

這種只設計單表的過濾條件我們之前都提到過?萬遍了,我們之前也?直稱為搜索條件,?如t1.m1 > 1是只針對t1表的過濾條件,t2.n2 < 'd'是只針對t2表 的過濾條件。

涉及兩表的條件

這種過濾條件我們之前沒?過,?如t1.m1 = t2.m2、t1.n1 > t2.n2等,這些條件中涉及到了兩個表,我們稍后會仔細分析這種過濾條件是如何使?的哈。 下邊我們就要看?下攜帶過濾條件的連接查詢的?致執?過程了,??說下邊這個查詢語句

SELECT * FROM t1, t2 WHERE t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd';

在這個查詢中我們指明了這三個過濾條件:

t1.m1 > 1

t1.m1 = t2.m2

t2.n2 < 'd'

那么這個連接查詢的?致執?過程如下:

1. ?先確定第?個需要查詢的表,這個表稱之為驅動表。怎樣在單表中執?查詢語句我們在前?章都嘮叨過了,只需要選取代價最?的那種訪問?法去執?單表 查詢語句就好了(就是說從const、ref、ref_or_null、range、index、all這些執??法中選取代價最?的去執?查詢)。此處假設使?t1作為驅動表,那么就 需要到t1表中找滿?t1.m1 > 1的記錄,因為表中的數據太少,我們也沒在表上建??級索引,所以此處查詢t1表的訪問?法就設定為all吧,也就是采?全 表掃描的?式執?單表查詢。關于如何提升連接查詢的性能我們之后再說,現在先把基本概念捋清楚哈。所以查詢過程就如下圖所示:

我們可以看到,t1表中符合t1.m1 > 1的記錄有兩條。

2. 針對上?步驟中從驅動表產?的結果集中的每?條記錄,分別需要到t2表中查找匹配的記錄,所謂匹配的記錄,指的是符合過濾條件的記錄。因為是根據 t1表中的記錄去找t2表中的記錄,所以t2表也可以被稱之為被驅動表。上?步驟從驅動表中得到了2條記錄,所以需要查詢2次t2表。此時涉及兩個表的 列的過濾條件t1.m1 = t2.m2就派上?場了:

當t1.m1 = 2時,過濾條件t1.m1 = t2.m2就相當于t2.m2 = 2,所以此時t2表相當于有了t2.m2 = 2、t2.n2 < 'd'這兩個過濾條件,然后到t2表中 執?單表查詢。

當t1.m1 = 3時,過濾條件t1.m1 = t2.m2就相當于t2.m2 = 3,所以此時t2表相當于有了t2.m2 = 3、t2.n2 < 'd'這兩個過濾條件,然后到t2表中 執?單表查詢。

所以整個連接查詢的執?過程就如下圖所示:?

?

?從上邊兩個步驟可以看出來,我們上邊嘮叨的這個兩表連接查詢共需要查詢1次t1表,2次t2表。當然這是在特定的過濾條件下的結果,如果我們把t1.m1 > 1 這個條件去掉,那么從t1表中查出的記錄就有3條,就需要查詢3次t2表了。也就是說在兩表連接查詢中,驅動表只需要訪問?次,被驅動表可能被訪問多 次。

內連接和外連接

為了?家更好理解后邊內容,我們先創建兩個有現實意義的表,

CREATE TABLE student ( ???

number INT NOT NULL AUTO_INCREMENT COMMENT '學號', ???

name VARCHAR(5) COMMENT '姓名', ???

major VARCHAR(30) COMMENT '專業', ???

PRIMARY KEY (number) ) Engine=InnoDB CHARSET=utf8 COMMENT '學?信息表';

CREATE TABLE score ( ???

number INT COMMENT '學號', ???

subject VARCHAR(30) COMMENT '科?', ???

score TINYINT COMMENT '成績', ???

PRIMARY KEY (number, score) ) Engine=InnoDB CHARSET=utf8 COMMENT '學?成績表';

我們新建了?個學?信息表,?個學?成績表,然后我們向上述兩個表中插??些數據,為節省篇幅,具體插?過程就不嘮叨了,插?后兩表中的數據如下:

?

?現在我們想把每個學?的考試成績都查詢出來就需要進?兩表連接了(因為score中沒有姓名信息,所以不能單純只查詢score表)。連接過程就是從student 表中取出記錄,在score表中查找number相同的成績記錄,所以過濾條件就是student.number = socre.number,整個查詢語句就是這樣:

mysql> SELECT * FROM student, score WHERE student.number = score.number;

?

?字段有點多哦,我們少查詢?個字段:

?從上述查詢結果中我們可以看到,各個同學對應的各科成績就都被查出來了,可是有個問題,史珍?同學,也就是學號為20180103的同學因為某些原因沒有參 加考試,所以在score表中沒有對應的成績記錄。那如果?師想查看所有同學的考試成績,即使是缺考的同學也應該展示出來,但是到?前為?我們介紹的連 接查詢是?法完成這樣的需求的。我們稍微思考?下這個需求,其本質是想:驅動表中的記錄即使在被驅動表中沒有匹配的記錄,也仍然需要加?到結果集。 為了解決這個問題,就有了內連接和外連接的概念:

對于內連接的兩個表,驅動表中的記錄在被驅動表中找不到匹配的記錄,該記錄不會加?到最后的結果集,我們上邊提到的連接都是所謂的內連接。

對于外連接的兩個表,驅動表中的記錄即使在被驅動表中沒有匹配的記錄,也仍然需要加?到結果集。

在MySQL中,根據選取驅動表的不同,外連接仍然可以細分為2種:

左外連接

選取左側的表為驅動表。

右外連接

選取右側的表為驅動表。

可是這樣仍然存在問題,即使對于外連接來說,有時候我們也并不想把驅動表的全部記錄都加?到最后的結果集。這就犯難了,有時候匹配失敗要加?結果 集,有時候?不要加?結果集,這咋辦,有點?愁啊。。。噫,把過濾條件分為兩種不就解決了這個問題了么,所以放在不同地?的過濾條件是有不同語義 的:

WHERE?句中的過濾條件

WHERE?句中的過濾條件就是我們平時?的那種,不論是內連接還是外連接,凡是不符合WHERE?句中的過濾條件的記錄都不會被加?最后的結果集。

ON?句中的過濾條件

對于外連接的驅動表的記錄來說,如果?法在被驅動表中找到匹配ON?句中的過濾條件的記錄,那么該記錄仍然會被加?到結果集中,對應的被驅動表記 錄的各個字段使?NULL值填充。

需要注意的是,這個ON?句是專?為外連接驅動表中的記錄在被驅動表找不到匹配記錄時應不應該把該記錄加?結果集這個場景下提出的,所以如果把ON ?句放到內連接中,MySQL會把它和WHERE?句?樣對待,也就是說:內連接中的WHERE?句和ON?句是等價的。

?般情況下,我們都把只涉及單表的過濾條件放到WHERE?句中,把涉及兩表的過濾條件都放到ON?句中,我們也?般把放到ON?句中的過濾條件也稱之為連 接條件。

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

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

相關文章

linux磁盤清理

目錄 排查過程1、查看磁盤占用情況2. 按照占用大小進行倒排-當前目錄及其子目錄3.當前目錄磁盤占用情況 清理命令 排查過程 1、查看磁盤占用情況 df -hdf -h 命令用于顯示磁盤空間的使用情況&#xff0c;以人類可讀的方式呈現&#xff0c;其中&#xff1a;df 是 “disk free”…

“AI就緒”新計劃,亞馬遜云科技到2025年向200萬人提供免費AI技能培訓

AI就緒&#xff08;AI Ready&#xff09;計劃 到2025年為全球200萬人提供 免費人工智能&#xff08;AI&#xff09;技能培訓和教育資源 亞馬遜云科技宣布啟動“AI就緒&#xff08;AI Ready&#xff09;”計劃&#xff0c;旨在到2025年為全球200萬人提供免費人工智能&#xff08…

Python與設計模式--適配器模式

7-Python與設計模式–適配器模式 一、外包人員系統兼容 假設某公司A與某公司B需要合作&#xff0c;公司A需要訪問公司B的人員信息&#xff0c;但公司A與公司B協議接口不同&#xff0c; 該如何處理&#xff1f;先將公司A和公司B針對各自的人員信息訪問系統封裝了對象接口。cla…

易點易動固定資產管理系統:全生命周期管理的理想選擇

在現代企業中&#xff0c;固定資產管理是一項至關重要的任務。為了確保企業的資產安全、提高資產利用率&#xff0c;全面管理固定資產的生命周期至關重要。易點易動固定資產管理系統為企業提供了一種全面的解決方案&#xff0c;實現了從固定資產申購、采購、入庫、領用、退庫、…

linux 內存回收mglru算法代碼注釋2

mglru與原lru算法的兼容 舊的lru算法有active與inactive兩代lru&#xff0c;可參考linux 內存回收代碼注釋&#xff08;未實現多代lru版本&#xff09;-CSDN博客 新的算法在引入4代lru的同時&#xff0c;還引入了tier的概念。 新舊算法的切換的實現在lru_gen_change_state&a…

ELK企業級日志分析平臺——elasticsearch

集群部署 文檔&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html 下載&#xff1a;https://elasticsearch.cn/download/ 主機 ip 角色 k8s1 192.168.92.11 cerebro elk1 192.168.92.31 elasticsearch elk2 192.168.92.32 elasti…

數據庫實驗五 數據庫設計

數據庫實驗五 數據庫設計 一、實驗目的二、實驗內容三、實驗內容四、驗證性實驗五、設計性實驗 一、實驗目的 1.了解E-R圖構成要素以及各要素圖元。 2.掌握概念模型E-R圖的繪制方法。 3.掌握概念模型向邏輯模型的轉換原則和步驟。 4.運用sql編程實現 二、實驗內容 1.選取一個…

線段樹---數據結構學習

線段樹的教程可以參照線段樹 這里推薦 https://oi-wiki.org/ 這個網站&#xff0c;數據結構講的非常透。 線段樹學了很多次忘了很多次&#xff0c;這次打算記錄一下以后方便回顧(leetcode這類題遇見的不算特別多)。 樣板例題 leltcode-307 #題目樣板 class NumArray {private …

醫院手術麻醉信息系統全套源碼,自主版權,支持二次開發

醫院手術麻醉信息系統全套商業源碼&#xff0c;自主版權&#xff0c;支持二次開發 手術麻醉信息系統是HIS產品的中的一個組成部分&#xff0c;主要應用于醫院的麻醉科&#xff0c;屬于電子病歷類產品。醫院麻醉監護的功能覆蓋整個手術與麻醉的全過程&#xff0c;包括手術申請與…

人工智能中的文本分類:技術突破與實戰指導

在本文中&#xff0c;我們全面探討了文本分類技術的發展歷程、基本原理、關鍵技術、深度學習的應用&#xff0c;以及從RNN到Transformer的技術演進。文章詳細介紹了各種模型的原理和實戰應用&#xff0c;旨在提供對文本分類技術深入理解的全面視角。 關注TechLead&#xff0c;分…

Hadoop發行版 Cloudera CDH 6.3.2及CM 安裝包下載(阿里云盤 不限速)

CDH&#xff08;全稱Cloudera’s Distribution, including Apache Hadoop&#xff09;是由Cloudera公司構建的Hadoop穩定發行版&#xff0c;不僅含有 Apache Hadoop&#xff0c;還整合了Hive、Spark等組件。 由于CDH已停止維護&#xff0c;且Cloudera不再為CDH提供免費的下載服…

git 使用過程錯誤集合

文章目錄 1、git-credential-manager-core was renamed to git-credential-manager2、credential-manager-core is not a git command. See git --help. 1、git-credential-manager-core was renamed to git-credential-manager 出現以下提示建議盡快更新您的 Git 配置以使用新…

回歸預測 | MATLAB實現SCN隨機配置網絡多輸入單輸出回歸預測

回歸預測 | MATLAB實現SCN隨機配置網絡多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現SCN隨機配置網絡多輸入單輸出回歸預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 Matlab實現SCN隨機配置網絡多變量回歸預測 1.data為數據集&#xff0c;7個輸入特征&#xff0…

基于Python實現汽車銷售數據可視化+預測【500010086.1】

導入模塊 import numpy as np import pandas as pd from pylab import mpl import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns設置全局字體 plt.rcParams[font.sans-serif][kaiti]獲取數據 total_sales_df pd.read_excel(r"./data/中…

獨孤思維:看了那么多課程,還在問怎么賺錢的都是廢物

你捫心自問&#xff1a; 為什么自己看了那么多賺錢項目&#xff0c;買了那么多課程&#xff0c;對標了那么多大咖&#xff0c;依舊賺不到錢&#xff1f; 是自己智商欠缺嗎&#xff0c;是自己能力不行嗎&#xff0c;是自己沒有時間嗎&#xff1f; 智商欠缺&#xff0c;沒有誰…

機器學習第13天:模型性能評估指標

??主頁 Nowl &#x1f525;專欄《機器學習實戰》 《機器學習》 &#x1f4d1;君子坐而論道&#xff0c;少年起而行之 文章目錄 交叉驗證 保留交叉驗證 k-折交叉驗證 留一交叉驗證 混淆矩陣 精度與召回率 介紹 精度 召回率 區別 使用代碼 偏差與方差 介紹 區…

zerotier 搭建 moon中轉服務器 及 自建planet

搭建moon 服務器 環境準備 # 安裝依賴 yum install wget gcc gcc-c git -y yum install json-devel -y# 下載及安裝 curl -s https://install.zerotier.com/ | sudo bash節點ID 配置 配置moon.json文件 cd /var/lib/zerotier-one/# 導出依賴 zerotier-idtool initmoon ide…

SpringBoot項目連接,有Kerberos認證的Kafka

在連接Kerberos認證kafka之前&#xff0c;需要了解Kerberos協議 二、什么是Kerberos協議 Kerberos是一種計算機網絡認證協議 &#xff0c;其設計目標是通過密鑰系統為網絡中通信的客戶機(Client)/服務器(Server)應用程序提供嚴格的身份驗證服務&#xff0c;確保通信雙方身份的真…

Spring Boot 升級3.x 指南

Spring Boot 升級3.x 指南 1. 升級思路 先創建一個parent項目&#xff0c;打包類型為pom&#xff0c;繼承自spring boot的parent項目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

歷時三個月,我發布了一款外賣返錢小程序

近幾年&#xff0c;推廣外賣紅包爆火&#xff0c;各種推廣外賣紅包的公眾號層出不窮。于是&#xff0c;我就在想外賣紅包究竟是怎么一回事。就這樣&#xff0c;我帶著問題開始了關于外賣紅包的研究。 在研究的過程中&#xff0c;我開始了解商品聯盟、推廣分成、cps等一系列相關…