(1)from:从哪些表中筛选
(2)where:从表中筛选的条件
(3)group by:分组依据
(4)having:在统计结果中再次筛选
(5)order by:排序
(6)limit:分页
(1)6大子句不一定都同时出现
(2)6大子句如果有同时出现的,那么顺序不能随意
顺序:from ,where,group by,having,order by,limit
order by:
降序:desc
升序:用么默认,要么加asc
limit:
limit m,n
m = (第几页 - 1)*每页的数量
n = 每页的数量
代码示例:
#查询每个部门的男生的人数,并且显示人数超过5人的,按照人数降序排列,
#每页只能显示10条,我要第2页
SELECT did,COUNT(*) "人数"
FROM t_employee
WHERE gender = '男'
GROUP BY did
HAVING COUNT(*)>5
ORDER BY 人数 DESC
LIMIT 10,10
可以使用GROUP BY子句将表中的数据分成若干组
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression];
明确:WHERE一定放在FROM后面GROUP BY 前面
在SELECT列表中所有未包含在分组函数中的列都应该包含在 GROUP BY子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
SELECT AVG(salary)
FROM employees
GROUP BY department_id ;
使用多个列分组
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>8000 ;
having与where的区别?
(1)where是从表中筛选的条件,而having是统计结果中再次筛选
(2)where后面不能加“分组/聚合函数”,而having后面可以跟分组函数
#统计部门平均工资高于8000的部门和平均工资
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000 #错误
GROUP BY department_id;
#统计部门平均工资高于8000的部门和平均工资
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary)>8000 ;
order by:
降序:desc
升序:用么默认,要么加asc
limit:
limit m,n
m = (第几页 - 1)*每页的数量
n = 每页的数量
代码示例:
#查询每个部门的男生的人数,并且显示人数超过5人的,按照人数降序排列,
#每页只能显示10条,我要第2页
SELECT did,COUNT(*) "人数"
FROM t_employee
WHERE gender = '男'
GROUP BY did
HAVING COUNT(*)>5
ORDER BY 人数 DESC
LIMIT 10,10
补充:
分组之后,将每个组进行累加求和,做一个合计
WITH ROLLUP 合计
#查询每个部门的编号,人数
SELECT did,COUNT(*)
FROM t_employee
GROUP BY did
#查询每个部门的编号,人数,并做一个合计
SELECT did,COUNT(*)
FROM t_employee
GROUP BY did
WITH ROLLUP
#查询每个部门的编号,人数,并做一个合计
SELECT IFNULL(did,'合计') AS 编号,COUNT(*) AS 人数
FROM t_employee
GROUP BY did
WITH ROLLUP