MySql中where和having的區別
阿新 • • 發佈:2018-12-10
1、where 後不能跟聚合函式,因為where執行順序大於聚合函式。
2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,條件 中不能包含聚組函式,使用where條件顯示特定的行。
3、having 子句的作用是篩選滿足條件的組,即在分組之後過濾資料,條件中經常包含聚組函式,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。
where是在判斷資料從磁碟讀入記憶體的時候,而having是判斷分組統計之前的所有條件,所以having是在對select查詢的欄位中進行的操作, 如:
我們建立一個員工表
CREATE TABLE `emp` ( `empno` int(11) NOT NULL, `ename` varchar(50) DEFAULT NULL, `job` varchar(50) DEFAULT NULL, `mgr` int(11) DEFAULT NULL, `hiredate` date DEFAULT NULL, `sal` decimal(7,2) DEFAULT NULL, `comm` decimal(7,2) DEFAULT NULL, `deptno` int(11) DEFAULT NULL, PRIMARY KEY (`empno`), KEY `fk_emp` (`mgr`), CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`mgr`) REFERENCES `emp` (`empno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然後進行查詢,
select empno,ename,job,mgr
from emp
where deptno=20
這是在資料從磁碟讀入記憶體的時候,進行的判斷,不會出錯。
select empno,ename,job,mgr
from emp
having deptno=20
這時會出錯,因為前面並沒有篩選出deptno欄位 他會先查詢出所有的記錄到記憶體,形成了一個表,在對錶進行操作,這是隻能操作表中的欄位,也就是select中有的欄位。