zoukankan      html  css  js  c++  java
  • 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 );

     7、高级查询几个注意点

    -- 高级查询一般为连接查询,子查询,一般连接查询解决不了的问题就考虑用子查询
    -- avg函数,只能计算有值的平均值,null的不计算求平均
    -- 四个查询结果一致 
    SELECT * FROM tb_test_emp e, tb_test_dept d WHERE e.dept_id = d.id;
    SELECT * FROM tb_test_emp e JOIN tb_test_dept d ON e.dept_id = d.id;
    SELECT * FROM tb_test_emp e INNER JOIN tb_test_dept d ON e.dept_id = d.id;
    SELECT * FROM tb_test_emp e CROSS JOIN tb_test_dept d ON e.dept_id = d.id;
    
    -- 高级查询一般为连接查询,子查询,一般连接查询解决不了的问题就考虑用子查询
    -- avg函数,只能计算有值的平均值,null的不计算求平均
  • 相关阅读:
    剑指offer(第2版)刷题 Python版汇总
    git学习笔记
    Python中的lambda、map和filter
    算法题 22 折纸问题 (牛客网,今日头条)
    算法题 21 findNSum (好未来,LeetCode,牛客网)
    算法题 20 或与加
    Python的内存管理机制
    【算法题12 解码方法decode way】
    理解循环神经网络的来龙去脉
    机器学习资源个人汇总
  • 原文地址:https://www.cnblogs.com/shishibuwan/p/12589378.html
Copyright © 2011-2022 走看看