在 MySQL 数据库中,HAVING和WHERE是两个用于筛选数据的关键字,它们在查询语句中的作用有所不同。本文将详细介绍HAVING和WHERE的语法、功能以及它们之间的区别,并通过具体的示例进行说明。HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。
HAVING子句用于在GROUP BY子句之后对聚合结果进行筛选。它通常与聚合函数(如COUNT()、SUM()、AVG()等)一起使用,以过滤满足特定条件的分组。HAVING子句的语法如下:
SELECT column1, column2, aggregate_function(column3) FROM table_name GROUP BY column1, column2 HAVING condition;
在上述语法中,column1、column2和column3是要选择的列名,table_name是要查询的表名,aggregate_function是聚合函数,condition是用于筛选分组的条件表达式。
WHERE子句用于在查询数据之前对原始数据进行筛选。它根据指定的条件表达式来选择满足条件的行。WHERE子句的语法如下:
SELECT column1, column2 FROM table_name WHERE condition;
在上述语法中,column1和column2是要选择的列名,table_name是要查询的表名,condition是用于筛选行的条件表达式。
这是详细信息得内容。
-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `sex` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL, `score` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', '张三名', '男', '80'); INSERT INTO `student` VALUES ('2', '李四浩', '男', '90'); INSERT INTO `student` VALUES ('3', '王五期', '女', '70'); INSERT INTO `student` VALUES ('4', '赵六三', '男', '90'); INSERT INTO `student` VALUES ('5', '三七熊', '女', '60');
原始数据
mysql> SELECT * from student; +----+-----------+------+-------+ | id | name | sex | score | +----+-----------+------+-------+ | 1 | 张三名 | 男 | 80 | | 2 | 李四浩 | 男 | 90 | | 3 | 王五期 | 女 | 70 | | 4 | 赵六三 | 男 | 90 | | 5 | 三七熊 | 女 | 60 | +----+-----------+------+-------+
mysql> SELECT name,sex,score FROM student HAVING score>60; +-----------+------+-------+ | name | sex | score | +-----------+------+-------+ | 张三名 | 男 | 80 | | 李四浩 | 男 | 90 | | 王五期 | 女 | 70 | | 赵六三 | 男 | 90 | +-----------+------+-------+
mysql> SELECT name,sex,score FROM student where score>60; +-----------+------+-------+ | name | sex | score | +-----------+------+-------+ | 张三名 | 男 | 80 | | 李四浩 | 男 | 90 | | 王五期 | 女 | 70 | | 赵六三 | 男 | 90 | +-----------+------+-------+
上述实例中,因为在 SELECT 关键字后已经查询出了 height 字段,所以 HAVING 和 WHERE 都可以使用。但是如果 SELECT 关键字后没有查询出 height 字段,HAVING就会报错。
mysql> SELECT name,sex FROM student HAVING score>60; ERROR 1054 (42S22): Unknown column 'score' in 'having clause'
mysql> SELECT name,sex FROM student where score>60; +-----------+------+ | name | sex | +-----------+------+ | 张三名 | 男 | | 李四浩 | 男 | | 王五期 | 女 | | 赵六三 | 男 | +-----------+------+
SELECT 关键字后没有查询出 HAVING 查询条件中使用的 height 字段,MySQL 会提示错误信息:“having子句”中的列“score”未知”。
mysql> SELECT GROUP_CONCAT(name),sex,score FROM student GROUP BY score HAVING AVG(score)>60; +---------------------+------+-------+ | GROUP_CONCAT(name) | sex | score | +---------------------+------+-------+ | 王五期 | 女 | 70 | | 张三名 | 男 | 80 | | 李四浩,赵六三 | 男 | 90 | +---------------------+------+-------+
mysql> SELECT GROUP_CONCAT(name),sex,score FROM student where AVG(score)>60 GROUP BY score; ERROR 1111 (HY000): Invalid use of group function
如果在 WHERE 查询条件中使用聚合函数,MySQL 会提示错误信息:无效使用组函数。