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的不計算求平均

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM