SQL 教程
1. SQL 教程 2. SQL 简介 3. SQL 语法 4. SQL SELECT 语句 5. SQL SELECT DISTINCT 语句 6. SQL WHERE 子句 7. SQL AND & OR 运算符 8. SQL ORDER BY 关键字 9. SQL INSERT INTO 语句 10. SQL UPDATE 语句 11. SQL DELETE 语句 12. SQL SELECT TOP, LIMIT, ROWNUM 13. SQL LIKE 操作符 14. SQL 通配符 15. SQL IN 操作符 16. SQL BETWEEN 操作符 17. SQL 别名 18. SQL 连接(JOIN) 19. SQL INNER JOIN 关键字 20. SQL LEFT JOIN 关键字 21. SQL RIGHT JOIN 关键字 22. SQL FULL OUTER JOIN 关键字 23. SQL UNION 操作符 24. SQL SELECT INTO 语句 25. SQL INSERT INTO SELECT 语句 26. SQL CREATE DATABASE 语句 27. SQL CREATE TABLE 语句 28. SQL 约束 29. SQL NOT NULL 约束 30. SQL UNIQUE 约束 31. SQL PRIMARY KEY 约束 32. SQL FOREIGN KEY 约束 33. SQL CHECK 约束 34. SQL DEFAULT 约束 35. SQL CREATE INDEX 语句 36. SQL 撤销索引、表以及数据库 37. SQL ALTER TABLE 语句 38. SQL AUTO INCREMENT 字段 39. SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句 40. SQL Server 和 MySQL 中的 Date 函数 41. SQL NULL 值 – IS NULL 和 IS NOT NULL 42. SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数 43. SQL 通用数据类型 44. SQL MS Access、MySQL 和 SQL Server 数据类型 45. SQL 函数 46. SQL AVG() 函数 47. SQL COUNT() 函数 48. SQL FIRST() 函数 49. SQL LAST() 函数 50. SQL MAX() 函数 51. SQL MIN() 函数 52. SQL SUM() 函数 53. SQL GROUP BY 语句 54. SQL HAVING 子句 55. SQL UCASE() 函数 56. SQL LCASE() 函数 57. SQL MID() 函数 58. SQL LEN() 函数 59. SQL ROUND() 函数 60. SQL NOW() 函数 61. SQL FORMAT() 函数 62. SQL 快速参考 63. SQL 主机 64. SQL 总结

SQL HAVING 子句

SQL HAVING 子句


HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

SQL HAVING 语法

SQL HAVING 语法

SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value;


演示数据库

在本教程中,我们将使用 样本数据库。

下面是选自 "Websites" 表的数据:


+----+--------------+---------------------------+-------+---------+

| id | name         | url                       | alexa | country |

+----+--------------+---------------------------+-------+---------+

| 1  | Google       | https://www.google.cm/    | 1     | USA     |

| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |

| 3  |       | http://www.55mianshi.com/    | 4689  | CN      |

| 4  | 微博          | http://weibo.com/         | 20    | CN      |

| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |

| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |

+----+---------------+---------------------------+-------+---------+

下面是 "access_log" 网站访问记录表的数据:


mysql> SELECT * FROM access_log;

+-----+---------+-------+------------+

| aid | site_id | count | date       |

+-----+---------+-------+------------+

|   1 |       1 |    45 | 2016-05-10 |

|   2 |       3 |   100 | 2016-05-13 |

|   3 |       1 |   230 | 2016-05-14 |

|   4 |       2 |    10 | 2016-05-14 |

|   5 |       5 |   205 | 2016-05-14 |

|   6 |       4 |    13 | 2016-05-15 |

|   7 |       3 |   220 | 2016-05-15 |

|   8 |       5 |   545 | 2016-05-16 |

|   9 |       3 |   201 | 2016-05-17 |

+-----+---------+-------+------------+

9 rows in set (0.00 sec)



SQL HAVING 实例

现在我们想要查找总访问量大于 200 的网站。

我们使用下面的 SQL 语句:

实例

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log INNER JOIN Websites ON access_log.site_id=Websites.id) GROUP BY Websites.name HAVING SUM(access_log.count) > 200;

执行以上 SQL 输出结果如下:

现在我们想要查找总访问量大于 200 的网站,并且 alexa 排名小于 200。

我们在 SQL 语句中增加一个普通的 WHERE 子句:

实例

SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id WHERE Websites.alexa < 200 GROUP BY Websites.name HAVING SUM(access_log.count) > 200;

执行以上 SQL 输出结果如下: