Mysql中where與having的區(qū)別實(shí)例詳解
以一道題來(lái)做引子
???,SQL30 計(jì)算總和
OrderItems表代表訂單信息,包括字段:訂單號(hào)order_num和item_price商品售出價(jià)格、quantity商品數(shù)量。
order_num | item_price | quantity |
a1 | 10 | 105 |
a2 | 1 | 1100 |
a3 | 1 | 200 |
a4 | 2 | 1121 |
a5 | 5 | 10 |
a6 | 1 | 19 |
a7 | 7 | 5 |
【問題】編寫 SQL 語(yǔ)句,根據(jù)訂單號(hào)聚合,返回訂單總價(jià)不小于1000 的所有訂單號(hào),最后的結(jié)果按訂單號(hào)進(jìn)行升序排序。
提示:總價(jià) = item_price 乘以 quantity
order_num | total_price |
a1 | 1050 |
a2 | 1319 |
a4 | 2242 |
先來(lái)看一看錯(cuò)誤的寫法:
select order_num, sum(item_price*quantity) total_price from OrderItems group by order_num where total_price >= 1000 order by order_num
錯(cuò)誤:SQL_ERROR_INFO: "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 total_price >= 1000\norder by order_num' at line 4"
上述的錯(cuò)誤為:非法使用聚合函數(shù),不能在 WHERE 子句中使用聚合函數(shù)
我們的 total_price等價(jià)于sum(item_price*quantity),而在WHERE 子句中使用聚合函數(shù)
改錯(cuò)
select order_num, sum(item_price*quantity) total_price from OrderItems group by order_num having total_price >= 1000 order by order_num
這樣就對(duì)了
使用having時(shí)注意:
1. 行已經(jīng)被分組。
2. 使用了聚合函數(shù)。
3. 滿足HAVING 子句中條件的分組將被顯示。
4. HAVING 不能單獨(dú)使用,必須要跟 GROUP BY 一起使用。
那么和where的區(qū)別有以下幾點(diǎn):
1. WHERE 可以直接使用表中的字段作為篩選條件,但不能使用分組中的計(jì)算函數(shù)作為篩選條件; HAVING 必須要與 GROUP BY 配合使用,可以把分組計(jì)算的函數(shù)和分組字段作為篩選條件。
2. 如果需要通過連接從關(guān)聯(lián)表中獲取需要的數(shù)據(jù),WHERE 是先篩選后連接,而 HAVING 是先連接 后篩選。
3. 第二項(xiàng)導(dǎo)致了WHERE執(zhí)行效率高,不能使用分組中的計(jì)算函數(shù)進(jìn)行篩選,而HAVING 可以使用分組中的計(jì)算函數(shù),執(zhí)行效率較低。
where、聚合函數(shù)、having在from后面的執(zhí)行順序:
where > 聚合函數(shù) > having
若需要對(duì)聚合函數(shù)對(duì)group by的結(jié)果進(jìn)行過濾,只能使用having。Having語(yǔ)句通常與Group by語(yǔ)句聯(lián)合使用,用來(lái)過濾Group by語(yǔ)句返回的結(jié)果集,Having語(yǔ)句的存在彌補(bǔ)了Where關(guān)鍵字不能與聚合函數(shù)聯(lián)合使用的不足。
例如:查詢平均成績(jī)大于60分的同學(xué)的學(xué)號(hào)和平均成績(jī)
select s_id, AVG(s_score) s_avg from Score group by s_id Having AVG(s_score) > 60;
也可以寫成如下形式:
select s_id, AVG(s_score) s_avg from Score group by s_id Having s_avg > 60;
如果將Having改成where 就會(huì)報(bào)錯(cuò),因?yàn)閣here的執(zhí)行順序大于聚合函數(shù)。
總結(jié)
到此這篇關(guān)于Mysql中where與having區(qū)別的文章就介紹到這了,更多相關(guān)Mysql where與having區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探究MySQL事務(wù)實(shí)現(xiàn)原理
數(shù)據(jù)庫(kù)事務(wù)是指一組數(shù)據(jù)庫(kù)操作,這些操作必須被視為一個(gè)不可分割的單元,要么全部執(zhí)行成功,要么全部失敗回滾,本文詳細(xì)的給大家介紹了MySQL事務(wù)的實(shí)現(xiàn)原理,對(duì)我們學(xué)習(xí)MySQL有一定的幫助,感興趣的同學(xué)可以跟著小編一起來(lái)探究2023-06-06Mysql主鍵和唯一鍵的區(qū)別點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Mysql主鍵和唯一鍵的區(qū)別,有興趣的朋友們學(xué)習(xí)下吧。2019-02-02數(shù)據(jù)庫(kù)中GROUP?BY語(yǔ)句詳解、示例、注意事項(xiàng)
在Oracle數(shù)據(jù)庫(kù)中GROUP?BY是用于對(duì)結(jié)果集進(jìn)行分組的一個(gè)關(guān)鍵字,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)中GROUP?BY語(yǔ)句詳解、示例、注意事項(xiàng)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Mysql 5.7.9 shutdown 語(yǔ)法實(shí)例詳解
之前如果想關(guān)閉一個(gè)mysql數(shù)據(jù)庫(kù)可以通過kill 命令、mysqladmin shutdown 、service mysqld stop 等這樣的方式。然而在mysql-5.7.9之后mysql終于提供了SQL接口的shutdown語(yǔ)法啦2017-06-06