1. 程式人生 > 實用技巧 >06、MySQL分頁查詢、子查詢經典案例、聯合查詢

06、MySQL分頁查詢、子查詢經典案例、聯合查詢

目錄

分頁查詢

#進階九、分頁查詢
/*
應用場景:當要顯示的資料一頁顯示不全時,需要分頁提交sql請求。
語法:
select 查詢列表
from 表名
[連線型別] join 表2
on 連線條件
where 篩選條件
group by 分組條件
having 分組後的篩選
order by 排序
limit 起始索引offset,顯示的條目數size;

注意:在學習字串的substring函式時,字串的索引從1開始,但是在這裡,起始索引offset從0開始

1、特點:limit子句在查詢語句的最後,
2、要顯示頁數是page,每一頁的條目數是size,limit (page-1)*size,size
*/
#查詢前5條員工的資訊
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 10;

子查詢經典案例

#1、查詢工資最低的員工資訊
SELECT *
FROM employees
WHERE salary = (
	SELECT MIN(salary)
	FROM employees
);
#2、查詢平均工資最低的部門資訊 ※
SELECT d.*
FROM (
	SELECT AVG(salary) 平均工資, department_id
	FROM employees
	GROUP BY department_id
) temp 
INNER JOIN departments d
ON temp.department_id = d.`department_id`
ORDER BY 平均工資 ASC
LIMIT 1;
#3、查詢平均工資最低的部門資訊和該部門的平均工資
SELECT 平均工資, d.*
FROM (
	SELECT AVG(salary) 平均工資, department_id
	FROM employees
	GROUP BY department_id
) temp 
INNER JOIN departments d
ON temp.department_id = d.`department_id`
ORDER BY 平均工資 ASC
LIMIT 1;
#4、查詢平均工資最高的job資訊
SELECT temp.平均工資, j.*
FROM (
	SELECT AVG(salary) 平均工資, job_id
	FROM employees
	GROUP BY job_id
	ORDER BY 平均工資 DESC
	LIMIT 1
) temp
INNER JOIN jobs j
ON temp.job_id = j.`job_id`;
#5、查詢平均工資高於公司平均工資的部門有哪些?
SELECT department_id, AVG(salary) 平均工資
FROM employees
GROUP BY department_id
HAVING 平均工資 > (
	SELECT AVG(salary) 公司平均工資
	FROM employees
);
#6、查詢公司中所有manager的詳細資訊
SELECT *
FROM employees
WHERE employee_id IN (
	SELECT manager_id
	FROM employees
	GROUP BY manager_id
);
#7、各個部門的最高工資中,最低的那個是多少?
SELECT MIN(temp.最高工資) 最低工資
FROM (
	SELECT MAX(salary) 最高工資
	FROM employees
	GROUP BY department_id
) temp;
#並且查詢是那個部門
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
	SELECT MAX(salary) maxSalary
	FROM employees
	GROUP BY department_id
	ORDER BY maxSalary ASC
	LIMIT 1
);
#8、查詢平均工資最高的部門 的manager的詳細資訊,last_name,department_id,email,salary
SELECT last_name, e.department_id, email, salary
FROM employees e
WHERE employee_id = (
	SELECT d.`manager_id`
	FROM (
		SELECT AVG(salary) maxSalary, department_id
		FROM employees
		GROUP BY department_id
		ORDER BY maxSalary DESC
		LIMIT 1
	) temp
	JOIN departments d
	ON temp.department_id = d.`department_id`
);

聯合查詢

#進階十、聯合查詢
/*
union:將多條查詢語句的結果合併為一個結果,

語法:
查詢語句1
union
查詢語句2
*/
#查詢部門編號>90或者是郵箱中包含a的員工資訊
SELECT *
FROM employees
WHERE department_id > 90 OR email LIKE '%a%';
或者
SELECT * FROM employees WHERE department_id > 90
UNION
SELECT * FROM employees WHERE email LIKE '%a%';

/*
當我們要查詢的結果來自多張表,而且多張表之間沒有連線關係,查詢的資訊(欄位)一致時,可以使用聯合查詢
*/


/*
聯合查詢的特點:
1、要求多條查詢語句的查詢列數一致;
2、要求多條查詢語句的每一列的型別和順序最好一致;
3、union關鍵字預設是去重的,使用union all可以包含重複項
*/