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