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

全面講解MySQL子查詢

 更新時(shí)間:2024年02月06日 09:42:00   作者:_GGBond_  
子查詢就是將一個(gè)查詢結(jié)果作為判斷條件或者作為一張?zhí)摂M表在這個(gè)結(jié)果的基礎(chǔ)上進(jìn)行另一個(gè)查詢,本文就詳細(xì)的介紹了MySQL子查詢 ,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

  • 子查詢指一個(gè)查詢語句嵌套在另一個(gè)查詢語句內(nèi)部的查詢,這個(gè)特性從MySQL 4.1開始引入。

  • SQL 中子查詢的使用大大增強(qiáng)了 SELECT 查詢的能力,因?yàn)楹芏鄷r(shí)候查詢需要從結(jié)果集中獲取數(shù)據(jù),或者需要從同一個(gè)表中先計(jì)算得出一個(gè)數(shù)據(jù)結(jié)果,然后與這個(gè)數(shù)據(jù)結(jié)果(可能是某個(gè)標(biāo)量,也可能是某個(gè)集合)進(jìn)行比較。

一、需求分析與問題解決

1、實(shí)際問題

在這里插入圖片描述

現(xiàn)有解決方式:

#方式一:
SELECT salary
FROM employees
WHERE last_name = 'Abel';

SELECT last_name,salary
FROM employees
WHERE salary > 11000;
#方式二:自連接
SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.last_name = 'Abel'
AND e1.`salary` < e2.`salary`
#方式三:子查詢
SELECT last_name,salary
FROM employees
WHERE salary > (
		SELECT salary
		FROM employees
		WHERE last_name = 'Abel'
		);

在這里插入圖片描述

2、子查詢的基本使用

  • 子查詢的基本語法結(jié)構(gòu):

    在這里插入圖片描述

  • 子查詢(內(nèi)查詢)在主查詢之前一次執(zhí)行完成。

  • 子查詢的結(jié)果被主查詢(外查詢)使用 。

  • 注意事項(xiàng)

    • 子查詢要包含在括號內(nèi)
    • 將子查詢放在比較條件的右側(cè)
    • 單行操作符對應(yīng)單行子查詢,多行操作符對應(yīng)多行子查詢

3、子查詢的分類

1. 分類方式1:

我們按內(nèi)查詢的結(jié)果返回一條還是多條記錄,將子查詢分為單行子查詢、多行子查詢。

•單行子查詢

在這里插入圖片描述

•多行子查詢

在這里插入圖片描述

2. 分類方式2:

我們按內(nèi)查詢是否被執(zhí)行多次,將子查詢劃分為相關(guān)(或關(guān)聯(lián))子查詢和不相關(guān)(或非關(guān)聯(lián))子查詢。

子查詢從數(shù)據(jù)表中查詢了數(shù)據(jù)結(jié)果,如果這個(gè)數(shù)據(jù)結(jié)果只執(zhí)行一次,然后這個(gè)數(shù)據(jù)結(jié)果作為主查詢的條件進(jìn)行執(zhí)行,那么這樣的子查詢叫做不相關(guān)子查詢。

同樣,如果子查詢需要執(zhí)行多次,即采用循環(huán)的方式,先從外部查詢開始,每次都傳入子查詢進(jìn)行查詢,然后再將結(jié)果反饋給外部,這種嵌套的執(zhí)行方式就稱為相關(guān)子查詢。

二、單行子查詢

1、單行比較操作符

在這里插入圖片描述

2、代碼示例

題目:查詢工資大于149號員工工資的員工的信息

在這里插入圖片描述

在這里插入圖片描述

題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id和工資

SELECT last_name, job_id, salary
FROM   employees
WHERE  job_id =  
                (SELECT job_id
                 FROM   employees
                 WHERE  employee_id = 141)
AND    salary >
                (SELECT salary
                 FROM   employees
                 WHERE  employee_id = 143);

在這里插入圖片描述

題目:返回公司工資最少的員工的last_name,job_id和salary
SELECT last_name, job_id, salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);

題目:查詢與141號或174號員工的manager_id和department_id相同的其他員工的employee_id,manager_id,department_id
實(shí)現(xiàn)方式1:不成對比較

SELECT  employee_id, manager_id, department_id
FROM    employees
WHERE   manager_id IN
		  (SELECT  manager_id
                   FROM    employees
                   WHERE   employee_id IN (174,141))
AND     department_id IN 
		  (SELECT  department_id
                   FROM    employees
                   WHERE   employee_id IN (174,141))
AND	employee_id NOT IN(174,141);

實(shí)現(xiàn)方式2:成對比較

SELECT	employee_id, manager_id, department_id
FROM	employees
WHERE  (manager_id, department_id) IN
                      (SELECT manager_id, department_id
                       FROM   employees
                       WHERE  employee_id IN (141,174))
AND	employee_id NOT IN (141,174);

3、HAVING 中的子查詢

  • 首先執(zhí)行子查詢。
  • 向主查詢中的HAVING 子句返回結(jié)果。
    題目:查詢最低工資大于50號部門最低工資的部門id和其最低工資
SELECT   department_id, MIN(salary)
FROM     employees
GROUP BY department_id
HAVING   MIN(salary) >
                       (SELECT MIN(salary)
                        FROM   employees
                        WHERE  department_id = 50);

4、CASE中的子查詢

在CASE表達(dá)式中使用單列子查詢:

題目:顯式員工的employee_id,last_name和location。其中,若員工department_id與location_id為1800的department_id相同,則location為’Canada’,其余則為’USA’。

SELECT employee_id, last_name,
       (CASE department_id
        WHEN
             (SELECT department_id FROM departments
	      WHERE location_id = 1800)           
        THEN 'Canada' ELSE 'USA' END) location
FROM   employees;

5、子查詢中的空值問題

SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');

在這里插入圖片描述

子查詢不返回任何行

6、非法使用子查詢

SELECT employee_id, last_name
FROM   employees
WHERE  salary =
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id);

在這里插入圖片描述

多行子查詢使用單行比較符

三、多行子查詢

  • 也稱為集合比較子查詢
  • 內(nèi)查詢返回多行
  • 使用多行比較操作符

1、多行比較操作符

在這里插入圖片描述

體會 ANY 和 ALL 的區(qū)別

2、代碼示例

題目:返回其它job_id中比job_id為‘IT_PROG’部門任一工資低的員工的員工號、姓名、job_id 以及salary

在這里插入圖片描述

題目:返回其它job_id中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號、姓名、job_id以及salary

在這里插入圖片描述

題目:查詢平均工資最低的部門id

#方式1:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
			SELECT MIN(avg_sal)
			FROM (
				SELECT AVG(salary) avg_sal
				FROM employees
				GROUP BY department_id
				) dept_avg_sal
			)
#方式2:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
				SELECT AVG(salary) avg_sal
				FROM employees
				GROUP BY department_id
)

3、空值問題

SELECT last_name
FROM employees
WHERE employee_id NOT IN (
			SELECT manager_id
			FROM employees
			);

在這里插入圖片描述

四、相關(guān)子查詢

1、相關(guān)子查詢執(zhí)行流程

如果子查詢的執(zhí)行依賴于外部查詢,通常情況下都是因?yàn)樽硬樵冎械谋碛玫搅送獠康谋?,并進(jìn)行了條件關(guān)聯(lián),因此每執(zhí)行一次外部查詢,子查詢都要重新計(jì)算一次,這樣的子查詢就稱之為關(guān)聯(lián)子查詢。

相關(guān)子查詢按照一行接一行的順序執(zhí)行,主查詢的每一行都執(zhí)行一次子查詢。

在這里插入圖片描述

說明:子查詢中使用主查詢中的列

2、代碼示例

題目:查詢員工中工資大于本部門平均工資的員工的last_name,salary和其department_id

1. 方式一:相關(guān)子查詢

在這里插入圖片描述

2. 方式二:在 FROM 中使用子查詢

SELECT last_name,salary,e1.department_id
FROM employees e1,(SELECT department_id,AVG(salary) dept_avg_sal FROM employees GROUP BY department_id) e2
WHERE e1.`department_id` = e2.department_id
AND e2.dept_avg_sal < e1.`salary`;

from型的子查詢:子查詢是作為from的一部分,子查詢要用()引起來,并且要給這個(gè)子查詢?nèi)e名,把它當(dāng)成一張“臨時(shí)的虛擬的表”來使用。

在ORDER BY 中使用子查詢:
題目:查詢員工的id,salary,按照department_name 排序

SELECT employee_id,salary
FROM employees e
ORDER BY (
	  SELECT department_name
	  FROM departments d
	  WHERE e.`department_id` = d.`department_id`
	);

題目:若employees表中employee_id與job_history表中employee_id相同的數(shù)目不小于2,輸出這些相同id的員工的employee_id,last_name和其job_id

SELECT e.employee_id, last_name,e.job_id
FROM   employees e 
WHERE  2 <= (SELECT COUNT(*)
             FROM   job_history 
             WHERE  employee_id = e.employee_id);

3、EXISTS 與 NOT EXISTS關(guān)鍵字

  • 關(guān)聯(lián)子查詢通常也會和 EXISTS操作符一起來使用,用來檢查在子查詢中是否存在滿足條件的行。
  • 如果在子查詢中不存在滿足條件的行:
    • 條件返回 FALSE
    • 繼續(xù)在子查詢中查找
  • 如果在子查詢中存在滿足條件的行:
    • 不在子查詢中繼續(xù)查找
    • 條件返回 TRUE
  • NOT EXISTS關(guān)鍵字表示如果不存在某種條件,則返回TRUE,否則返回FALSE。
    題目:查詢公司管理者的employee_id,last_name,job_id,department_id信息

方式一:

SELECT employee_id, last_name, job_id, department_id
FROM   employees e1
WHERE  EXISTS ( SELECT *
                 FROM   employees e2
                 WHERE  e2.manager_id = 
                        e1.employee_id);

方式二:自連接

SELECT DISTINCT e1.employee_id, e1.last_name, e1.job_id, e1.department_id
FROM   employees e1 JOIN employees e2
WHERE e1.employee_id = e2.manager_id;

方式三:

SELECT employee_id,last_name,job_id,department_id
FROM employees
WHERE employee_id IN (
		     SELECT DISTINCT manager_id
		     FROM employees
		     
		     );

題目:查詢departments表中,不存在于employees表中的部門的department_id和department_name

SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT 'X'
                  FROM   employees
                  WHERE  department_id = d.department_id);

4、相關(guān)更新

UPDATE table1 alias1
SET    column = (SELECT expression
                 FROM   table2 alias2
                 WHERE  alias1.column = alias2.column);

使用相關(guān)子查詢依據(jù)一個(gè)表中的數(shù)據(jù)更新另一個(gè)表的數(shù)據(jù)。
題目:在employees中增加一個(gè)department_name字段,數(shù)據(jù)為員工對應(yīng)的部門名稱

# 1)
ALTER TABLE employees
ADD(department_name VARCHAR2(14));

# 2)
UPDATE employees e
SET department_name =  (SELECT department_name 
	                       FROM   departments d
	                       WHERE  e.department_id = d.department_id);

5、相關(guān)刪除

 DELETE FROM table1 alias1
 WHERE column operator (SELECT expression
                        FROM   table2 alias2
                        WHERE  alias1.column = alias2.column);

使用相關(guān)子查詢依據(jù)一個(gè)表中的數(shù)據(jù)刪除另一個(gè)表的數(shù)據(jù)。
題目:刪除表employees中,其與emp_history表皆有的數(shù)據(jù)

DELETE FROM employees e
WHERE employee_id in  
           (SELECT employee_id
            FROM   emp_history 
            WHERE  employee_id = e.employee_id);

五、拋一個(gè)思考題

問題: 誰的工資比Abel的高?
解答:

#方式1:自連接
SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.last_name = 'Abel'
AND e1.`salary` < e2.`salary`
#方式2:子查詢
SELECT last_name,salary
FROM employees
WHERE salary > (
		SELECT salary
		FROM employees
		WHERE last_name = 'Abel'
		);

