关于java:面试突击62group-by-有哪些注意事项

1次阅读

共计 1494 个字符,预计需要花费 4 分钟才能阅读完成。

留神:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。

1.group by 前面不能加 where

在 MySQL 中,所有的 SQL 查问语法要遵循以下语法程序:

  1. select
  2. from
  3. where
  4. group by
  5. having
  6. order by
  7. limit

以上语法程序是不能前后调换的,否则报错。比方咱们不能在 group by 之后增加 where 查问语句,否则会呈现如下谬误:

语法程序的执行是和 MySQL 的 select 语句执行程序相干的,select 执行先后顺序如下:

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. 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 语句执行程序如下:

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. 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

正文完
 0