第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

1. 前言

在 MySQL 中使用 select 查詢語句的時候,一般都會加上 where 語句或者 limit 語句限定查詢結(jié)果的范圍,兩種子句都是過濾的作用。另外還有和 group by 語句配合使用的 having 限制條件。區(qū)分 where 和 having 語句的作用也是比較基礎(chǔ)的題目。

2. where 和 having

面試官提問: 請闡述下在 MySQL 中 where 和 having 關(guān)鍵詞有什么區(qū)別?

題目解析: 為了更加清楚地闡述兩個關(guān)鍵用法的不同,我們還是從實際例子出發(fā)。

進(jìn)入上一節(jié)創(chuàng)建的測試數(shù)據(jù)庫:

USE mooc_demo;

然后進(jìn)入測試數(shù)據(jù)庫,創(chuàng)建 user 表:

USE `mooc_demo`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '數(shù)據(jù)庫主鍵',
  `username` varchar(32) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(32) DEFAULT NULL COMMENT '密碼',
  `gender` int(2) DEFAULT NULL COMMENT '1:男性,2:女性',
  `age` int(10) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后再插入一些測試數(shù)據(jù):

insert into user (username,password,gender,age) values ('小明','123456',1,20); 
insert into user (username,password,gender,age) values ('小紅','123457',2,22); 
insert into user (username,password,gender,age) values ('小王','123458',1,24); 
insert into user (username,password,gender,age) values ('小劉','123459',2,26); 

2.1 where 和 having 都能使用的場景

select username,password,gender,age from user where age >= 20;
select username,password,gender,age from user having age >= 20;

上述兩條 sql 都能執(zhí)行成功,如果 select 之后的字段包含 having 修飾的字段,這種情況下 where 和 having 是等效的。

2.2 只能用 where,不能用 having 的場景

select username,password,gender from user where age >= 20;
select username,password,gender from user having age >= 20;

第一條 sql 執(zhí)行成功,執(zhí)行第二條 sql 會報錯:ERROR 1054 (42S22): Unknown column 'age' in 'having clause',翻譯過來就是 "對于 having 語句,age 字段是未知的"。

having 執(zhí)行的前置條件是:select xxx,... 篩選出的字段包含 having 修飾的關(guān)鍵詞。

兩者的執(zhí)行順序不同:因為 having 是從前面篩選出來的字段中再進(jìn)行二次篩選,where 則是針對全表先進(jìn)行篩選。

2.3 只能用 having,不能用 where 的場景

select count(*),gender,avg(age) as avg_age from user group by gender where avg_age > 20;
select count(*),gender,avg(age) as avg_age from user group by gender having avg_age > 20;

我們的目的是 "按照性別進(jìn)行分組,統(tǒng)計平均年齡大于 20 的人數(shù)、性別和平均年齡"。

但是第一條 sql 執(zhí)行會報錯:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where avg_age > 20' at line 1,即對于 where 語句,全表并沒有 avg_age 平均年齡這個字段,所以會搜索失敗。

從上述的實驗結(jié)果總結(jié)來看,where 和 having 的核心區(qū)別有三點:

① 使用范圍的不同:

  • where:能夠用于 select、update、delete 語句;
  • having:只能用于 select 查詢語句。

② 執(zhí)行順序不同:

  • where 修飾的搜索條件是在分組完成之前執(zhí)行;
  • having 修飾的搜索條件是在分組完成之后執(zhí)行。如果一條 sql 語句同時包含 where 和 having 關(guān)鍵詞,會先執(zhí)行 where 搜索,再執(zhí)行 having 搜索條件。

③ 聚合函數(shù)的聯(lián)合使用:

  • where:不能聯(lián)合聚合函數(shù)(sum、avg、count、max、min 這類)使用;
  • having:能夠聯(lián)合聚合函數(shù)使用。

3. 小結(jié)

本章節(jié)介紹了 where 和 having 語句的用法和不同點,候選人在闡述的時候需要抓住最核心的一點,where 語句在聚合之前篩選數(shù)據(jù),having 語句在聚合之后對數(shù)據(jù)進(jìn)行篩選,作用在 group by 語句之后。