最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL內(nèi)連接和外連接及七種SQL?JOINS的實(shí)現(xiàn)

 更新時(shí)間:2023年03月23日 15:52:02   作者:自牧君  
這篇文章主要介紹了Mysql內(nèi)連接和外連接的區(qū)別以及七種SQL?Joins的實(shí)現(xiàn),相信看完這篇文章你對SQL內(nèi)外連接的多表查詢就足夠理解了,需要的朋友可以參考下

1. 內(nèi)連接

內(nèi)連接:合并具有同一列的兩個(gè)以上的表的行,結(jié)果集中包含一個(gè)表與另一個(gè)表匹配的行。

說人話就是,查詢結(jié)果只包含它們匹配的行,不匹配的就不要了。

image-20220702101604060

【例子】查詢員工編號 employee_id 和其對應(yīng)的部門名稱 department_name 。其中部門名稱 department_name 只在部門表 departments 中,部門表 departments 如下圖所示:

image-20220702095656736

員工表 employees 和部門表 departments 通過部門編號 department_id 匹配連接起來。查詢代碼如下所示:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp, departments dept
WHERE emp.`department_id` = dept.`department_id`;

查詢結(jié)果:

image-20220702095037964

這里返回了 106 條記錄,但員工表 employees 總共是有107條記錄的,還少了 1 個(gè)人。原因是在員工表 employees 中,有一個(gè)員工的部門編號 department_id 為 (NULL) ,如下圖所示:

image-20220628114340768

而部門表 departments 中卻沒有值為 (NULL) 的部門編號 department_id ,因此這一行不匹配的數(shù)據(jù)就被丟棄不顯示了。如下圖所示,內(nèi)連接只包含兩個(gè)表匹配的行,即下圖中兩圓相交的部分:

image-20220702101604060


這種連接方式稱作內(nèi)連接。

2.外連接

外連接:合并具有同一列的兩個(gè)以上的表的行,結(jié)果集中除了包含一個(gè)表與另一個(gè)表匹配的行之外,還查詢到了左表或右表中不匹配的行。

外連接又分為以下三類:

左外連接:

兩個(gè)表在連接過程中除了返回滿足連接條件的行以外,還返回表中不滿足條件的行。如下圖中,左外連接就是左邊一整個(gè)圓。

image-20220702103203040

右外連接:

兩個(gè)表在連接過程中除了返回滿足連接條件的行以外,還返回表中不滿足條件的行。如下圖中,右外連接就是右邊一整個(gè)圓。

image-20220702103412464

滿外連接:

兩個(gè)表在連接過程中除了返回滿足連接條件的行以外,還返回左表和右表中不滿足條件的行。如下圖中,滿外連接就是兩個(gè)圓所有部分。

image-20220702104033072

【例子】根據(jù)部門編號 department_id ,查詢員工表 employees 中的所有員工編號 employee_id 和部門表 departments 中其對應(yīng)的部門名稱 department_name 。

【分析】凡是題目中出現(xiàn)要求查詢 所有 的字眼時(shí),都要打起十二分精神,這說明需要我們使用外連接查詢。實(shí)現(xiàn)外連接可使用SQL92和SQL99兩種語法,詳見[5.9 常用的SQL標(biāo)準(zhǔn)](# 5.9 常用的SQL標(biāo)準(zhǔn)) 。由于左表員工表 employees 共有 107 條數(shù)據(jù),而右表和左表匹配的數(shù)據(jù)僅有106條,需要使用左外連接。

【SQL92語法實(shí)現(xiàn)外連接】使用 (+) 。

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp, departments dept
WHERE emp.`department_id` = dept.`department_id`(+);

查詢結(jié)果:報(bào)錯(cuò)

image-20220702110332445

這是因?yàn)镸ySQL不支持SQL92語法的外連接操作。但是Oracle是支持的。所以沒有白學(xué)。MySQL只支持SQL99語法來實(shí)現(xiàn)多表查詢。

3. SQL99語法實(shí)現(xiàn)多表查詢

SQL99是指SQL在1999年頒布的SQL語法標(biāo)準(zhǔn)規(guī)范。盡管在之后發(fā)布了一系列新的SQL標(biāo)準(zhǔn),但在學(xué)習(xí)MySQL的過程中,主要掌握SQL99和SQL92就已經(jīng)足夠。從這節(jié)開始,MySQL的學(xué)習(xí)就算翻了半篇了,因?yàn)檫@一節(jié)之前都是SQL92語法,從這節(jié)開始,就專為SQL99語法。

SQL99語法使用 JOIN...ON 的方式實(shí)現(xiàn)多表查詢,且可以同時(shí)實(shí)現(xiàn)內(nèi)連接和三種外連接。MySQL是支持這種方式的。

3.1 SQL99實(shí)現(xiàn)內(nèi)連接

【例子:三表查詢】查詢員工的員工編號 employee_id 、 姓名 last_name 、部門名稱 department_name 和所在城市 city

【分析】這個(gè)需求需要 3 張表共同查詢。

image-20220628102343845

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`
FROM employees emp JOIN departments dept
ON emp.`department_id` = dept.`department_id`
JOIN locations loc
ON dept.`location_id` = loc.`location_id`;

SQL99語法就是加一張表,就 JOIN 一張表,并在 ON 后加連接條件。注意,這里的 JOIN 前面還省略了表示內(nèi)連接的關(guān)鍵字 INNER ,在使用內(nèi)連接時(shí)可以忽略。即代碼還可以寫成完整形式:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`
FROM employees emp INNER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
JOIN locations loc
ON dept.`location_id` = loc.`location_id`;

查詢結(jié)果:

image-20220702112216111

3.2 SQL99語法實(shí)現(xiàn)外連接

3.2.1 左外連接

【例子】根據(jù)部門編號 department_id ,查詢員工表 employees 中的所有員工編號 employee_id 和部門表 departments 中其對應(yīng)的部門名稱 department_name 。

【分析】由于左表是員工表 employees ,有107條數(shù)據(jù);而右表是部門表 departments ,有27條數(shù)據(jù)。題目要求是返回所有員工的107條查詢結(jié)果,因此這里使用左外連接。SQL99實(shí)現(xiàn)左連接接很簡單,只需要在 JOIN 前加上兩個(gè)關(guān)鍵字 LEFT OUTER 即可表示左外連接。如下代碼所示:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

其中,OUTER 可以省略,即寫成:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查詢結(jié)果:

image-20220702113429875

3.2.2 右外連接

舉一反三地,右外連接就是在 OUTER JOIN 前加一個(gè)關(guān)鍵字 RIGHT 。

SELECT emp.`employeed/master/img/d`;

查詢結(jié)果:

image-20220702114120274

查詢結(jié)果有122條記錄,這怎么解釋呢?再回想一下右外連接的定義:

兩個(gè)表在連接過程中除了返回滿足連接條件的行以外,還返回表中不滿足條件的行。如下圖中,右外連接就是右邊一整個(gè)圓。

image-20220702103412464

就不難理解,因?yàn)橛冶聿渴菦]有人的。而左、右表匹配的數(shù)據(jù)有106條 (兩圓相交部分) ,因此一共就有 106 + 16 = 122 106+16=122 106+16=122 條記錄。如下圖所示:

image-20220702115039010

這個(gè)例子能更好地幫助我們理解右外連接。

3.2.3 滿外連接

舉一反三地,滿外連接就是在 OUTER JOIN 前加一個(gè)關(guān)鍵字 FULL 。但很不幸,MySQL不支持SQL99的滿外連接語法,Oracle是支持的。

我們需要使用別的方法實(shí)現(xiàn)MySQL中的滿外連接,詳見4.6 滿外連接 。

4.總結(jié):七種SQL JOINS的實(shí)現(xiàn)

在開始本節(jié)之前,需要您了解SQL的 UNIONUNION ALL 的定義和實(shí)現(xiàn)。如果需要了解,可以閱讀這篇博文:《MySQL中 UNION 并的使用》。

4.1 內(nèi)連接

根據(jù)部門編號 department_id ,查詢員工表 employees 中的員工編號 employee_id 和部門表 departments 中其對應(yīng)的部門名稱 department_name 。

image-20220702160726511

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查詢結(jié)果:

image-20220702161222953

4.2 左外連接

image-20220702161147277

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查詢結(jié)果:

image-20220702113429875

4.3 右外連接

image-20220702161536952

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

image-20220702114120274

4.4 第四種JOIN

image-20220702161939516

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL;

查詢結(jié)果:

image-20220702162354954

作用是把員工表 employees 中,部門編號 department_id 為 (NULL) 的那一個(gè)員工查詢出來了,如下圖所示:

image-20220628114340768

4.5 第五種JOIN

image-20220702162922037

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, emp.`department_id`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

查詢結(jié)果:

image-20220702163303166

4.6 滿外連接

由于MySQL不支持SQL99語法的滿外連接。因此,我們的實(shí)現(xiàn)方式就是求

4.2 左外連接 和 4.5 第五種JOIN 的并 UNION ALL 即可;或者求4.3 右外連接 和 4.4 第四種JOIN 的并 UNION ALL 也行,都是一樣的效果。

方法一

image-20220702161147277

image-20220702162922037

方法二

image-20220702161536952

image-20220702161939516

image-20220702175402115

# 方法一
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_id`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

# 方法二
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`employee_id` = dept.`department_id`
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`employee_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL;

查詢結(jié)果:

image-20220702180747613

4.7 第七種JOIN

實(shí)現(xiàn)下面這個(gè)操作只需要把 4.4 第四種JOIN 和 4.5 第五種JOIN 求 UNION ALL 即可。

image-20220702181458219

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

查詢結(jié)果:

image-20220702182142123

到此這篇關(guān)于MySQL內(nèi)連接和外連接及七種SQL JOINS的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL內(nèi)連接和外連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql修改數(shù)據(jù)庫默認(rèn)路徑無法啟動問題的解決

    mysql修改數(shù)據(jù)庫默認(rèn)路徑無法啟動問題的解決

    這篇文章主要給大家介紹了關(guān)于mysql修改數(shù)據(jù)庫默認(rèn)路徑無法啟動問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • delete、truncate、drop的區(qū)別以及該如何選擇

    delete、truncate、drop的區(qū)別以及該如何選擇

    這篇文章主要給大家介紹了關(guān)于delete、truncate、drop的區(qū)別以及該如何選擇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • mysql中文排序注意事項(xiàng)與實(shí)現(xiàn)方法

    mysql中文排序注意事項(xiàng)與實(shí)現(xiàn)方法

    mysql在查詢字符串時(shí)是大小寫不敏感的,在編繹mysql時(shí)一般以ISO-8859字符集作為默認(rèn)的字符集,因此在比較過程中中文編碼字符大小寫轉(zhuǎn)換造成了這種現(xiàn)象,比較應(yīng)急的方法是對于包含中文的字段加上"binary"屬性,使之作二進(jìn)制比較
    2008-09-09
  • mysql處理添加外鍵時(shí)提示error 150 問題的解決方法

    mysql處理添加外鍵時(shí)提示error 150 問題的解決方法

    當(dāng)你試圖在mysql中創(chuàng)建一個(gè)外鍵的時(shí)候,這個(gè)出錯(cuò)會經(jīng)常發(fā)生,這是非常令人沮喪的
    2011-11-11
  • MySQL導(dǎo)入sql腳本錯(cuò)誤:2006 解決方法

    MySQL導(dǎo)入sql腳本錯(cuò)誤:2006 解決方法

    本文給大家分享的是在使用mysql導(dǎo)入數(shù)據(jù)的時(shí)候,提示腳本錯(cuò)誤2006 MySQL server has gone away的解決方法,非常實(shí)用,有需要的小伙伴,可以參考下。
    2015-07-07
  • 深入mysql慢查詢設(shè)置的詳解

    深入mysql慢查詢設(shè)置的詳解

    本篇文章是對mysql慢查詢設(shè)置進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 逐步講解MySQL中定時(shí)事件計(jì)劃的創(chuàng)建

    逐步講解MySQL中定時(shí)事件計(jì)劃的創(chuàng)建

    這篇文章主要介紹了MySQL中定時(shí)事件計(jì)劃的創(chuàng)建,包括對于MySQL定時(shí)器的用戶事件權(quán)限作出了解釋說明,需要的朋友可以參考下
    2016-05-05
  • MySQL 索引的優(yōu)缺點(diǎn)以及創(chuàng)建索引的準(zhǔn)則

    MySQL 索引的優(yōu)缺點(diǎn)以及創(chuàng)建索引的準(zhǔn)則

    這篇文章主要介紹了MySQL 索引的優(yōu)劣以及創(chuàng)建索引的準(zhǔn)則,幫助大家更好的理解和使用MySQL 索引,感興趣的朋友可以了解下
    2020-09-09
  • MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL中查詢JSON字段的實(shí)現(xiàn)示例

    MySQL自5.7版本起,對JSON數(shù)據(jù)類型提供了全面的支持,本文主要介紹了MySQL中查詢JSON字段的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • MySQL實(shí)例講解子查詢的使用

    MySQL實(shí)例講解子查詢的使用

    所謂子查詢是指在一個(gè)查詢中嵌套了其他的若干查詢,即在一個(gè)SELECT查詢語句的WHERE或FROM子句中包含另一個(gè)SELECT查詢語句,下面這篇文章主要給大家介紹了關(guān)于MySQL子查詢的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評論

景谷| 靖远县| 田林县| 贵港市| 信阳市| 棋牌| 陇西县| 屯昌县| 平塘县| 酉阳| 内乡县| 吉隆县| 博乐市| 波密县| 徐闻县| 武冈市| 云浮市| 即墨市| 保靖县| 浦县| 崇阳县| 游戏| 和林格尔县| 富源县| 电白县| 清远市| 胶南市| 朝阳市| 金昌市| 香格里拉县| 红桥区| 万安县| 磴口县| 名山县| 郧西县| 永寿县| 云梦县| 秦皇岛市| 镇康县| 林甸县| 曲麻莱县|