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

MySQL復(fù)合查詢(多表查詢、子查詢)的實(shí)現(xiàn)

 更新時(shí)間:2023年12月10日 09:33:42   作者:Ggggggtm  
MySQL復(fù)合查詢是指在一個(gè)SQL語(yǔ)句中使用多個(gè)查詢條件,以過(guò)濾和檢索數(shù)據(jù),本文主要介紹了MySQL復(fù)合查詢(多表查詢、子查詢)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

在對(duì)本篇文章學(xué)習(xí)之前,首先說(shuō)明一下本篇文章所用到表的結(jié)構(gòu)和內(nèi)容。具體如下:

員工表emp:

部門表dept:

薪水表salgrade:

一、基本查詢回顧

查詢工資高于500或崗位為MANAGER的雇員,同時(shí)還要滿足他們的姓名首字母為大寫的J 

  首先確定,上述所需篩選的信息都在一行表中。其次,分析出 工資 > 500 or job = MANAGER。我們先來(lái)查詢出滿足 工資 > 500 or job = MANAGER 的員工。具體如下:

  同時(shí),我們還需要滿足所查詢到的員工的姓名首字母為大寫的J,很明顯是模糊查詢。具體如下圖:

按照部門號(hào)升序而雇員的工資降序排序

  這個(gè)需求就是簡(jiǎn)單的排序即可。注意所需排序的先后順序。具體如下圖:

使用年薪進(jìn)行降序排序

  首先我們需要計(jì)算出來(lái)年薪。年薪 = 月薪(sal)*12 + 年終獎(jiǎng)(comm)。那么我們直接就對(duì)其進(jìn)行排序即可。但是需要注意的是:NULL并不能參與計(jì)算,這時(shí)候需要內(nèi)置函數(shù)ifnull來(lái)進(jìn)行判斷其是否為NULL,如果為NULL直接加0即可。 具體如下:

顯示工資最高的員工的名字和工作崗位 

  我們可以很容易的查找到最高工資是多少,然后再根據(jù)最高工資去找對(duì)應(yīng)的員工的名字和工作崗位。具體如下圖:

  上述用了兩條SQL語(yǔ)句確實(shí)能夠查詢出我們想要的結(jié)果。但是好像不太優(yōu)雅。能不能用一條語(yǔ)句將所需結(jié)果查詢出來(lái)呢?答案是可以的。我們可以用子查詢。什么是子查詢呢?在 MySQL 中,子查詢是指在一個(gè)查詢語(yǔ)句中嵌套另一個(gè)查詢語(yǔ)句。子查詢可以用于過(guò)濾結(jié)果集、作為計(jì)算字段的數(shù)據(jù)源、與外部查詢進(jìn)行比較等多種情況。下面我們用子查詢來(lái)解決這個(gè)需求。具體如下:

顯示工資高于平均工資的員工信息 

  這個(gè)題目的需求與上一個(gè)題目的需求很相似。我們可以先獲取平均工資,在查詢比平均工資高的員工,一樣是用子查詢。具體如下:

顯示每個(gè)部門的平均工資和最高工資

  我們看到需求是每個(gè)部門,那么首先肯定要按部門號(hào)進(jìn)行分組。其次我們?cè)俨樵兠總€(gè)部門的平均工資和最高工資。具體如下圖:

顯示平均工資低于2000的部門號(hào)和它的平均工資

  首先我們很容易可以找到各個(gè)部門的平均工資,然后只需要再增加一個(gè)條件判斷即可。具體如下:

顯示每種崗位的雇員總數(shù),平均工資  

  注意是每種崗位,所以需要根據(jù)job進(jìn)行分組查詢。具體如下圖:

二、多表查詢

2、1 笛卡爾積

在MySQL中,多表查詢的笛卡爾積(Cartesian Product)是指在沒(méi)有使用任何條件或連接的情況下,將兩個(gè)或多個(gè)表中的所有行進(jìn)行組合的結(jié)果集。這種情況通常是在沒(méi)有明確指定連接條件或者WHERE子句的情況下進(jìn)行的查詢,但在實(shí)際應(yīng)用中,很少需要或者希望獲得笛卡爾積結(jié)果。

以下是一個(gè)簡(jiǎn)單的說(shuō)明以及一個(gè)示例來(lái)解釋笛卡爾積:

笛卡爾積的性質(zhì): 笛卡爾積將參與查詢的每個(gè)表的所有可能組合都返回,即第一個(gè)表的每一行都會(huì)與第二個(gè)表的每一行進(jìn)行組合,生成的結(jié)果集的行數(shù)為各個(gè)表行數(shù)的乘積。

示例:我們現(xiàn)在將員工表和部門表進(jìn)行笛卡爾積。具體如下:

其實(shí)我們也不難看出,規(guī)律就是如下圖:

  但是往往我們用笛卡爾積所獲取的表有很多的數(shù)據(jù)冗余。因?yàn)樗鼤?huì)產(chǎn)生大量的冗余數(shù)據(jù)并且效率低下。為了避免得到笛卡爾積,我們需要正確地使用連接條件(例如使用where條件來(lái)篩選掉無(wú)用信息)來(lái)明確指定表之間的關(guān)聯(lián)關(guān)系。例如,在對(duì)上述的員工表和部門表進(jìn)行笛卡爾積時(shí),一個(gè)員工不可能會(huì)有多個(gè)部門號(hào),所以只有部門號(hào)相同的才算是有效的信息。最終有效結(jié)果如下圖:

2、2 多表查詢練習(xí)

顯示部門號(hào)為 10 的部門名,員工名和工資   我們發(fā)現(xiàn)員工表中并沒(méi)有我們想要的部門名,所以我們需要進(jìn)行多表查詢。需要將員工表和部門表進(jìn)行合并查詢。然后在查詢部門號(hào)為10的部門名、員工名和工資。具體如下:

這里再說(shuō)明一下:上述 SQL語(yǔ)句中 from 后 的 t1 和 t2 是對(duì) emp 和 dept 表進(jìn)行了重命名,后續(xù)都可以 用我們重命名的名字去代替表名字。其次是當(dāng)我們將兩張表拼接到一塊后,表中會(huì)有 兩個(gè)deptno,所以我們?cè)谑褂胐eptno時(shí),需要指定是那個(gè)表的。

顯示各個(gè)員工的姓名,工資,及工資級(jí)別

   我們發(fā)現(xiàn)工資等級(jí)只有在薪資表中有,所以我們需要進(jìn)行多表查詢。當(dāng)我們將員工表與薪水表進(jìn)行笛卡爾積后,發(fā)現(xiàn)很多數(shù)據(jù)是冗余的。只有薪資符合它所在的等級(jí)區(qū)間才是有效的。所以我們的查尋結(jié)果如下:

三、自連接

  我們上述講解的是兩張不同的表進(jìn)行連接。那么可以自己與自己的表進(jìn)行連接嗎?答案是可以的!MySQL中的自連接是指在同一張表中進(jìn)行連接操作。這種連接通常用于將表中的數(shù)據(jù)與自身進(jìn)行比較或者組合。自連接可以通過(guò)將表與自身進(jìn)行別名來(lái)實(shí)現(xiàn),從而使得查詢可以使用表中的不同行進(jìn)行比較和操作。 我們看如下例子:

  通過(guò)上圖我們發(fā)現(xiàn),當(dāng)進(jìn)行自連接時(shí),如果不對(duì)表進(jìn)行取別名,那么將不能夠進(jìn)行自連接。必須對(duì)表進(jìn)行取別名。自連接的使用場(chǎng)景是什么呢?我們看如下例子。

 顯示員工FORD的上級(jí)領(lǐng)導(dǎo)的編號(hào)和姓名(mgr是員工領(lǐng)導(dǎo)的編號(hào)--empno)

  員工是在emp表中,上級(jí)領(lǐng)導(dǎo)也是員工,也在emp表中。我們可能首先會(huì)想到用子查詢來(lái)解決,相對(duì)簡(jiǎn)單。具體如下:

  但是我們也不難發(fā)現(xiàn),要查詢的兩個(gè)條件都是在emp表中,那么我們就可以對(duì)emp表進(jìn)行自連接。我們現(xiàn)在把兩張表想象成一張表是員工表,另一張表是領(lǐng)導(dǎo)表。我們現(xiàn)在需要的有效信息是:?jiǎn)T工表中的mgr = 領(lǐng)導(dǎo)表中的empno即可。篩選出有效信息后在選擇員工表中的員工為FORD。具體如下:

