1. 程式人生 > >MySql中where和having的區別

MySql中where和having的區別

    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中有的欄位。