MySQL教程 MySQL教程MySQL 连接MySQL 查看数据库MySQL 创建数据库MySQL 修改数据库MySQL 删除数据库MySQL 选择数据库MySQL 数据类型MySQL存储引擎MySQL 数据表的增删改查MySQL 表数据增删改查操作MySQL 条件子句MySQL 清空表记录MySQL 模糊查询MySQL 处理重复数据MySQL 别名MySQL 限制查询结果数量Mysql 查询结果排序MySQL 范围查询MySQL 空值查询MySQL 查询结果合拼MySQL 分组MySQL 筛选分组MySQL 表连接MySQL NULL值处理MySQL 子查询MySQL 正则表达式MySQL 视图MySQL 索引MySQL安装 MySQL Windows版下载教程MySQL windows系统安装教程MySQL windows系统简单的安装教程MySQL Linux系统安装教程MySQL Linux系统下载教程MySQL Linux系统简单的安装教程配置MySQL环境变量

MySQL 筛选分组

在 MySQL 数据库中,HAVINGWHERE是两个用于筛选数据的关键字,它们在查询语句中的作用有所不同。本文将详细介绍HAVING和WHERE的语法、功能以及它们之间的区别,并通过具体的示例进行说明。HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。

WHERE 和 HAVING 关键字也存在以下几点差异:

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子句用于在查询数据之前对原始数据进行筛选。它根据指定的条件表达式来选择满足条件的行。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 |
+----+-----------+------+-------+

查询分数大于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”未知”。

查询分数分组后的平均值大于60的

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 会提示错误信息:无效使用组函数。