亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL子查詢詳解(單行子查詢、多行子查詢與相關(guān)子查詢)

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

0.概念

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

1.需求分析與問題解決

1.1提出具體問題:

請?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):

請?zhí)砑訄D片描述

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

注意事項

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

1.3 子查詢的分類

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

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

角度二:內(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實例:

# 查詢工資大于149號員工工資的信息
SELECT salary,last_name,employee_id
FROM employees
WHERE salary > (
		SELECT salary 
		FROM employees
		WHERE employee_id = 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號員工的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;

#方式二:成對查詢
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號部門最低工資的部門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空值,不會報錯,但是也不會顯示數(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ù),不能使用等于號連接,必須使用in

3.多行子查詢

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

3.1多行比較操作符

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

3.2代碼實例

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’部門任一工資低的員工的員工號、姓名、job_id 以及salary

#返回其它job_id中比job_id為‘IT_PROG'部門任一工資低的員工的員工號、姓名、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'部門所有工資低的員工的員工號、姓名、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
相當于創(chuàng)建了一張臨時的表

# 聚合函數(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í)行依賴于外部查詢,通常情況下都是因為子查詢中的表用到了外部的表,并進行了條件關(guān)聯(lián),因此每執(zhí)行一次外部查詢,子查詢都要重新計算一次,這樣的子查詢就稱之為 關(guān)聯(lián)子查詢 .相關(guān)子查詢按照一行接一行的順序執(zhí)行,主查詢的每一行都執(zhí)行一次子查詢。

請?zhí)砑訄D片描述

請?zhí)砑訄D片描述

4.1代碼實例

題目:查詢員工中工資大于本部門平均工資的員工的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)子查詢通常也會和 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ù)一個表中的數(shù)據(jù)更新另一個表的數(shù)據(jù)。

題目:在employees中增加一個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ù)一個表中的數(shù)據(jù)刪除另一個表的數(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'  
			   );

問題:以上兩種方式有好壞之分嗎?

解答:自連接方式好!

題目中可以使用子查詢,也可以使用自連接。一般情況建議你使用自連接,因為在許多 DBMS 的處理過程中,對于自連接的處理速度要比子查詢快得多。

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

總結(jié)

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

相關(guān)文章

  • MySQL學習筆記5:修改表(alter table)

    MySQL學習筆記5:修改表(alter table)

    我們在創(chuàng)建表的過程中難免會考慮不周,因此后期會修改表修改表需要用到alter table修改表語句,接下來詳細介紹,需要的朋友可以參考下
    2013-01-01
  • MySql UNION 一行轉(zhuǎn)多列的實現(xiàn)示例

    MySql UNION 一行轉(zhuǎn)多列的實現(xiàn)示例

    在MySQL命令行中,有時候我們會遇到一行的數(shù)據(jù)需要以多列的形式呈現(xiàn)的情況,本文就詳細介紹了一下一行轉(zhuǎn)多列的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • MySQL中空值Null和空字符‘‘的具體使用

    MySQL中空值Null和空字符‘‘的具體使用

    本文主要介紹了MySQL中空值Null和空字符''的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Win10下mysql 8.0.15 安裝配置方法圖文教程

    Win10下mysql 8.0.15 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了Win10下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Winserver2012下mysql 5.7解壓版(zip)配置安裝教程詳解

    Winserver2012下mysql 5.7解壓版(zip)配置安裝教程詳解

    這篇文章主要介紹了Winserver2012下mysql 5.7解壓版(zip)配置安裝教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • Windows下MySQL5.6查找my.ini配置文件的方法

    Windows下MySQL5.6查找my.ini配置文件的方法

    今天小編就為大家分享一篇Windows下MySQL5.6查找my.ini配置文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Mysql Limit 分頁查詢優(yōu)化詳解

    Mysql Limit 分頁查詢優(yōu)化詳解

    這篇文章主要介紹了Mysql Limit 分頁查詢優(yōu)化的相關(guān)資料,非常不錯,介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Mysql中復(fù)制詳細解析

    Mysql中復(fù)制詳細解析

    這篇文章主要介紹了Mysql中復(fù)制詳細解析,從基本概念、用途、實現(xiàn)方法以及集中模式進行了介紹,然后分享了具體實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • mysql經(jīng)典4張表問題詳細講解

    mysql經(jīng)典4張表問題詳細講解

    MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),可以通過連接不同的表將數(shù)據(jù)進行關(guān)聯(lián)查詢,下面這篇文章主要給大家介紹了關(guān)于mysql經(jīng)典4張表問題的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 基于mssql導(dǎo)mysql遇到的問題

    基于mssql導(dǎo)mysql遇到的問題

    本篇文章是對mssql導(dǎo)mysql遇到的問題,進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論