1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。
集合比较子查询
内查询返回多行数据
我们这个时候使用=这个符号就不会合适了,多行子查询用到的符号应该是
ANY是和其中任一个值比较,ALL是和所有值比较
比如现在有女生是家务做的很好,美丽的,贤惠的,暴力了,ANY就是选其中一个就行,ALL就是全部都要
SOME实际是ANY的别名,和ANY的作用一致
多行子查询的操作符:IN,ANY,ALL,SOME(ANY)
我们这里用等于是不行的,所以改为IN
这里的需求就是查询首字母大于a的姓名和工作.当然我们前面的等号都可以替换为IN,因为后面是括号嘛
题目1返回job_id中比job_id为IT_PROG部门任一工资低的员工的员工号,姓名,job_id,salary
1
2
3
4
5
6
7
|
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的情况
题目2””返回job_id中比job_id为IT_PROG部门所有工资低的员工的员工号,姓名,job_id,salary
这里我们就用到ALL函数
1
2
3
4
5
6
7
|
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
这个看起来简单,实际有点难度,我们先把条件先把这个条件都分成很多步,我们先一步一步做,然后最后豁然开朗
我们先查各个部门的平均工资
1
2
3
|
SELECT AVG (salary) FROM employees GROUP BY department_id |
我们比每一个都小是不是可以直接用MIN,这是不可以的,因为聚合函数是不能嵌套的,mysql是不支持聚合函数嵌套的,不过Oracle是支持的,所以之后版本可能会支持.但是到9.0为止是还不支持的.
我们想想能不能用ANY和ALL解决,我们这个部门的工资现在是不是要比每一个部门的工资都要小,但是和最后一个是相等的,那么我们就可以用<=里面的每一个值.:这是方法1:
1
2
3
4
5
|
SELECT department_id FROM employees WHERE salary<= ALL ( SELECT AVG (salary) FROM employees GROUP BY department_id ) |
这样写是错误的,因为我们要求的是平均工资小于,不能用WHERE,要用GROUP BY和HAVING组合起来使用,这个写法才是正确的,这个方法比较的简便.
1
2
3
4
5
6
|
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函数,我们试一试
1
2
3
4
|
SELECT avg_salary FROM ( SELECT AVG (salary) FROM employees GROUP BY department_id ) |
结果报错了,他所,我们需要给这个表一个别名,顺便给字段也来一个别名不然容易()出错
查出来之后我们就可以用MIN嵌套
所以这里我们也用了一个子查询,还是比较有意思的,接下来我们要查那个部门的工资等于这个值
这里我们就用到了三层的子查询.前面的方法比较简便一些.这个方法比较容易理解.
空值问题
我们想查询是管理者的员工.也就是员工id等于部门id的员工有那几个
1
2
3
4
|
SELECT last_name FROM employees WHERE employee_id IN ( SELECT manager_id FROM employees) |
现在一共查出来18条,那么我们还有一个疑惑,可不可以查出来剩下不是管理者的员工呢,我们把IN改成NOT IN
1
2
3
4
|
SELECT last_name FROM employees WHERE employee_id NOT IN ( SELECT manager_id FROM employees) |
发现结果是空表,不是我们期望的结果,这里不能简单的加个NOT,这是为什么呢,因为我们的结果里包含了NULL
1
2
3
4
5
|
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多行子查询(只包含不相关子查询)的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。