小徐帶你連接sql99子查詢和分頁查詢的用法詳解

子查詢重點難點

子查詢含義:

  出現在其他語句中的select語句,稱爲子查詢或內查詢

  外部的查詢語句,稱爲主查詢或外查詢

子查詢分類

一:按子查詢出現的位置分類

select		後面
				僅僅支持標量子查詢
from			後面
				支持表子查詢
where或having後面			重點
				標量子查詢(單行)	重點
				列子查詢(多行)		重點
				行子查詢
exists	後面(相關主查詢)
			表子查詢

按結果集的行列數不同分類

		標量子查詢(結果集只有一行一列)
		
		列子查詢(結果集只有一列多行)
		
		行子查詢(結果集有一行多列)
		
		表子查詢(結果集一般爲多行多列)

一:where或having後面

		1:標量子查詢(單行子查詢)
		
		2:列子查詢(多行子查詢)
		
		3:行子查詢(多行多列)
		
**特點:**
		1:子查詢放在小括號內
		
		2:子查詢一般放在條件的右側
		
		3:標量子查詢,一般搭配着多行操作符使用
		<,		>	,		<=	,	>=,		=	,	<>
		
		列子查詢,一般搭配着多行操作符使用
		in	,	any/some,	all
		
		**4:子查詢的執行優先主查詢執行,主查詢的條件用到了子查詢的結果**

一:標量子查詢

誰的工資比Abel高

SELECT last_name FROM employees WHERE salary >( SELECT salary FROM employees WHERE last_name = 'Abel' );

返回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 );

查詢最低工資大於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 );

列子查詢(多行子查詢)

在這裏插入圖片描述

返回location_id是1400或1700的部門中的所有員工姓名

SELECT
	last_name 
FROM
	employees 
WHERE
	department_id IN (
	SELECT DISTINCT
		department_id 
	FROM
		departments 
WHERE
	location_id IN ( 1400, 1700 ));

返回其他工種中比job_id爲IT_PROG部門任意工資低的員工的姓名,Job_id以及salary

SELECT
	last_name,
	job_id,
	salary 
FROM
	employees 
WHERE
	salary < ANY ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' ) 
	AND job_id <> 'IT_PROG';

返回其他工種中比job_id爲IT_PROG部門所有工資低的員工的姓名,Job_id以及salary

SELECT
	last_name,
	job_id,
	salary 
FROM
	employees 
WHERE
	salary < ALL ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' ) 
	AND job_id <> 'IT_PROG';

行子查詢(結果集一行多列或多行多列)

## 查詢員工編號最小並且工資最高的員工信息

SELECT * FROM employees WHERE ( employee_id, salary )=( SELECT MIN( employee_id ), MAX( salary ) FROM employees );

二:select後面

查詢每個部門的員工個數 難點重點

SELECT d.*,( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id ) '員工個數' 
FROM
	departments d 
GROUP BY
	d.department_id;

查詢員工號=102的部門名 難點重點

SELECT
	( SELECT d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id = 102 ) '部門名';

三:from後面

注意:

將子查詢的結果充當一張表,要求必須起別名

案例:查詢每個部門的平均工資的工資等級 重點難點

SELECT
	avg_temp.*,
	j.grade_level 
FROM
	( SELECT avg( salary ) ag, department_id FROM employees GROUP BY department_id ) AS avg_temp
	INNER JOIN job_grades j ON avg_temp.ag BETWEEN j.lowest_sal 
	AND j.highest_sal;

四:exists後面(相關子查詢)

語法:
			exists(完整的查詢語句)
結果:1或0

案例:查詢有員工的部門名

#第一種方式使用in方式
SELECT
	department_id,
	department_name 
FROM
	departments 
WHERE
	department_id IN ( SELECT department_id FROM employees );
#	第二種使用exists方式
SELECT
	department_id,
	department_name 
FROM
	departments d 
WHERE
	EXISTS ( SELECT * FROM employees e WHERE e.department_id = d.department_id );

查詢沒有女朋友的男神信息

#第一種是用exists方式
SELECT
	bo.* 
FROM
	boys bo 
WHERE
	NOT EXISTS ( SELECT boyfriend_id FROM beauty b WHERE bo.id = b.boyfriend_id );
	#第二種使用in的方式
	SELECT
	bo.* 
FROM
	boys bo 
WHERE
	bo.id NOT IN ( SELECT boyfriend_id FROM beauty );

練習題:

查詢和zlotkey相同部門的員工姓名和工資

SELECT last_name, salary FROM employees e WHERE e.department_id =( SELECT department_id FROM employees WHERE last_name = 'zlotkey' );

查詢工資比公司平均工資高的員工的員工號,姓名和工資

SELECT employee_id, salary, last_name FROM employees WHERE salary >( SELECT AVG( salary ) FROM employees );

查詢各部門中工資比本部門平均工資高的員工的員工號,姓名,工資 重點難點

SELECT
	employee_id,
	last_name,
	salary,
	e.department_id 
FROM
	employees e
	INNER JOIN ( SELECT avg( salary ) ag, department_id FROM employees GROUP BY department_id ) ag_temp ON e.department_id = ag_temp.department_id 
WHERE
	salary > ag_temp.ag;

查詢和姓名中含含字母u的員工在相同部門的員工的員工號和姓名

SELECT
	employee_id,
	last_name 
FROM
	employees 
WHERE
	department_id IN ( SELECT DISTINCT department_id FROM employees WHERE last_name LIKE '%u%' );

查詢在部門的location_id爲1700的部門工作的員工的員工號

SELECT
	employee_id 
FROM
	employees 
WHERE
	department_id IN ( SELECT DISTINCT department_id FROM departments WHERE location_id = 1700 );

查詢管理者是k_ing的員工姓名和工資

SELECT
	last_name,
	salary 
FROM
	employees 
WHERE
	manager_id IN ( SELECT employee_id FROM employees WHERE last_name = 'k_ing' );

查詢工資最高的員工的姓名,要求first_name和last_name顯示一列,列名爲姓.名 重點 concat函數拼接字符串

SELECT CONCAT( first_name, last_name ) '姓.名' FROM employees WHERE salary =( SELECT MAX( salary ) FROM employees );

分頁查詢

應用場景:當顯示的數據,一頁顯示不全,需要分頁提交sql請求

語法分頁

	select		查詢列表
	
	from			表1   別名
	
  【left,inner,right】	join		表2   別名
  
  	on	連接條件
  	
  	where		篩選條件
  	
  	group by		分組字段
  	
  	having		分組後篩選
  	
  	order	by		排序的字段
  	
  	limit		offset,size
  	
  	offset	要顯示條目的起始索引    (起始索引從0開始)
  	
  	size	要顯示的條目個數

分頁特點:

  		1:limit語句放在查詢的最好
  		
  		2:公式
  		
  			要顯示的頁數page,每頁的條目數size
  			
  			select		查詢列表
  			
  			from		表
  			
  			limit	(page-1)*size,size;

案例:查詢前前五條員工信息

SELECT * FROM employees
LIMIT 0,5;


SELECT * FROM employees
LIMIT 5;

查詢第11條到第25條

SELECT * FROM employees
LIMIT 10,15;

查詢有獎金的員工信息,並且工資較高的前10名顯示出來

SELECT
	* 
FROM
	employees 
WHERE
	commission_pct IS NOT NULL 
ORDER BY
	salary DESC 
	LIMIT 0,
	10;

**

查詢語句設計到的所有關鍵字,以及sql執行的先後順序如圖

**
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章