mysql多行子查询实战案例(只包含不相关子查询)

 更新时间:2024年10月31日 09:22:17   作者:晴天qt01  
在MySQL中多行子查询(也称为 IN 子查询)是指子查询返回多行数据,并且这些数据用于主查询中的某个条件判断,这篇文章主要介绍了mysql多行子查询(只包含不相关子查询)的相关资料,需要的朋友可以参考下

多行子查询

集合比较子查询

内查询返回多行数据

我们这个时候使用=这个符号就不会合适了,多行子查询用到的符号应该是

多行比较操作符

ANY是和其中任一个值比较,ALL是和所有值比较

比如现在有女生是家务做的很好,美丽的,贤惠的,暴力了,ANY就是选其中一个就行,ALL就是全部都要

SOME实际是ANY的别名,和ANY的作用一致

多行子查询的操作符:IN,ANY,ALL,SOME(ANY)

操作符:IN

我们这里用等于是不行的,所以改为IN

这里的需求就是查询首字母大于a的姓名和工作.当然我们前面的等号都可以替换为IN,因为后面是括号嘛

操作符:ANY

题目1返回job_id中比job_id为IT_PROG部门任一工资低的员工的员工号,姓名,job_id,salary

WHERE job_id IN (SELECT job_id FROM employees WHERE last_name>'a')
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(SELECT salary
                  FROM employees
                  WHERE job_id='IT_PROG')
AND job_id<>'IT_PROG'

结果里有8000也有4000,因为只要比其中一个人低就可以了,也就是比最大值低就行

这是ANY函数的用法,我们再看看ALL的情况

操作符:ALL

题目2””返回job_id中比job_id为IT_PROG部门所有工资低的员工的员工号,姓名,job_id,salary

这里我们就用到ALL函数

WHERE job_id IN (SELECT job_id FROM employees WHERE last_name>'a')
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ALL(SELECT salary
                  FROM employees
                  WHERE job_id='IT_PROG')
AND job_id<>'IT_PROG'

这里的值就少了很多,因为用的是ALL函数,所以结果必须比全部部门是’it_prog’部门工资低,所以最后的结果是小于最小值才行,条件上ALL是比较苛刻的,

大家体会一下这两个函数的区别

一个练习

题目:查询平均工资最低的部门ID

这个看起来简单,实际有点难度,我们先把条件先把这个条件都分成很多步,我们先一步一步做,然后最后豁然开朗

我们先查各个部门的平均工资

SELECT AVG(salary)
                  FROM employees
                  GROUP BY department_id

我们比每一个都小是不是可以直接用MIN,这是不可以的,因为聚合函数是不能嵌套的,mysql是不支持聚合函数嵌套的,不过Oracle是支持的,所以之后版本可能会支持.但是到9.0为止是还不支持的.

我们想想能不能用ANY和ALL解决,我们这个部门的工资现在是不是要比每一个部门的工资都要小,但是和最后一个是相等的,那么我们就可以用<=里面的每一个值.:这是方法1:

SELECT department_id
FROM employees
WHERE salary<=ALL(SELECT AVG(salary)
                  FROM employees
                  GROUP BY department_id )

这样写是错误的,因为我们要求的是平均工资小于,不能用WHERE,要用GROUP BY和HAVING组合起来使用,这个写法才是正确的,这个方法比较的简便.

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)<=ALL(SELECT AVG(salary)
                  FROM employees
                  GROUP BY department_id )

还有方法2,我们看(SELECT AVG(salary)

                  FROM employees

                  GROUP BY department_id这个是不是代表了一个表,那么我们希望从这个表里提取出这行的最小值,自然而然的我们直接FROM这张表,并用MIN函数,我们试一试 

SELECT avg_salary          
  FROM(SELECT AVG(salary)
                  FROM employees
                  GROUP BY department_id )

结果报错了,他所,我们需要给这个表一个别名,顺便给字段也来一个别名不然容易()出错

查出来之后我们就可以用MIN嵌套

所以这里我们也用了一个子查询,还是比较有意思的,接下来我们要查那个部门的工资等于这个值

这里我们就用到了三层的子查询.前面的方法比较简便一些.这个方法比较容易理解.

空值问题

我们想查询是管理者的员工.也就是员工id等于部门id的员工有那几个

SELECT last_name
FROM employees
WHERE employee_id IN(SELECT manager_id
                      FROM employees)

现在一共查出来18条,那么我们还有一个疑惑,可不可以查出来剩下不是管理者的员工呢,我们把IN改成NOT IN

SELECT last_name
FROM employees
WHERE employee_id NOT IN(SELECT manager_id
                      FROM employees)

发现结果是空表,不是我们期望的结果,这里不能简单的加个NOT,这是为什么呢,因为我们的结果里包含了NULL

SELECT last_name
FROM employees
WHERE employee_id NOT IN(SELECT manager_id
                      FROM employees
                      WHERE manager_id IS NOT NULL)

我们添加一个结果不为空的条件,就可以得到89条记录

这是因为内查询有个NULL值,这里比较特别,IN的时候是可以出结果的,NOT IN就不能了,其实也好理解,因为空代表未知,也就是语句不知道这个值是多少,所以不包含这个值是不确定的.任何值都可能是空,所以它就返回了一个空表.而IN有准确的结果,就不会返回空表了

这块多表查询就给大家讲到这里

总结

到此这篇关于mysql多行子查询(只包含不相关子查询)的文章就介绍到这了,更多相关mysql多行子查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 查找MySQL线程中死锁的ID的方法

    查找MySQL线程中死锁的ID的方法

    这篇文章主要介绍了查找MySQL线程中死锁的ID的方法,文中介绍的方法主要是从数据字典里查找,需要的朋友可以参考下
    2015-05-05
  • MySQL中的数据备份与SQL语句

    MySQL中的数据备份与SQL语句

    这篇文章主要介绍了MySQL中的数据备份与SQL语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • centos下mysql主从同步快速设置步骤分享

    centos下mysql主从同步快速设置步骤分享

    记录一个比较简便的mysql的主从同步设置步骤,方便日后使用。
    2012-06-06
  • MySQL语句加锁的实现分析

    MySQL语句加锁的实现分析

    MySQL的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。今天我们来简单谈谈这个问题
    2017-10-10
  • 5个常用的MySQL数据库管理工具详细介绍

    5个常用的MySQL数据库管理工具详细介绍

    本篇文章是对5个常用的MySQL数据库管理工具进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 浅谈为什么MySQL不建议delete删除数据

    浅谈为什么MySQL不建议delete删除数据

    这篇文章主要介绍了浅谈为什么MySQL不建议delete删除数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • linux下mysql自动备份脚本代码

    linux下mysql自动备份脚本代码

    mysql是以mysql用户身份运行的,对/home /mybackup不可写也会失败
    2010-07-07
  • MySQL慢查询SQL优化方式

    MySQL慢查询SQL优化方式

    这篇文章主要介绍了MySQL慢查询SQL优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • MySql 索引、锁、事务知识点小结

    MySql 索引、锁、事务知识点小结

    这篇文章主要介绍了MySql 索引、锁、事务知识点,总结分析了mysql数据库中关于索引、锁和事务的概念、原理、知识点及相关注意事项,需要的朋友可以参考下
    2019-10-10
  • MySQL三大日志(binlog、redo log和undo log)图文详解

    MySQL三大日志(binlog、redo log和undo log)图文详解

    日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,下面这篇文章主要给大家介绍了关于MySQL三大日志(binlog、redo log和undo log)的相关资料,需要的朋友可以参考下
    2023-01-01

最新评论