日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏

發(fā)布時(shí)間:2023/12/2 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1、需求分析與問(wèn)題解決
    • 2、單行子查詢
    • 3、多行子查詢
    • 4、相關(guān)子查詢
    • 5、拋一個(gè)思考題


子查詢指一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句內(nèi)部的查詢,這個(gè)特性從MySQL 4.1開(kāi)始引入。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、需求分析與問(wèn)題解決

1.1 實(shí)際問(wè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 salaryFROM employeesWHERE last_name = 'Abel');

1.2 子查詢的基本使用
子查詢的基本語(yǔ)法結(jié)構(gòu):

子查詢(內(nèi)查詢)在主查詢之前一次執(zhí)行完成。
子查詢的結(jié)果被主查詢(外查詢)使用 。

注意事項(xiàng):
①子查詢要包含在括號(hào)內(nèi)。
②將子查詢放在比較條件的右側(cè)。
③單行操作符對(duì)應(yīng)單行子查詢,多行操作符對(duì)應(yīng)多行子查詢。

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

分類方式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)的方式,先從外部查詢開(kāi)始,每次都傳入子查詢進(jìn)行查詢,然后再將結(jié)果反饋給外部,這種嵌套的執(zhí)行方式就稱為相關(guān)子查詢。


2、單行子查詢

2.1 單行比較操作符

2.2 代碼示例

#返回job_id與141號(hào)員工相同,salary比143號(hào)員工多的員工姓名,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);

2.3 HAVING 中的子查詢
首先執(zhí)行子查詢,再向主查詢中的HAVING 子句返回結(jié)果。

#查詢最低工資大于50號(hào)部門最低工資的部門id和其最低工資。 SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);

2.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;

3、多行子查詢

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

3.1 多行比較操作符

3.2 代碼示例
返回其它job_id中比job_id為‘IT_PROG’部門任一工資低的員工的員工號(hào)、姓名、job_id 以及salary。

返回其它job_id中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號(hào)、姓名、job_id以及salary。

#查詢平均工資最低的部門id SELECT department_id FROM employees GROUP BY department_id HAVING AVG(salary) <= ALL (SELECT AVG(salary) FROM employeesGROUP BY department_id);

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

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


4.2 代碼示例
題目:查詢員工中工資大于本部門平均工資的員工的last_name,salary和其department_id
方式一:相關(guān)子查詢

方式二:在 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的一部分,子查詢要用()引起來(lái),并且要給這個(gè)子查詢?nèi)e名, 把它當(dāng)成一張“臨時(shí)的虛擬的表”來(lái)使用。

在ORDER BY 中使用子查詢:

#查詢員工的id,salary,按照department_name 排序 SELECT employee_id,salary FROM employees e ORDER BY (SELECT department_nameFROM departments dWHERE e.`department_id` = d.`department_id`);

4.3 EXISTS 與 NOT EXISTS關(guān)鍵字
關(guān)聯(lián)子查詢通常也會(huì)和 EXISTS操作符一起來(lái)使用,用來(lái)檢查在子查詢中是否存在滿足條件的行。
如果在子查詢中不存在滿足條件的行:
條件返回 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 e2WHERE 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_idFROM employees);

4.4 相關(guān)更新

UPDATE table1 alias1 SET column = (SELECT expressionFROM table2 alias2WHERE alias1.column = alias2.column);

使用相關(guān)子查詢依據(jù)一個(gè)表中的數(shù)據(jù)更新另一個(gè)表的數(shù)據(jù)。

4.4 相關(guān)刪除

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

使用相關(guān)子查詢依據(jù)一個(gè)表中的數(shù)據(jù)刪除另一個(gè)表的數(shù)據(jù)。


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

誰(shuí)的工資比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 salaryFROM employeesWHERE last_name = 'Abel');

以上兩種方式有好壞之分嗎?
自連接方式好!
題目中可以使用子查詢,也可以使用自連接。一般情況建議使用自連接,因?yàn)樵谠S多 DBMS 的處理過(guò)程中,對(duì)于自連接的處理速度要比子查詢快得多。可以這樣理解:子查詢實(shí)際上是通過(guò)未知表進(jìn)行查詢后的條件判斷,而自連接是通過(guò)已知的自身數(shù)據(jù)表進(jìn)行條件判斷,因此在大部分 DBMS 中都對(duì)自連接處理進(jìn)行了優(yōu)化。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。