文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL子查询

2021-02-10 18:01

关注

MySQL子查询

子查询是指一个查询语句嵌套在另一个查询语句的内部的查询

eg:要查询员工工资比‘Abel’高的员工名字
SELECT name,salary     #外查询(主查询)
FROM employees
WHERE salary > (#查询"Abel"的工资
                SELECT salary       #内查询(子查询)
                FROM employees
                WHERE name = "Abel"
                );

子查询的分类

角度一 (内查询返回结果的条目):

角度二 (内查询是否执行多次):

eg:查询工资大于本部门的员工:相关

​ 查询工资大于公司平均工资的员工:不相关

单行子查询

单行比较操作符

=、<、<=、>、>=、<>

HARING中的子查询

eg:要查询最低工资大于50号部门最低工资的部门id
SELECT department_id 
FROM employees
GROUP BY department_id
HARING min(salary) > (
                     SELECT min(salary)       
                     FROM employees
                     WHERE deppartment_id = 50
                    );

CASE中的子查询

eg:查询员工的id,其部门id与地址id是1800的员工相同的是"China",不同的是"usa"
SELECT employees_id,(CASE department_id WHEN (SELECT department_id
                                              FROM departments
                                              WHERE location_id = 1800) RHEN "china"  
                                        else "usa" END ) "location"(别名)

FROM employees;


子查询的空值问题

内查询结果是空或是没有,不会报错,但是不会显示结果

非法使用子查询

单行的操作符对应多行的子查询等情况

多行子查询

多行比较操作符

SELECT name,salary     
FROM employees
WHERE salary IN (#各部门的最低工资
                SELECT MIN(salary)       
                FROM employees
                GROUP BY department_id
                );
eg:返回其他job_id中比job_id为"IT"部门的 *任一* 工资低的员工的员工id
SELECT id
FROM employees
WHERE job_id <> "IT"
and salary < ANY (SELECT salary
                  FROM employees
                  WHERE job_id ="IT"
                 );

eg:返回其他job_id中比job_id为"IT"部门的 *所有* 工资低的员工的员工id
SELECT id
FROM employees
WHERE job_id <> "IT"
and salary < ALL (SELECT salary
                  FROM employees
                  WHERE job_id ="IT"
                 );
查平均工资最低的部门id
方式一:在FROM中使用子查询
SELECT department_id
FROM employees
GROUP BY department_id
HARING AVG(salary) = (SELECT MIN(avg_sal)
                      FROM(SELECT AVG(salary) avg_sal #把查出的各部门的平均工资当成一个新表来使用 
                           FROM employees
                           GROUP BY department_id
                          ) "t_dept_avg_sal"
);

方式二:使用ALL
SELECT department_id
FROM employees
GROUP BY department_id
HARING AVG(salary) <= ALL (SELECT AVG(salary) 
        FROM employees
                           GROUP BY department_id
                          );

空值问题

内查询结果有null时,外查询不会出结果

相关子查询

相关子查询的执行过程

子查询的执行条件依赖于外部查询,每执行一次外查询,内查询都要重新计算一遍

eg:查员工工资>本部门的平均工资的id
# 每遍历一行数据都要进行匹配
SELECT id
FROM employees t1
WHERE salary > (SELECT AVG(salary)#此时内查询的结果就是传入数据的员工的部门的平均工资
                FROM employees t2
                WHERE t2.department_id = t1.department_id              
               );          

在 SELECT 中,除了GROUP BY 和LIMIT 中不能写子查询外,其他位置都可以使用

EXISTS和 NOT EXISTS关键字

用来检查在子查询中是否存在满足条件的行

类似于C语言中的break

EXISTS

​ 条件返回FALSS

​ 继续在子查询中寻找

​ 不在子查询中继续寻找

​ 条件返回TRUE

查询公司管理者的ID
方式1:自连接
SELECT DISTINCT t2.employee_id   #去重
FROM employees t1 JOIN employees t2
ON t1.manger_id = t2.employee_id;

方式2:子查询
SELECT employee_id
FROM employees 
WHERE employee_id IN (SELECT DISTINCT manger_id
                       FROM employees                                          );

方式3:使用EXISTS
SELECT t1.employee_id
FROM employees t1
WHERE EXISTS  (SELECT *
               FROM employees t2
               WHERE t1.employee_id = t2.manger_id
              );

NOT EXISTS

查询部门表中不存在于员工表的部门ID
方式一:外连接
SELECT t2.department_id
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_name = t2.department_name
WHERE t1.department is null;

方式二:
SELECT department_id
FROM departments t1
WHERE NOT EXISTS(SELECT *
                 FROM employees t2
                 WHERE t1.department_name = t2.department_name
               );

相关更新

相关删除

原文地址:https://www.cnblogs.com/wht-de-bk/archive/2022/03/06/15972985.html

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