共计 1494 个字符,预计需要花费 4 分钟才能阅读完成。
留神:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。
1.group by 前面不能加 where
在 MySQL 中,所有的 SQL 查问语法要遵循以下语法程序:
- select
- from
- where
- group by
- having
- order by
- limit
以上语法程序是不能前后调换的,否则报错。比方咱们不能在 group by 之后增加 where 查问语句,否则会呈现如下谬误:
语法程序的执行是和 MySQL 的 select 语句执行程序相干的,select 执行先后顺序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
留神:其中 select 比拟非凡,在进行查问语句编写时,要写在最后面,其余语法程序要和执行先后顺序保持一致。
2.group by 或 having 可独自应用
having 和 group by 能够独自应用,如下查问所示:
3.group by 和 having 可应用别名
当 having 独自应用时,它的作用和 where 相似,但又有轻微的不同。 比方在 where 中不能应用别名,但 having 和 group by 却能够别名。咱们创立一个测试表来演示一下,建表 SQL 如下:
drop table if exists student_score;
create table student_score(
id int primary key auto_increment comment '主键',
name varchar(250) comment '姓名',
math decimal(4,1) comment '数学问题',
chinese decimal(4,1) comment '语文问题'
);
insert into student_score(name,math,chinese) values('张三',50,50),('李四',80,80),('王五',90,90);
表中的数据如下图所示:
当咱们应用总成绩别名 total 别离在 where 和 having 中应用时,查问后果如下:
从上述后果能够看出,having 查问能够应用 select 中的别名,而 where 不能应用别名。
除了 having 能够应用别名之外,group by 也能够应用别名,如下图所示:
为什么可用别名?
where 中不能应用别名,这和 MySQL 语句执行程序无关,MySQL 语句执行程序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
也就是说, 在执行 where 查问时,select 还没执行,因而在 where 中想要应用还未执行的 select 中的别名是不行的。 那从下面的执行程序能够看到,having 执行也在 select 之前,为什么它就能够应用 select 中的别名呢?
这是因为 MySQL 在 5.7.5 之后做了扩大,容许在 having 中应用别名,官网文档中有相应的阐明,如下图所示:
MySQL 官网文档地址:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
PS:group by 能应用别名的原理和 having 相似。
总结
SQL 语句编写肯定要遵循此先后顺序:select、from、where、group by、having、order by、limit。其中 having 或 group by 都可独自应用,并且在 MySQL 5.7.5 之后,group by 和 having 能够应用别名查问,但 where 不能应用别名。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 面试真题解析
面试合集:https://gitee.com/mydb/interview