您的位置:首页 > 数据库

SQLzoo刷题-嵌套子查询、相关子查询

2020-08-02 19:06 84 查看

1、嵌套子查询

子查询就是将问题分为两步,先筛选出中间量,再进行查询

  • 人口超过“俄罗斯”的每个国家的名称。(先求出俄罗斯的人口,再筛选大于俄人口)
  • 人均国内生产总值大于“英国”的国家。(先求出英国的GDP,再筛选大于其GDP)
  • 包含阿根廷的洲的国家。(先筛选出阿根廷所在的州,再筛选州中的国家)
/*筛选GDP大于欧洲所有国家的国家,思路一:GDP>all(欧洲国家的GDP)*/
SELECT name FROM world
WHERE GDP > ALL(
SELECT GDP FROM world
WHERE GDP > 0 /*有些国家的GDP可能是NULL*/
and continent='Europe')

注:>ALL 父查询中的结果集大于子查询中每一个结果集中的值

/*筛选GDP大于欧洲所有国家的国家,思路二:GDP>max(欧洲国家GDP)*/
SELECT name FROM world
WHERE GDP>(
select max(GDP) from world
WHERE GDP > 0
and continent='Europe' );
/*求出薪水最低的员工的信息,需要先求出最低的薪水*/
SELECT last_name, job_id, salary FROM   employees
WHERE  salary =
(SELECT MIN(salary) FROM   employees);

2、相关子查询

相关子查询是一个子查询中引用了某张表,且这张表也在子查询外部被使用到。即需要将一张表看为两张

  • 执行顺序
    ①外部查询拿到所有行;
    ②内部查询使用外部查询出来的每一行来执行自己逻辑;
    ③内部查询有结果返回则当前外部行被保留最终返回否则继续执行下一行
  • 返回员工薪水大于经理薪水的员工(一个表是员工的薪水,一个表是经理的薪水)
  • 语文成绩大于数学成绩的学生姓名(一个表取语文成绩,一个表取数学成绩)
/*找出各大洲面积最大的国家*/
SELECT x.continent, x.name, x.area FROM world x
WHERE area >= ALL
(SELECT area FROM world y
WHERE y.continent=x.continent
AND area>0)
/*找出所有国家人口不超过25000000的州,即所有国家人口都小于25000000的州*/
SELECT x.name,x.continent,x.population FROM world AS x
WHERE 25000000>=ALL (
SELECT population FROM world y
WHERE x.continent=y.continent
AND population>0)
/*牛客网查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不使用order by*/
select e.emp_no,s.salary,e.last_name,e.first_name
from employees e join salaries s
on e.emp_no=s.emp_no
and  s.to_date='9999-01-01'
and s.salary =
(
select s1.salary
from salaries s1 join salaries s2
on s1.salary<=s2.salary
and s1.to_date='9999-01-01'
and s2.to_date='9999-01-01'
group by s1.salary
having count(distinct s2.salary)=2
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: