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

1. 前言

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

2. where 和 having

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

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

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

USE mooc_demo;

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

USE `mooc_demo`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '數(shù)據(jù)庫(kù)主鍵',
  `username` varchar(32) DEFAULT NULL COMMENT '用戶(hù)名',
  `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;

然后再插入一些測(cè)試數(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 都能使用的場(chǎng)景

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 的場(chǎng)景

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

第一條 sql 執(zhí)行成功,執(zhí)行第二條 sql 會(huì)報(bào)錯(cuò):ERROR 1054 (42S22): Unknown column 'age' in 'having clause',翻譯過(guò)來(lái)就是 "對(duì)于 having 語(yǔ)句,age 字段是未知的"。

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

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

2.3 只能用 having,不能用 where 的場(chǎng)景

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)計(jì)平均年齡大于 20 的人數(shù)、性別和平均年齡"。

但是第一條 sql 執(zhí)行會(huì)報(bào)錯(cuò):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,即對(duì)于 where 語(yǔ)句,全表并沒(méi)有 avg_age 平均年齡這個(gè)字段,所以會(huì)搜索失敗。

從上述的實(shí)驗(yàn)結(jié)果總結(jié)來(lái)看,where 和 having 的核心區(qū)別有三點(diǎn):

① 使用范圍的不同:

  • where:能夠用于 select、update、delete 語(yǔ)句;
  • having:只能用于 select 查詢(xún)語(yǔ)句。

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

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

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

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

3. 小結(jié)

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