第八章、 select语句的6大子句

文章目录

    • 8.1 6大子句顺序
    • 8.2 group by与分组函数
    • 8.3 having与分组函数
    • 8.4 order by
    • 8.5 limit

8.1 6大子句顺序

(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

8.2 group by与分组函数

第八章、 select语句的6大子句_第1张图片

可以使用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语句的6大子句_第2张图片

SELECT   department_id dept_id, job_id, SUM(salary)
FROM     employees
GROUP BY department_id, job_id ;

8.3 having与分组函数

第八章、 select语句的6大子句_第3张图片

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;

第八章、 select语句的6大子句_第4张图片

#统计部门平均工资高于8000的部门和平均工资
SELECT   department_id, AVG(salary)
FROM     employees
GROUP BY department_id
HAVING   AVG(salary)>8000 ;

8.4 order by

order by:

降序:desc

升序:用么默认,要么加asc

8.5 limit

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

你可能感兴趣的:(MySQL基础)