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

MySQL子查詢?cè)斀?單行子查詢、多行子查詢與相關(guān)子查詢)

 更新時(shí)間:2022年09月09日 12:55:17   作者:ppppppatrick  
所謂子查詢是指在一個(gè)查詢中嵌套了其他的若干查詢,即在一個(gè)SELECT查詢語句的WHERE或FROM子句中包含另一個(gè)SELECT查詢語句,下面這篇文章主要給大家介紹了關(guān)于MySQL單行子查詢、多行子查詢與相關(guān)子查詢的相關(guān)資料,需要的朋友可以參考下

0.概念

子查詢:一個(gè)查詢語句嵌套在另一個(gè)查詢語句內(nèi)部

1.需求分析與問題解決

1.1提出具體問題:

請(qǐng)?zhí)砑訄D片描述

# 法一:效率低
SELECT last_name,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 e2.`salary` > e1.`salary`
AND e1.`last_name` = 'Abel';

#法三:子查詢
SELECT last_name,salary
FROM employees
WHERE salary > (
		SELECT salary
		FROM employees
		WHERE last_name = 'ABEL'
               );

# 稱謂的規(guī)范:外查詢(主查詢),內(nèi)查詢(子查詢)

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

請(qǐng)?zhí)砑訄D片描述

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

注意事項(xiàng)

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

1.3 子查詢的分類

角度一:從內(nèi)查詢返回結(jié)果的條目數(shù)

單行子查詢多行子查詢
子查詢結(jié)果只有一個(gè)數(shù)據(jù)子查詢數(shù)據(jù)返回多個(gè)

角度二:內(nèi)查詢是否被執(zhí)行多次

相關(guān)子查詢不相關(guān)子查詢
查詢工資大于本部門平均工資的員工信息查詢工資大于本公司平均工資的員工信息

2.單行子查詢

操作符含義
=equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
<>not equal to

2.1實(shí)例:

# 查詢工資大于149號(hào)員工工資的信息
SELECT salary,last_name,employee_id
FROM employees
WHERE salary > (
		SELECT salary 
		FROM employees
		WHERE employee_id = 149
		);
		
		
# 返回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
		);
		
# 返回公司工資最少的員工的last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
		SELECT MIN(salary)
		FROM employees
);

# 查詢與141號(hào)員工的manager_id和department_id相同的其他員工的employee_id,
# manager_id,department_id
SELECT employee_id,manager_id,department_id
FROM employees
WHERE 
	
	manager_id = (SELECT manager_id 
			FROM employees 
			WHERE employee_id = 141)  
AND 
	department_id =(SELECT department_id
			FROM employees 
			WHERE employee_id = 141)
AND 
	employee_id <> 141;

#方式二:成對(duì)查詢
SELECT employee_id,manager_id,department_id
FROM employees
WHERE (manager_id,department_id) = (
				   SELECT manager_id,department_id
				   FROM employees
				   WHERE employee_id = 141
				   )
				   AND employee_id <> 141;


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

# 題目:顯式員工的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;

2.2空值問題

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

內(nèi)查詢的結(jié)果是NULL空值,不會(huì)報(bào)錯(cuò),但是也不會(huì)顯示數(shù)據(jù)

2.3非法使用子查詢

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

這里內(nèi)查詢返回的結(jié)果是一列數(shù)據(jù),不能使用等于號(hào)連接,必須使用in

3.多行子查詢

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

3.1多行比較操作符

操作符含義
IN等于列表中的任意一個(gè)
ANY需要和單行比較操作符一起使用,和子查詢返回的某一個(gè)值比較
ALL需要和單行比較操作符一起使用,和子查詢返回的所有值比較
SOME實(shí)際上是ANY的別名,作用相同,一般常使用ANY

3.2代碼實(shí)例

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

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

#返回其它job_id中比job_id為‘IT_PROG'部門任一工資低的員工的員工號(hào)、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
		   SELECT salary
		   FROM employees
		   WHERE job_id = 'IT_PROG'
		  )
AND
job_id <> 'IT_PROG';

#返回其它job_id中比job_id為‘IT_PROG'部門所有工資低的員工的員工號(hào)、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ALL(
		   SELECT salary
		   FROM employees
		   WHERE job_id = 'IT_PROG'
		  )
AND
job_id <> 'IT_PROG';

查詢平均工資最低的部門id
相當(dāng)于創(chuàng)建了一張臨時(shí)的表

# 聚合函數(shù)不能嵌套,單行函數(shù)才能嵌套使用
SELECT employee_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
		     )t_dept_avg_sal);

#方式二
SELECT employee_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL(
			SELECT AVG(salary) avg_sal
			FROM employees
			GROUP BY department_id
		     );

3.3空值問題

SELECT last_name
FROM employees
WHERE employee_id NOT IN (
			SELECT manager_id
			FROM employees
			#where manager_id is not null
			 );

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

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

請(qǐng)?zhí)砑訄D片描述

請(qǐng)?zhí)砑訄D片描述

4.1代碼實(shí)例

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

#回顧:查詢員工中工資大于本公司平均工資的員工的last_name,salary和其department_id
SELECT last_name,salary,department_id
FROM employees e1
WHERE salary > (
		SELECT AVG(salary)
		FROM employees e2
		);

#題目:查詢員工中工資大于本部門平均工資的員工的last_name,salary和其department_id
SELECT last_name,salary,department_id
FROM employees e1
WHERE salary > (
		SELECT AVG(salary)
		FROM employees e2
		WHERE department_id = e1.`department_id`
		);

#方式二,在from中聲明子查詢
SELECT e.last_name,e.salary,e.department_id
FROM employees e,(SELECT department_id,AVG(salary) avg_sal
		  FROM employees
		  GROUP BY department_id) temp
WHERE e.department_id = temp.department_id
AND e.salary > temp.avg_sal;

題目:查詢員工的id,salary,按照department_name 排序

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

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

#若employees表中employee_id與job_history表中employee_id相同的數(shù)目不小于2,輸出這些相同
#id的員工的employee_id,last_name和其job_id
SELECT employee_id,last_name,job_id
FROM employees e
WHERE  2 <= (SELECT COUNT(*)
	      FROM job_history j
	      WHERE e.`employee_id` = j.`employee_id`
	     );

4.2結(jié)論:

在哪里可以寫子查詢:

在select中,除了GROUP BY 和 LIMIT之外,其他位置都可以聲明子查詢

4.3EXISTS 與 NOT EXISTS關(guān)鍵字

關(guān)聯(lián)子查詢通常也會(huì)和 EXISTS操作符一起來使用,用來檢查在子查詢中是否存在滿足條件的行。

如果在子查詢中不存在滿足條件的行:

  • 條件返回 FALSE
  • 繼續(xù)在子查詢中查找
    如果在子查詢中存在滿足條件的行:
  • 不在子查詢中繼續(xù)查找
  • 條件返回 TRUE
    NOT EXISTS關(guān)鍵字表示如果不存在某種條件,則返回TRUE,否則返回FALSE。

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

#方式一:自連接
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 DISTINCT manager_id
FROM employees

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

#方式三:exists
SELECT employee_id,last_name,job_id,department_id
FROM employees e1
WHERE EXISTS (
		SELECT *
		FROM employees e2
		WHERE e1.`employee_id`= e2.`manager_id`
	     )

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

#方式一:
SELECT d.department_id,d.department_name
FROM employees e RIGHT JOIN departments d
ON e.department_id = d.department_id
WHERE e.department_id IS NULL;

#方式二:
SELECT department_id,department_name
FROM departments d
WHERE NOT EXISTS (
		 SELECT *
		 FROM employees e
		 WHERE d.`department_id` = e.`department_id`
		 );

5.相關(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ù)為員工對(duì)應(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);

問題:誰的工資比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 的處理過程中,對(duì)于自連接的處理速度要比子查詢快得多。

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

總結(jié)

