子查询分类
- 按照子查询结果集的行列数的不分为4种
- 标量子查询(结果集中只有1行1列)
- 列子查询(结果集中只有1列多行)
- 行子查询(结果集中只有1行多列)
- 表子查询(结果集一般为多行多列)
- 按子查询出现在主查询中的不同位置分为4中
- select后面:仅支持标量子查询
- from后面:支持表子查询
- where/having后面:支持标量、列、行子查询
- 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)