面試突擊62:group by 有哪些注意事項?
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第14天,點選檢視活動詳情
注意:本文以下內容基於 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.having 或 group by 可單獨使用
having 和 group by 可以單獨使用,如下查詢所示:
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);
表中的資料如下圖所示: 當我們使用總成績別名 total 分別在 where 和 having 中使用時,查詢結果如下: 從上述結果可以看出,having 查詢可以使用 select 中的別名,而 where 不能使用別名。 除了 having 可以使用別名之外,group by 也可以使用別名,如下圖所示:
為什麼where不能用別名?為having卻可以?
where 中不能使用別名,這和 MySQL 語句執行順序有關,MySQL 語句執行順序如下:
- from 階段
- where 階段
- group 階段
- having 階段
- select 階段
- order by 階段
- limit 階段
也就是說,在執行 where 查詢時,select 還沒執行,因此在 where 中想要使用還未執行的 select 中的別名是不行的。那從上面的執行順序可以看到,having 執行也在 select 之前,為什麼它就可以使用 select 中的別名呢?
這是因為 MySQL 在 5.7.5 之後做了擴充套件,允許在 having 中使用別名,官方文件中有相應的說明,如下圖所示: 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面試真題解析
- 面試官:什麼是雙親委派模型?
- 面試官:熔斷和降級有什麼區別?
- 寬表為什麼橫行?
- 有沒有完全自主的國產化資料庫技術
- 面試突擊64:瞭解 HTTP 協議嗎?
- 面試突擊80:說一下 Spring 中 Bean 的生命週期?
- 面試突擊89:事務隔離級別和傳播機制有什麼區別?
- 面試突擊82:SpringBoot 中如何操作事務?
- 面試突擊87:說一下 Spring 事務傳播機制?
- 面試突擊81:什麼是跨域問題?如何解決?
- 面試突擊71:GET 和 POST 有什麼區別?
- 面試突擊70:什麼是粘包和半包?怎麼解決?
- 面試突擊68:為什麼 TCP 需要 3 次握手?
- 面試突擊66:請求轉發和請求重定向有什麼區別?
- 面試突擊63:MySQL 中如何去重?
- 面試突擊65:為什麼要用HTTPS?它有什麼優點?
- 面試突擊62:group by 有哪些注意事項?
- 面試突擊53:常見的 HTTP 狀態碼有哪些?
- 面試突擊61:說一下MySQL事務隔離級別?
- 面試突擊52:什麼是三正規化?它有什麼用?