到此這篇關(guān)于MySQL子查詢?cè)斀獾奈恼戮徒榻B到這了,更多相關(guān)MySQL子查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql存儲(chǔ)過程之邏輯判斷和條件控制

    MySql存儲(chǔ)過程之邏輯判斷和條件控制

    本篇文章給大家介紹了mysql存儲(chǔ)過程之邏輯判斷、條件控制,涉及到的知識(shí)點(diǎn)有邏輯判斷、條件控制方面的內(nèi)容,對(duì)mysql存儲(chǔ)過程邏輯判斷和條件控制感興趣的朋友可以參考下本文
    2015-10-10
  • Ubuntu下mysql安裝和操作圖文教程

    Ubuntu下mysql安裝和操作圖文教程

    這篇文章主要為大家詳細(xì)分享了Ubuntu下mysql安裝和操作圖文教程,喜歡的朋友可以參考一下
    2016-05-05
  • MySQL5.7.10 安裝文檔教程詳解

    MySQL5.7.10 安裝文檔教程詳解

    這篇文章主要介紹了MySQL5.7.10 安裝文檔教程詳解,需要的朋友可以參考下
    2017-02-02
  • MySQL 聚合函數(shù)排序

    MySQL 聚合函數(shù)排序

    這篇文章主要介紹了MySQL查詢排序與查詢聚合函數(shù)用法,結(jié)合實(shí)例形式分析了MySQL查詢結(jié)果排序以及查詢聚合函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2021-07-07
  • 超全MySQL學(xué)習(xí)筆記

    超全MySQL學(xué)習(xí)筆記

    本文詳細(xì)介紹了MySQL索引優(yōu)化、鎖和事物等學(xué)習(xí)記錄,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Canal入門使用小結(jié)

    Canal入門使用小結(jié)

    Canal是一款MySQL數(shù)據(jù)庫(kù)增量日志解析工具,用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步,本文主要介紹了Canal入門使用小結(jié),感興趣的可以了解一下
    2025-02-02
  • Mysql中replace與replace into的用法講解

    Mysql中replace與replace into的用法講解

    今天小編就為大家分享一篇關(guān)于Mysql中replace與replace into的用法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MAC下修改mysql默認(rèn)字符集為utf8的方法

    MAC下修改mysql默認(rèn)字符集為utf8的方法

    本文主要介紹了如何修改MAC版mysql默認(rèn)字符集為utf8,如果你的MAC版mysql字符亂碼,可以參考一下這篇文章
    2018-03-03
  • MySQL 8.0 Online DDL快速加列的相關(guān)總結(jié)

    MySQL 8.0 Online DDL快速加列的相關(guān)總結(jié)

    在實(shí)際的MySQL運(yùn)維過程中,我們經(jīng)常會(huì)遇到業(yè)務(wù)需要給某張表添加字段的情況,本文將介紹幾種加字段的方法,感興趣的朋友可以參考下
    2021-06-06
  • Mysql使用Sharding-JDBC配置教程

    Mysql使用Sharding-JDBC配置教程

    文章介紹了如何使用Sharding-JDBC對(duì)訂單表進(jìn)行水平分表,并通過配置分片規(guī)則、數(shù)據(jù)操作和測(cè)試驗(yàn)證了分表的實(shí)現(xiàn),同時(shí),文章還討論了Sharding-JDBC的多種集成方式和4種分片策略的實(shí)現(xiàn)方法,包括標(biāo)準(zhǔn)分片策略、復(fù)合分片策略、行表達(dá)式分片策略和Hint分片策略
    2025-02-02

最新評(píng)論

晋州市| 汤阴县| 九龙县| 万荣县| 铜山县| 北宁市| 大连市| 克拉玛依市| 盖州市| 克什克腾旗| 武宣县| 台前县| 抚松县| 双峰县| 买车| 鄂州市| 无棣县| 濉溪县| 南靖县| 恩平市| 尼勒克县| 岱山县| 亳州市| 炎陵县| 商城县| 屏东县| 上虞市| 建宁县| 阜平县| 腾冲县| 盐亭县| 九寨沟县| 特克斯县| 湟源县| 修文县| 湛江市| 南京市| 开阳县| 阳信县| 贡觉县| 定远县|