欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

員工表emp:

部門表dept:

薪水表salgrade:

一、基本查詢回顧

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

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

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

按照部門號升序而雇員的工資降序排序

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

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

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

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

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

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

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

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

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

  我們看到需求是每個(gè)部門,那么首先肯定要按部門號進(jìn)行分組。其次我們再查詢每個(gè)部門的平均工資和最高工資。具體如下圖:

顯示平均工資低于2000的部門號和它的平均工資

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

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

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

二、多表查詢

2、1 笛卡爾積

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

以下是一個(gè)簡單的說明以及一個(gè)示例來解釋笛卡爾積:

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

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

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

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

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

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

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

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

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

三、自連接

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

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

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

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

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

四、子查詢

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

4、1 單行子查詢

顯示 SMITH 同一部門的員工

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

4、2 多行子查詢

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

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

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

顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號

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

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

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

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

4、3 多列子查詢

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  我們再將上述查詢的結(jié)果與部門dept表進(jìn)行連接,得到有用信息如下圖:

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

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

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

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

五、合并查詢

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

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

union all:與union類似,但不會自動去重。

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

將工資大于 2500 或職位是 MANAGER 的人找出來

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

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

  再找出來職位是MANAGER的。如下圖:

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

  我們再來用union all 將他們合并試試。具體如下圖:

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

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

相關(guān)文章

  • mysql定時(shí)備份shell腳本和還原的示例

    mysql定時(shí)備份shell腳本和還原的示例

    數(shù)據(jù)庫備份是防止數(shù)據(jù)丟失的一種重要手段,生產(chǎn)環(huán)境中,數(shù)據(jù)的安全性是至關(guān)重要的,任何數(shù)據(jù)的丟失都可能產(chǎn)生嚴(yán)重的后果,所以本文給大家介紹了mysql定時(shí)備份shell腳本和還原的實(shí)例,需要的朋友可以參考下
    2024-02-02
  • CentOS7 64位下MySQL5.7安裝與配置教程

    CentOS7 64位下MySQL5.7安裝與配置教程

    這篇文章主要介紹了CentOS7 64位下MySQL5.7安裝與配置教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程

    CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程

    這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下
    2015-12-12
  • MySQL Workbench 安裝教程(保姆級)

    MySQL Workbench 安裝教程(保姆級)

    MySQL Workbench 是一款強(qiáng)大的數(shù)據(jù)庫設(shè)計(jì)和管理工具,本文主要介紹了MySQL Workbench 安裝教程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • MySQL多個(gè)字段拼接去重的實(shí)現(xiàn)示例

    MySQL多個(gè)字段拼接去重的實(shí)現(xiàn)示例

    在MySQL中,我們經(jīng)常會遇到需要將多個(gè)字段進(jìn)行拼接并去重的情況,本文就來介紹一下MySQL多個(gè)字段拼接去重的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • MySQL中的聚簇索引、非聚簇索引、聯(lián)合索引和唯一索引詳細(xì)介紹

    MySQL中的聚簇索引、非聚簇索引、聯(lián)合索引和唯一索引詳細(xì)介紹

    本文主要介紹了MySQL的索引類型,根據(jù)索引的存儲方式來劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點(diǎn)是葉子節(jié)點(diǎn)包含了完整的記錄行,而非聚簇索引的葉子節(jié)點(diǎn)只有所以字段和主鍵ID,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • mysql5.7.42到mysql8.2.0的升級(rpm方式)

    mysql5.7.42到mysql8.2.0的升級(rpm方式)

    隨著數(shù)據(jù)量的增長和業(yè)務(wù)需求的變更,我們可能需要升級MySQL,本文主要介紹了mysql5.7.42到mysql8.2.0的升級(rpm方式),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • mysql中varchar類型的日期進(jìn)行比較、排序等操作的實(shí)現(xiàn)

    mysql中varchar類型的日期進(jìn)行比較、排序等操作的實(shí)現(xiàn)

    在mysql使用過程中,日期一般都是以datetime、timestamp等格式進(jìn)行存儲的,但有時(shí)會因?yàn)樘厥獾男枨蠡驓v史原因,日期的存儲格式是varchar,那么應(yīng)該怎么進(jìn)行比較和排序等問題,本文就來介紹一下
    2021-11-11
  • MySQL 觸發(fā)器定義與用法簡單實(shí)例

    MySQL 觸發(fā)器定義與用法簡單實(shí)例

    這篇文章主要介紹了MySQL 觸發(fā)器定義與用法,結(jié)合簡單實(shí)例形式總結(jié)分析了mysql觸發(fā)器的語法、原理、定義及使用方法,需要的朋友可以參考下
    2019-09-09
  • MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)

    MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)

    我們經(jīng)常會遇到需要將SQL查詢結(jié)果導(dǎo)出到文件,以便后續(xù)的傳輸或數(shù)據(jù)分析的場景,本文就MySQL中select…into的用法進(jìn)行演示,感興趣的朋友跟隨小編一起看看吧
    2024-08-08

最新評論