码迷,mamicode.com
首页 > 数据库 > 详细

mysql-Invalid use of group function-聚合函数不能直接使用在where后面-使用exists,外查询与子查询应条件关联

时间:2020-03-28 21:39:59      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:image   src   class   讲师   bsp   nbsp   标准   信息   销售   

1、创建表和插入数据

CREATE TABLE `tb_test_emp`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dept_id` int(11) NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `score` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ;

INSERT INTO `tb_test_emp` VALUES (1, 1, 张三, 50);
INSERT INTO `tb_test_emp` VALUES (2, 1, 李四, 60);
INSERT INTO `tb_test_emp` VALUES (3, 1, 王五, 70);
INSERT INTO `tb_test_emp` VALUES (4, 2, 赵六, 60);
INSERT INTO `tb_test_emp` VALUES (5, 2, 周七, 80);
INSERT INTO `tb_test_emp` VALUES (6, 3, 朱八, 100);
INSERT INTO `tb_test_emp` VALUES (7, 3, 龙九, 50);

CREATE TABLE `tb_test_dept`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
);

INSERT INTO `tb_test_dept` VALUES (1, 销售部);
INSERT INTO `tb_test_dept` VALUES (2, 人事部);
INSERT INTO `tb_test_dept` VALUES (3, 讲师部);

2、案例1:查询高于平均分数的员工信息

技术图片

 

 报错信息:Invalid use of group function即“集函数的无效用法”

聚合函数不能直接使用在where后面

正确写法:

# 利用子查询先查出来再比较

SELECT * FROM tb_test_emp WHERE score > (SELECT AVG(score) FROM tb_test_emp ); 

3、WHERE和HAVING的区别

where 子句的作用是对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

4、案例2:查询不及格员工的部门信息

SELECT *  FROM tb_test_dept WHERE id in (SELECT dept_id FROM tb_test_emp  WHERE score < 60);

5、案例3:查询所有员工都及格的部门信息-反查询(部门没有不及格的员工)

# 意思就是没有不及格的员工
SELECT *  FROM tb_test_dept WHERE id not in (SELECT DISTINCT dept_id FROM tb_test_emp  WHERE score < 60);

6、案例2和3改为exists-EXISTS 判断子查询是否返回null,如果返回null那么就匹配失败,否则匹配成功

EXISTS 判断子查询是否返回null,如果返回null那么就匹配失败,否则匹配成功

使用exists,外查询(父查询)一般会和子查询发生条件关联 

AND d.id = e.dept_id
SELECT *  FROM tb_test_dept  d WHERE  EXISTS (SELECT dept_id FROM tb_test_emp e WHERE score < 60 AND d.id = e.dept_id);


SELECT *  FROM tb_test_dept d WHERE  not EXISTS  (SELECT DISTINCT dept_id FROM tb_test_emp e WHERE score < 60 AND d.id = e.dept_id );

 

mysql-Invalid use of group function-聚合函数不能直接使用在where后面-使用exists,外查询与子查询应条件关联

标签:image   src   class   讲师   bsp   nbsp   标准   信息   销售   

原文地址:https://www.cnblogs.com/shishibuwan/p/12589378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!