四、子查詢

  子查詢的概念在上文中已經(jīng)解釋過(guò),這里就不再解釋。在子查詢的子句中,子句查詢出的結(jié)果可能不止是一行記錄,也有可能是多行記錄,還有就是多列的情況。下面我們一一來(lái)分析一下。

4、1 單行子查詢

顯示 SMITH 同一部門的員工

  首先將SMITH的部門號(hào)查出,然后再將該部門的所有員工篩選出即可。具體如下:

4、2 多行子查詢

查詢和10號(hào)部門的工作崗位相同的雇員的名字,崗位,工資,部門號(hào),但是不包含10自己的

  我們可以先查詢出10號(hào)部門的工作崗位,具體如下:

  然后我們?cè)龠M(jìn)行篩選與上圖中崗位相同的雇員的信息。當(dāng)我們想用子查詢時(shí),發(fā)現(xiàn)上圖的崗位并不是一個(gè),那該怎么辦呢?這時(shí)候可以用到 in關(guān)鍵字。in關(guān)鍵字用于檢查某個(gè)值是否在一組值中。剛好符合我們的需求。具體如下:

顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號(hào)

  題目的要求:找出比30號(hào)部門所有員工工資都好的員工信息。也就是比30號(hào)部門最高工資還要高的部門。我們首先找出30號(hào)部門的員工最高工資,再篩選出薪資比它大的即可。具體如下:

  我們也可以使用all關(guān)鍵字。all關(guān)鍵字用于比較外部查詢和子查詢返回的所有值。當(dāng)使用 all關(guān)鍵字時(shí),外部查詢的值必須滿足子查詢返回的所有值的條件才會(huì)被選中。具體如下:

顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(hào)(包含自己部門的員工)

注意:題目中的任意員工,是指的只要有比部門30中的員工工資高的即滿足條件。通俗理解:找出比 部門號(hào)30的員工中最低工資 高的員工。這時(shí)可以用any關(guān)鍵字。 any關(guān)鍵字用于比較外部查詢和子查詢返回的任意一個(gè)值。 當(dāng)使用 any  時(shí),外部查詢的值只需要滿足子查詢返回的任意一個(gè)值的條件即可被選中。具體如下:

4、3 多列子查詢

  單行子查詢是指子查詢只返回單列,單行數(shù)據(jù);多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語(yǔ)句。下面我們來(lái)看一個(gè)例子。

查詢和 SMITH 的部門和崗位完全相同的所有雇員,不含 SMITH 本人

  我們可以先查詢出來(lái)SMITH的部門和崗位。如下圖:

  我們發(fā)現(xiàn),要和SMITH的部門和崗位完全相同,是多列的情況。這該怎么辦呢?我們看如下:

  但是題目中還要求了不能包含SMITH本人。所以再把SMITH本人去掉即可。結(jié)果如下:

4、4 在from子句中使用子查詢

我們之前學(xué)到的from后都是跟的表的名字。在from子句中使用子查詢?cè)趺蠢斫饽??使用子查詢無(wú)非就是一個(gè)查詢語(yǔ)句中嵌套了一個(gè)語(yǔ)句。我們就稱之為子句。那么子句查詢出來(lái)的結(jié)果我們也可看成一張表,可與其他物理上實(shí)力存在的表進(jìn)行連接。這就是在from子句中使用子查詢的意思。下面我們結(jié)合實(shí)際例子來(lái)理解一下。

顯示每個(gè)高于自己部門平均工資的員工的姓名、部門、工資、平均工資

  我們可以很容易得到每個(gè)部門的平均工資,具體如下:

  我們可以把上述所查詢出來(lái)的結(jié)果當(dāng)作一個(gè)表,再與emp表進(jìn)行連接即可。具體如下:

  對(duì)我們來(lái)說(shuō),有用的信息就是emp.deptno = tmp.deptno。那么查詢出來(lái)的結(jié)果如下:

  現(xiàn)在我們只需要emp.sal > tmp.平均工資( avg(sal)) 即可,就是題目所要求的答案,具體如下:

顯示每個(gè)部門的信息(部門名,編號(hào),地址)和人員數(shù)量

  我們發(fā)現(xiàn),部門名和地址都在部門表中,而我們想要統(tǒng)計(jì)每個(gè)部門的人員數(shù)量還需要在emp表中統(tǒng)計(jì)。我們先來(lái)統(tǒng)計(jì)每個(gè)部門的人員數(shù)量,具體如下:

  我們?cè)賹⑸鲜霾樵兊慕Y(jié)果與部門dept表進(jìn)行連接,得到有用信息如下圖:

  此時(shí),我們?cè)讷@取題目中的所需要的信息就相當(dāng)容易了。具體如下圖:

查找每個(gè)部門工資最高的人的姓名、工資、部門、最高工資

  首先,我們可以很容易的得到每個(gè)部門的最高工資,如下圖:

  但是怎么獲取工資最高的人的信息呢?這時(shí)候可以將我們查詢的結(jié)果與emp表連接,再獲取該人的信息就可以了。具體如下:

五、合并查詢

  在MySQL中,合并查詢指的是將多個(gè)查詢結(jié)果合并成一個(gè)結(jié)果集的操作。這可以通過(guò)使用union、union all等操作符來(lái)實(shí)現(xiàn)。以下是對(duì)每種操作符的詳細(xì)解釋:

union:union操作符用于將兩個(gè)或多個(gè)select語(yǔ)句的結(jié)果合并為一個(gè)結(jié)果集,并自動(dòng)去重。

union all:與union類似,但不會(huì)自動(dòng)去重。

  下面我們來(lái)看幾個(gè)實(shí)際例子來(lái)理解一下。

將工資大于 2500 或職位是 MANAGER 的人找出來(lái)

  這個(gè)例子我們前面已經(jīng)做過(guò)類似的,不再過(guò)多解釋,直接看下圖:

  我們也可以先將工資大于2500的人找出來(lái),如下:

  再找出來(lái)職位是MANAGER的。如下圖:

  最后用union將他們兩個(gè)合并即可。具體如下:

  我們?cè)賮?lái)用union all 將他們合并試試。具體如下圖:

  從上述的對(duì)比中,我們也能看出來(lái)union是合并并且去重,union all就只是合并。注意:兩個(gè)select合并的前提是必須所查詢出來(lái)的列數(shù)是相同的。實(shí)際中,union并不常用,我們只是了解一下即可。

到此這篇關(guān)于MySQL復(fù)合查詢(多表查詢、子查詢)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL復(fù)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • mysql 8.0.13 安裝配置圖文教程

    mysql 8.0.13 安裝配置圖文教程

    這篇文章主要介紹了mysql 8.0.13 安裝配置圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • MySQL中深分頁(yè)LIMIT 100000的優(yōu)化方案

    MySQL中深分頁(yè)LIMIT 100000的優(yōu)化方案

    在實(shí)際項(xiàng)目中,分頁(yè)查詢是最常見(jiàn)的 SQL 場(chǎng)景之一,但隨著業(yè)務(wù)數(shù)據(jù)量不斷增長(zhǎng),我們經(jīng)常會(huì)遇到深分頁(yè)的請(qǐng)求,本文將帶大家理解 MySQL 深分頁(yè)的本質(zhì)以及掌握高性能替代方案,感興趣的可以了解下
    2025-11-11
  • MySQL數(shù)據(jù)庫(kù)約束從入門到精通

    MySQL數(shù)據(jù)庫(kù)約束從入門到精通

    數(shù)據(jù)庫(kù)約束時(shí)數(shù)據(jù)庫(kù)中用于強(qiáng)制數(shù)據(jù)完整性的規(guī)則,確保表中數(shù)據(jù)的準(zhǔn)確性、一致性和有效性,通過(guò)限制表中數(shù)據(jù)的輸入修改和刪除行為,防止無(wú)效和不合理數(shù)據(jù)操作,本文給大家介紹MySQL數(shù)據(jù)庫(kù)約束的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • MySQL sql_safe_updates參數(shù)詳解

    MySQL sql_safe_updates參數(shù)詳解

    sql_safe_updates 是 MySQL 中的一個(gè)系統(tǒng)變量,用于控制 MySQL 服務(wù)器是否允許在沒(méi)有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 語(yǔ)句上執(zhí)行更新或刪除操作,這篇文章主要介紹了MySQL sql_safe_updates參數(shù),需要的朋友可以參考下
    2024-07-07
  • mysql數(shù)據(jù)庫(kù)navicat數(shù)據(jù)同步時(shí)誤刪除部分?jǐn)?shù)據(jù)的解決

    mysql數(shù)據(jù)庫(kù)navicat數(shù)據(jù)同步時(shí)誤刪除部分?jǐn)?shù)據(jù)的解決

    本文主要介紹了mysql數(shù)據(jù)庫(kù)navicat數(shù)據(jù)同步時(shí)誤刪除部分?jǐn)?shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • MySQL 數(shù)據(jù)庫(kù)的監(jiān)控方式小結(jié)

    MySQL 數(shù)據(jù)庫(kù)的監(jiān)控方式小結(jié)

    本文主要介紹了MySQL 數(shù)據(jù)庫(kù)的監(jiān)控方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Mysql中Identity 詳細(xì)介紹

    Mysql中Identity 詳細(xì)介紹

    這篇文章主要介紹了Mysql中Identity 的相關(guān)資料,并附示例代碼,需要的朋友可以參考下
    2016-09-09
  • MySQL使用UUID_SHORT()的問(wèn)題解決

    MySQL使用UUID_SHORT()的問(wèn)題解決

    MySQL的UUID_SHORT()函數(shù)是一個(gè)用于生成短UUID的函數(shù),該函數(shù)返回一個(gè)64位的整數(shù),可以用于唯一標(biāo)識(shí)一條數(shù)據(jù)記錄,本文介紹了MySQL使用UUID_SHORT()的問(wèn)題解決,感興趣的可以了解一下
    2023-08-08
  • mysql一鍵安裝教程 mysql5.1.45全自動(dòng)安裝(編譯安裝)

    mysql一鍵安裝教程 mysql5.1.45全自動(dòng)安裝(編譯安裝)

    這篇文章主要介紹了mysql一鍵安裝教程,一鍵安裝MySQL5.1.45,全自動(dòng)安裝MySQL SHELL程序,實(shí)現(xiàn)編譯安裝,感興趣的
    2016-06-06
  • 最新評(píng)論

    平谷区| 巢湖市| 柳江县| 大渡口区| 芮城县| 南陵县| 深泽县| 汉寿县| 临海市| 白朗县| 昭苏县| 奎屯市| 华池县| 安阳县| 沁源县| 闸北区| 鸡东县| 彩票| 高密市| 淅川县| 永修县| 乐清市| 淳化县| 准格尔旗| 安龙县| 梅州市| 阿坝| 宝山区| 博罗县| 武功县| 富顺县| 昌宁县| 金塔县| 楚雄市| 台中县| 绥滨县| 邓州市| 兴安县| 衡南县| 上栗县| 定兴县|