SQLiteHaving 子句
前面我们已经学到了可以用 GROUP BY 子句来对数据进行分组,那么可不可以对分组的数据进一步筛选呢?比如,只想列出 name 计数大于 1 的人名(列出重名的人)
SQLite HAVING 子句可以指定条件来过滤 GROUP BY 分组的结果。
注意 WHERE 子句在所选列上设置条件 而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件
HAVING 子句在 SELECT 查询中的位置
SELECT FROM WHERE GROUP BY HAVING ORDER BY
语法
在 SELECT 语句中,HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前。
下面是包含 HAVING 子句的 SELECT 语句的语法:
SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2
范例
假设我们在往 company 里插入数据是重复添加了 James
qlite> SELECT * FROM company; id name age address salary ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 8 James 24 Houston 10000.0
你可以使用这条语句
INSERT INTO COMPANY VALUES (8, 'James', 24, 'Houston', 10000.00 );
添加重复的 James
我们使用 HAVING 子句来显示 name 出现了2次及以上的人名
sqlite> SELECT * FROM company GROUP BY name HAVING count(name) >= 2; id name age address salary ---------- ---------- ---------- ---------- ---------- 8 James 24 Houston 10000.0
这将产生以下结果:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000 5 David 27 Texas 85000 6 Kim 22 South-Hall 45000 4 Mark 25 Rich-Mond 65000 3 Teddy 23 Norway 20000
如果只显示 name 没有重复,的可以使用下面的 HAVING 子句
id name age address salary ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 4 Mark 25 Rich-Mond 65000.0 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0