1. 程式人生 > >Java 11---SELECT分組查詢和子查詢

Java 11---SELECT分組查詢和子查詢

導讀

1.GROUP BY子句
2.HAVING子句
3.巢狀子查詢

GROUP BY子句

語法:
	SELECT
	FROM
	WHERE
	GROUP BY 列1,列2...
	ORDER BY;

注意:

1.執行流程
	FROM->WHERE,行的篩選->GROUP BY,把行分組->SELECT,針對組的統計
	->ORDER BY,排序
	2.WHERE:分組前的篩選,GROUP BY在WHERE之後
	3.組函式:一個組可以得到一個結果
	4.查詢時,SELECT子句出現組函式或者有GROUP BY子句["組"關係],
		查詢中不能出現普通的列,但可以出現分組的列
	5.可以按照多列分組,多個列值都相等的在一組
eg1:列出每個部門員工的數量,最低薪水,平均薪水,最高薪水
	SELECT dept_id,COUNT(id),MIN(salary),AVG(salary),MAX(salary)
	FROM s_emp
	GROUP BY dept_id;
	
eg2:查詢每個銷售對應的客戶數量,銷售編號,銷售名字	
	SELECT c.sales_rep_id,COUNT(c.id),e.first_name
	FROM s_customer c,s_emp e
	WHERE c.sales_rep_id=e.id
	GROUP BY c.sales_rep_id,e.first_name;

eg3:查詢部門編號大於40的每個部門id,部門人數,部門名
	SELECT d.id,d.name,COUNT(e.id)
	FROM s_emp e,s_dept d
	WHERE e.dept_id=d.id
	AND d.id>40
	GROUP BY d.id,d.name;

HAVING子句

	WHERE子句:行的篩選	
	HAVING:組的篩選,一定出現在分組後

語法:
	SELECT
	FROM
	WHERE 條件
	GROUP BY
	HAVING 條件
	ORDER BY;

注意:

1.執行流程
	FROM->WHERE,行的篩選->GROUP BY,分組->HAVING,組的篩選->SELECT
	->ORDER BY;
	2.有GROUP BY,才能有HAVING
	3.HAVING中只能只用組函式或者分組的列
eg1:查詢部門人數高於2人的部門編號,部門人數
	SELECT dept_id,COUNT(id)
	FROM s_emp
	GROUP BY dept_id
	HAVING COUNT(id)>2;
	
eg2:查詢職位包含sal(不區分大小寫)的並且對應職位人數高於2人的職位名,人數
	SELECT title,COUNT(id)
	FROM s_emp
	WHERE LOWER(title) LIKE '%sal%'
	GROUP BY title
	HAVING COUNT(id)>2;  效率更高
	
	SELECT title,COUNT(id)
	FROM s_emp
	GROUP BY title
	HAVING LOWER(title) LIKE '%sal%' AND COUNT(id)>2;
	

巢狀子查詢

SELECT
FROM
WHERE (
	SELECT
	FROM
	WHERE
);

注意:

1.查詢裡面巢狀的查詢需要用()括起來
		2.子查詢可能出現的位置:WHERE子句,HAVING子句,FROM子句