Where and Having區別

Where和Having的異同mysql

(1)where是查詢返回結果以前進行過濾的sql

(2)having是查詢返回結果以後,對結果進行過濾的bash

(3)在SQL中增長 HAVING 子句緣由是,where關鍵字沒法與聚合函數一塊兒使用,having子句常跟group by一同使用,過濾分組後的數據ide


測試表函數

mysql> select * from t_order;
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+
|  22744 | d006    | 1986-12-01 | 9999-01-01 |
|  24007 | d005    | 1986-12-01 | 9999-01-01 |
|  30970 | d005    | 1986-12-01 | 2017-03-29 |
|  31112 | d002    | 1986-12-01 | 1993-12-10 |
|  40983 | d005    | 1986-12-01 | 9999-01-01 |
|   NULL | d008    | 1986-12-01 | 1992-05-27 |
|  48317 | d008    | 1986-12-01 | 1989-01-11 |
|  49667 | d007    | 1986-12-01 | 9999-01-01 |
|  50449 | d005    | 1986-12-01 | 9999-01-01 |
|  10004 | d004    | 1986-12-01 | 9999-01-01 |
+--------+---------+------------+------------+
10 rows in set (0.00 sec)


Where後面若是提早使用列emp_no的別名aaa進行過濾的話,會報錯列不存在,這是由於where字句是先對錶進行過濾,纔開始查詢結果的測試

mysql> select emp_no as aaa from t_order where emp_no=22744;
+-------+
| aaa   |
+-------+
| 22744 |
+-------+
1 row in set (0.00 sec)

mysql> select emp_no as aaa from t_order where aaa=22744;
ERROR 1054 (42S22): Unknown column 'aaa' in 'where clause'


Having後面能夠跟列emp_no的原名或者別名aaa均可以,也能夠跟group by,而後對分組後的聚合函數列進行篩選spa

mysql> select emp_no as aaa from t_order having emp_no=22744;
+-------+
| aaa   |
+-------+
| 22744 |
+-------+
1 row in set (0.01 sec)

mysql> select emp_no as aaa from t_order having aaa=22744;
+-------+
| aaa   |
+-------+
| 22744 |
+-------+
1 row in set (0.00 sec)

mysql> select dept_no,min(emp_no) aaa from t_order  group by dept_no having aaa=31112;
+---------+-------+
| dept_no | aaa   |
+---------+-------+
| d002    | 31112 |
+---------+-------+
1 row in set (0.00 sec)
相關文章
相關標籤/搜索