問題: 以上兩種方式有好壞之分嗎?
解答: 自連接方式好!

題目中可以使用子查詢,也可以使用自連接。一般情況建議你使用自連接,因?yàn)樵谠S多 DBMS 的處理過程中,對于自連接的處理速度要比子查詢快得多。

可以這樣理解:子查詢實(shí)際上是通過未知表進(jìn)行查詢后的條件判斷,而自連接是通過已知的自身數(shù)據(jù)表進(jìn)行條件判斷,因此在大部分 DBMS 中都對自連接處理進(jìn)行了優(yōu)化。

到此這篇關(guān)于全面講解MySQL子查詢的文章就介紹到這了,更多相關(guān)MySQL子查詢 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談SQLite時(shí)間函數(shù)的使用說明與總結(jié)分析

    淺談SQLite時(shí)間函數(shù)的使用說明與總結(jié)分析

    本篇文章是對SQLite時(shí)間函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 關(guān)于MySql 10038錯誤的完美解決方法(三種)

    關(guān)于MySql 10038錯誤的完美解決方法(三種)

    本文給大家?guī)砣N有關(guān)mysql報(bào)10038錯誤的解決方法,每種方法都非常不錯,需要的朋友參考下
    2016-09-09
  • Mysql中TIMESTAMPDIFF函數(shù)的語法與練習(xí)案例

    Mysql中TIMESTAMPDIFF函數(shù)的語法與練習(xí)案例

    在應(yīng)用時(shí)經(jīng)常要使用這兩個(gè)函數(shù)TIMESTAMPDIFF和TIMESTAMPADD,下面這篇文章主要給大家介紹了關(guān)于Mysql中TIMESTAMPDIFF函數(shù)的語法與練習(xí)案例的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Windows版Mysql5.6.11的安裝與配置教程

    Windows版Mysql5.6.11的安裝與配置教程

    這篇文章詳細(xì)介紹了Windows下Mysql5.6.11的下載、安裝與配置教程,需要的朋友可以參考下
    2013-06-06
  • MySQL中SQL查詢常見調(diào)優(yōu)方案對比與實(shí)踐

    MySQL中SQL查詢常見調(diào)優(yōu)方案對比與實(shí)踐

    文章瀏覽閱讀429次,點(diǎn)贊3次,收藏2次。本文從索引優(yōu)化、查詢重寫、分庫分表、緩存方案四個(gè)角度,對SQL調(diào)優(yōu)進(jìn)行對比分析,并結(jié)合真實(shí)生產(chǎn)環(huán)境案例驗(yàn)證了各方案的應(yīng)用效果,為后端開發(fā)者提供實(shí)用的最佳實(shí)踐指導(dǎo)。
    2025-07-07
  • Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的方法

    Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的方法

    這篇文章主要給大家介紹了關(guān)于在Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • MySQL索引的一些常見面試題大全(2022年)

    MySQL索引的一些常見面試題大全(2022年)

    索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),是對表中一列或多列值進(jìn)行排序的結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于MySQL索引的一些常見面試題,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MySql數(shù)據(jù)庫自動遞增值問題

    MySql數(shù)據(jù)庫自動遞增值問題

    這篇文章主要介紹了MySql數(shù)據(jù)庫自動遞增值問題的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Mysql行格式索引頁詳解

    Mysql行格式索引頁詳解

    這篇文章主要介紹了Mysql行格式索引頁,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock詳解

    MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock詳解

    這篇文章主要給大家介紹了關(guān)于MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論

娄烦县| 大洼县| 榆社县| 遵义县| 通城县| 惠东县| 澄城县| 大理市| 霸州市| 东平县| 韩城市| 瓮安县| 梅河口市| 汤原县| 惠水县| 上饶市| 大名县| 宣汉县| 东乌珠穆沁旗| 屏东县| 安龙县| 东乡族自治县| 嘉祥县| 永顺县| 石泉县| 涿州市| 徐水县| 通化市| 瑞金市| 四子王旗| 富源县| 响水县| 莎车县| 阳西县| 呼伦贝尔市| 平昌县| 扬州市| 永城市| 宁津县| 博乐市| 元氏县|