【MySQL】select语句(from、where、group by、having、order by、limit)

本文深入解析了SQL语言中的六大核心子句:from、where、group by、having、order by和limit,阐述了它们的功能、使用场景及执行顺序,通过实例帮助读者掌握SQL查询语句的构建技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select语句有6大子句:
(1)from子句
(2)where子句
(3)group by子句
(4)having子句
(5)order by子句
(6)limit子句

强调:每一个select的6大子句的顺序是(1)-(6)

  1. 关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
  1. SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同):
FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT

比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:

SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

(1)from子句,后面跟表,视图,多行多列的二维表的结构
from意思从哪里筛选数据 哪个表哪个视图等
(2)where子句:后面跟条件
where意思取那几行,要哪些行
(3)group by:后面跟字段
group by意思是分组

select 结果字段列表
from 表名称
where 条件
group by 分组字段列表;
要求: 结果字段列表中不要出现和分组无关的字段

#查询每个部门的人数
SELECT did,COUNT(*) 
FROM t_employee
GROUP BY did

/*
以下代码,语法不报错,但是语义有问题
建议、要求:分组查询的结果的字段列表中不要出现和分组无关的字段
*/
SELECT ename,did,COUNT(*) 
FROM t_employee
GROUP BY did

#查询每个部门的平均薪资
SELECT did,AVG(salary)
FROM t_employee
GROUP BY did;

#查询每个部门的最高薪资
SELECT did,MAX(salary)
FROM t_employee
GROUP BY did;

#查询每一个部门的男、女的最高薪资
SELECT did,gender,MAX(salary)
FROM t_employee
GROUP BY did,gender;

#查询每一个部门的男、女的人数
SELECT did,gender,COUNT(salary)
FROM t_employee
GROUP BY did,gender;

#查询每一个部门的薪资高于15000的员工的人数
SELECT did,COUNT(*)
FROM t_employee
WHERE salary > 15000
GROUP BY did;

(4)having:后面跟条件
having:意味着在分组统计结果中再次对统计结果加条件,不是对原表中的记录加条件

having和where的区别:
①where后面不能跟分组函数,having后面可以
②where是用于在原表的记录中筛选,having可以是对原表的筛选,但是更多的是用于对统计结果再加条件

having与where的区别?

(1)where是从表中筛选的条件,而having是统计结果中再次筛选

(2)where后面不能加“分组/聚合函数”,而having后面可以跟分组函数

#having
#查询每个部门的人数,只显示部门人数超过10人的
/*
select did,count(*)
from t_employee
where COUNT(*) > 10
group by did;

错误代码: 1111
Invalid use of group function
*/
SELECT did,COUNT(*)
FROM t_employee
GROUP BY did
HAVING COUNT(*) > 10

#查询每个部门的男员工的人数,只显示人数超过2人
SELECT did,COUNT(*)
FROM t_employee
WHERE gender = '男'
GROUP BY did
HAVING COUNT(*) > 2

(5)order by:后面跟字段或表达式
order by:排序
升序:省略asc或加asc
降序:desc

#查询员工姓名和薪资,按照薪资的降序排列
SELECT ename,salary
FROM t_employee
ORDER BY salary DESC

#查询每个部门的员工的人数,按照人数的升序排列
SELECT did,COUNT(*)
FROM t_employee
GROUP BY did
ORDER BY COUNT(*) ASC

#查询每个部门的员工的人数,按照人数的升序排列,如果人数相同,按照did降序排列
SELECT did,COUNT(*)
FROM t_employee
GROUP BY did
ORDER BY COUNT(*) ASC, did DESC


#查询每个部门的男员工的人数,按照部门编号降序排列
SELECT did,COUNT(*)
FROM t_employee
WHERE gender = '男'
GROUP BY did
ORDER BY did DESC

#查询每个部门的男员工的人数,按照部门编号降序排列,显示人数超过1人
SELECT did,COUNT(*)
FROM t_employee
WHERE gender = '男'
GROUP BY did
HAVING COUNT(*)>1
ORDER BY did DESC

(6)limit:取几条记录
limit m,n
m表示从第几条记录开始取,n表示最多取n条件
通常用于分页查询

/*
limit m,n
m:从第几条开始,第一条,用0表示
n:最多取n条

假设page代表第几页,nums代表每页显示的数量
limit (page-1)*nums ,nums

每页显示10条,第1页  limit (1-1)*10,10  -> limit 0,10
每页显示10条,第2页  limit (2-1)*10,10  -> limit 10,10
每页显示10条,第3页  limit (3-1)*10,10  -> limit 20,10

问?每页显示25条,第5页
limit (5-1)*25, 25
*/

#查询员工表的员工信息,每页显示10条,第1页
SELECT * 
FROM t_employee
LIMIT 0,10

#查询员工表的员工信息,每页显示10条,第2页
SELECT * 
FROM t_employee
LIMIT 10,10

#查询员工表的员工信息,每页显示10条,第1页
SELECT * 
FROM t_employee
LIMIT 20,10

(1)from:从哪些表中筛选

(2)where:从表中筛选的条件

(3)group by:分组依据

(4)having:在统计结果中再次筛选

(5)order by:排序

(6)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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值