面試突擊62:group by 有哪些注意事項?

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第14天,點選檢視活動詳情

注意:本文以下內容基於 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 查詢語句,否則會出現如下錯誤: image.png 語法順序的執行是和 MySQL 的 select 語句執行順序相關的,select 執行先後順序如下:

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

注意:其中 select 比較特殊,在進行查詢語句編寫時,要寫在最前面,其餘語法順序要和執行先後順序保持一致。

2.having 或 group by 可單獨使用

having 和 group by 可以單獨使用,如下查詢所示: image.png

3.having 和 group by 可使用別名

當 having 單獨使用時,它的作用和 where 類似,但又有細微的不同。比如在 where 中不能使用別名,但 having 和 group by 卻可以別名。咱們建立一個測試表來演示一下,建表 SQL 如下:

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);

表中的資料如下圖所示: image.png 當我們使用總成績別名 total 分別在 where 和 having 中使用時,查詢結果如下: image.png 從上述結果可以看出,having 查詢可以使用 select 中的別名,而 where 不能使用別名。 除了 having 可以使用別名之外,group by 也可以使用別名,如下圖所示: image.png

為什麼where不能用別名?為having卻可以?

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 中使用別名,官方文件中有相應的說明,如下圖所示: image.png MySQL 官方文件地址:http://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面試真題解析

面試合集:http://gitee.com/mydb/interview