Mysql中having與where的區(qū)別小結(jié)
一. 簡介
where
對查詢數(shù)據(jù)進行過濾
having
用于對已分組的數(shù)據(jù)進行過濾【having和group by 必須配合使用(有having必須出現(xiàn)group by)】
二. 用法
where
select * from table where sum(字段)>100
having
select * from table group by 字段 having 字段>10
三.區(qū)別
1. 被執(zhí)行的數(shù)據(jù)來源不同
where是數(shù)據(jù)從磁盤讀入內(nèi)存的時候進行判斷,【數(shù)據(jù)分組前進行過濾】
而having是磁盤讀入內(nèi)存后再判斷?!緦Ψ纸M之后的數(shù)據(jù)再進行過濾】
所以:使用where比用having效率要高很多。
2. 執(zhí)行順序不一樣
Where>Group By>Having
MySQL解釋sql語言時的執(zhí)行順序:
SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition><strong> WHERE</strong> <where_condition> GROUP BY <group_by_list><strong> HAVING</strong> <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
3. where不可以使用字段的別名,但是having可以
select name as aa from student where aa > 100 (錯誤) select name as aa from student group name having aa > 100 (正確)
4. having能夠使用聚合函數(shù)當(dāng)做條件,但是where不能使用,where只能使用存在的列當(dāng)做條件
select * as aa from student where count(*) > 1 (錯誤) select * from student group name having count(name) > 1 (正確)
注意:能用where就用where
5. 多表關(guān)聯(lián)查詢時,where先篩選再聯(lián)接,having先聯(lián)接再篩選
找出所有在'IT'部門且薪水高于10000的員工:(在聯(lián)接之前先進行了篩選)
SELECT e.employee_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 10000 AND d.department_name = 'IT';
找出每個客戶下訂單的總金額超過1000的客戶及其訂單總金額:(先聯(lián)表,基于分組后的聚合結(jié)果來過濾)
SELECT c.customer_name, SUM(o.order_amount) AS total_amount FROM customers c JOIN orders o ON c.customer_id = o.customer_id GROUP BY c.customer_name HAVING SUM(o.order_amount) > 1000;
總結(jié)
- where子句在數(shù)據(jù)被聯(lián)接和分組之前應(yīng)用,用于過濾行
- having子句在數(shù)據(jù)被聯(lián)接、分組和聚合之后應(yīng)用,用于過濾分組
到此這篇關(guān)于Mysql中having與where的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Mysql having與where區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL之權(quán)限以及設(shè)計數(shù)據(jù)庫案例講解
這篇文章主要介紹了MySQL之權(quán)限以及設(shè)計數(shù)據(jù)庫案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08mysql8.0?lower_case_table_names?大小寫敏感設(shè)置問題解決
在默認情況下,這個變量是設(shè)置為0的,以保持向前兼容性,如果將該變量設(shè)置為1,則表名和數(shù)據(jù)庫名將被區(qū)分大小寫,本文主要介紹了mysql8.0?lower_case_table_names?大小寫敏感設(shè)置問題解決,感興趣的可以了解一下2023-09-09MySQL雙主搭建+keepalived高可用的實現(xiàn)
本文主要介紹了MySQL雙主搭建+keepalived高可用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04詳解mysql中的concat相關(guān)函數(shù)
這篇文章主要介紹了mysql中的concat相關(guān)函數(shù),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11MySQL使用binlog日志恢復(fù)數(shù)據(jù)的方法步驟
binlog日志是用于記錄所有修改數(shù)據(jù)庫內(nèi)容的操作,本文主要介紹了MySQL使用binlog日志恢復(fù)數(shù)據(jù)的方法步驟,具有一定的參考價值,感興趣的可以了解一下2025-03-03Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點
這篇文章主要為大家介紹了Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05