Mysql子查询

子查询分类

  • 按照子查询结果集的行列数的不分为4种
  1. 标量子查询(结果集中只有1行1列)
  2. 列子查询(结果集中只有1列多行)
  3. 行子查询(结果集中只有1行多列)
  4. 表子查询(结果集一般为多行多列)
  • 按子查询出现在主查询中的不同位置分为4中
  1. select后面:仅支持标量子查询
  2. from后面:支持表子查询
  3. where/having后面:支持标量、列、行子查询
  4. exists后面(相关子查询):支持表子查询

exists子查询

先执行主查询,然后将主查询的结果根据子查询进行过滤,子查询中涉及到主查询中用到的字段,所以叫相关子查询

关联子查询

例1:查找每个洲人口最多的国家

SELECT continent, name, population FROM world x
  WHERE population >= ALL
    (SELECT population FROM world y
        WHERE y.continent=x.continent
          AND population>0)

类似嵌套循环:先执行外层查询,对于外层每一行的population,内层查询的所有continent=外层该行的continent的大于0的population被选出来,外层该行的population>all成立则保留(有很多多余的比较)

例2:查找境内所有国家人口数都<=25000000的洲,要求列出国家名字,洲名,人数
思路:
该取出表中的哪些行?–>所有国家人数都小于25000000的洲
对每一行,判断其所在的洲的所有国家的人口是否都小于25000000,若是则保留

select name, continent, population from world x where 
25000000>= all (select population from world y where x.continent = y.continent)

例3:某些洲存在一个国家的人口比该洲境内其他所有国家的人口还要多三倍的国家,查出国家名,洲名
思路:
该取出表中的哪些行?–>人口数目/3比所在州的所有其他国家的人口都大
对每一行,比较该国的人口/3是否大于所在洲内除自己以外的所有国家人口

select name, continent from world x where population/3 > all
(select population from world y where x.continent= y.continent and x.name <> y.name)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值