在此之前,我們首先要了解一下幾個常用的命令和區別
-
having與where
區別在於執行時機不同,where是在檢索開始時從數據源中獲取,having是從分組後的數據結果中獲取。
所以,重點在於having所篩選的數據一定是在where刪選之後!
這個having說白了就是爲了配合統計函數使用的 -
exist的總結
這個子查詢的目的不在於爲了產生結果集,只是用來判斷某個子查詢是否查詢到了數據,返回的是一個布爾值。 -
count()統計函數
count()求某個組內非NULL記錄的值,而count(*)可以求出某個組內含null記錄的值。
下面建表試驗一下。
CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`Gender` tinyint(4) NOT NULL COMMENT '0爲男,1爲女',
`score` int(11) NOT NULL,
`class` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
目的求出這個班中男女生中的前兩名。
SELECT *FROM table1 a
where EXISTS (SELECT COUNT(*) FROM table1 b WHERE b.score>=a.score
GROUP BY b.gender HAVING COUNT(*)<=2 ) ORDER BY Gender,score DESC
得出結果是這樣的
分析一下這個結構,在where exists 後的子查詢的意思是,按性別分組之後,這個表中比這個學生分數還高的人數少於兩個的查出來,之所以能夠顯示分組之後的人數,私以爲這就是形成一個循環,只要滿足條件,就接着輸出。類似這種條件均可以如此解決。這裏面有個大坑,回頭問問大神看看是什麼情況。