MySQL --- 子查询 - 列子查询(多行子查询)

列子查询(多行子查询)

子查询返回的是多行单列的数据,就是一列数据。多行子查询也称为集合比较子查询

在使用多行子查询需要使用多行比较操作符:

操作符含义
IN等于列表中的任意一个,在某个集合中找到了就是成立的,IN和=ANY是一样的
ANY需要和单行比较操作符一起使用(>、<、=、<>...),与子查询结果中任何一个值比较,一个成立就成立
ALL需要和单行比较操作符一起使用(>、<、=、<>...),和子查询返回的所有值比较,所有条件同时成立才成立
SOME实际上是ANY的别名,作用与ANY相同,所以一般使用ANY

IN操作符

MySQL --- 数据库查询 - 条件查询 IN的使用

MySQL --- 多表查询 - 笛卡尔积和正确的多表查询、等值连接和不等值连接、内连接和外连接 ON一般与JOIN一起使用

MySQL --- 多表查询 - 七种JOINS实现、集合运算、多表查询练习

IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。

NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。

  • 查询出与每个部门中最低工资相同的员工信息

    • 按照部门分组,统计每个部门的最低工资

    • 根据最低工资查询出员工信息

 

报错,子查询返回最多只有一行,但是需求要实现多行,需要把等于5000的、等于800的、等于950的、等于1300的薪资输出

使用IN操作符,当工资在这个集合里面的时候,把对应的员工进行输出

-- 查询出每个员工信息
-- SELECT * FROM emp WHERE sal=();
-- 得到整个部门的最低工资之后按部门编号进行分组
SELECT MIN(sal) FROM emp GROUP BY deptno;
-- 查询出与每个部门中最低工资相同的员工信息
SELECT * FROM emp WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);

把部门编号为NULL的员工信息去掉

-- 查询出每个员工信息
-- SELECT * FROM emp WHERE sal=();
-- 得到整个部门的最低工资之后按部门编号进行分组
SELECT MIN(sal) FROM emp GROUP BY deptno;
-- 查询出与每个部门中最低工资相同的员工信息
SELECT * FROM emp WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno HAVING deptno IS NOT NULL);

查询出不与每个部门中最低工资相同的员工信息 

SELECT * FROM emp WHERE sal NOT IN(SELECT MIN(sal) FROM emp GROUP BY deptno HAVING deptno IS NOT NULL);

ANY操作符

ANY关键字是一个MySQL运算符,如果子查询条件中ANY的比较结果为TRUE,则它会返回布尔值TRUE

  • 查询工资比任何管理工资都要高的员工信息

    • 查找出每个管理的薪资

    • 每个员工的薪资与每个管理的薪资比较

-- 查询出每个员工信息
-- SELECT * FROM emp WHERE sal=();
-- 得到所有管理的工资
SELECT sal FROM emp WHERE job='MANAGER';
-- 查询工资比任何一个管理工资高的员工信息

报错,子查询最多应该要返回一行,最多使用一个值进行比较,一个值不能与多个值进行比较,不知道是与2975比较、还是与2850比较、还是与2450比较

-- 查询出每个员工信息
-- SELECT * FROM emp WHERE sal=();
SELECT sal FROM emp WHERE job='MANAGER';
-- 查询工资比任何一个管理工资高的员工信息
SELECT * FROM emp WHERE sal>=ANY(SELECT sal FROM emp WHERE job='MANAGER');

ALL操作符

ALL关键字是一个MySQL运算符,如果子查询条件中ALL的比较结果为TRUE,则它会返回布尔值TRUE

  • 案例同ANY操作符

不存在一个员工的薪资等于2975、等于2850、等于2450

-- 查询出每个员工信息
-- SELECT * FROM emp WHERE sal=();
SELECT sal FROM emp WHERE job='MANAGER';
-- 查询工资等于所有管理工资的员工信息 
SELECT * FROM emp WHERE sal=ALL(SELECT sal FROM emp WHERE job='MANAGER');

总结

IN            判断是否在集合内,在集合内返回真,不在集合内返回假

ANY         判断是否在集合内(和IN一样)

>ANY     大于集合中值最小的那一个

<ANY     小于集合中值最大的那一个

<>ANY 与集合中任意一个不等都成立

= ALL      与集合中每个值都相等才成立

> ALL     比集合中最大的那个值还大

< ALL     比集合中最小的那个值还小

<> ALL 与集合中每个值都不相等

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值