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

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 );

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

时间: 2024-11-07 14:26:22

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

错误代码: 1111 Invalid use of group function

1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:update t_user_info t inner join t_pro_info t0 on t.`pro` = t0.`id` inner join t_stu_info t1 on t1.`id` = t0.`co... 错误代码: 1111 Invalid use of group function 执行耗时 : 0 sec 传送时间 : 0 sec 总耗时 :

错误代码 1111 Invalid use of group function

1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:update t_user_info t inner join t_pro_info t0 on t.`pro` = t0.`id` inner join t_stu_info t1 on t1.`id` = t0.`co... 错误代码: 1111 Invalid use of group function 执行耗时 : 0 sec 传送时间 : 0 sec 总耗时 :

mysql的查询、子查询及连接查询

一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)  1.where常用运算符: 比较运算符 > ,  < ,=  , != (< >),>=   ,   <= in(v1,v2..vn) between v1 and v2    在v1至v2之间(包含v1,v2) 逻辑运算符 not ( ! )  逻辑非 or ( || )    逻辑或 and ( &&am

mysql学习笔记之连接查询与子查询

mysql连接查询与子查询 1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement), SELECT column1 FROM t2 称为Sub Query[子查询]. 所以,我们说子查询是嵌套在外查询内部.而事实上它有可能在子查询内部再嵌套子查询. 子查

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

mysql查询语句 和 多表关联查询 以及 子查询

原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式: 例:select * from t_studect where id=1; select * from t_student wh

MySQL 外连接、内连接,连接查询、多表查询、子查询、视图

MySQL连接查询.多表查询.子查询: 连接查询:事先将两张或多张表join,根据join的结果进行查询: [导入hellodb.sql数据库],输入密码即可 [[email protected] home]# mysql -uroot -p  mydb < /home/hellodb.sql     hellodb.sql数据库下载链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re [查看students表] mysql> select * from stu

MySQL多表查询和子查询

多表查询:    交叉链接:笛卡尔乘积    自然连接:两个表建立等值关系    外连接:两个表没有等值关系        左外连接:以左边的表为准,不管右边的表有没有值            ...IEFT JOIN... ON ...        右外链接:以右边的表为准,不管左边的表有没有值            ...RIGHT JOIN... ON ...    自连接:自己连接自己    子查询:所有的数据都来自于一张表    比较操作中使用子查询:子查询只能返回单个值:    I