数据璐SQL零基础入门教程学习第七天主知识点六:子查询

主知识点六:子查询

【知识点引入】

到这里我们已经把sql的主要子句学完啦,接下来就是sql语法的进阶学习

首先是造就了sql语句千变万化的子查询

子查询本身就是一个完整的查询语句,然后用括号()包裹嵌套在主查询语句中,子查询可以多层嵌套

之前所涉及到的都是从数据库中检索数据的单条语句,但当我们想要检索的数据并不能直接从数据库表中获取,而是需要从筛选后的表格中再度去查询时,就要用到子查询,相当于我们无法直达时,需要进行换乘

子查询的执行优先于主查询执行,因为主查询的条件用到了子查询的结果

子查询主要分为三类

  • 标量子查询
    • 查询结果只有一行一列
  • 行子查询
    • 查询结果只有一行
  • 列子查询
    • 查询结果只有一列
  • 表子查询
    • 查询结果有多行多列

【例题讲解】

【where基于子查询条件筛选】

  • 点击链接SELECT within SELECT Tutorial - SQLZOO第六题
    • 【题目】
      • 查询出gdp高于欧洲每个国家的所有国家名称,有一些国家gdp值可能为NULL,请排除这些国家
    • 将题目翻译成人话就是查询国家名称,这些国家的gdp大于欧洲国家中最大的gdp,其中国家的gdp不为空值
    • 由于欧洲国家中最大的gdp未知,我们先需要写子查询语句
      • select max(gdp)
      • from world
      • where continent='europe'
      • and gdp is not null
    • 这样我们就得到欧洲国家中最大的GDP了
    • 接着我们查询gdp大于这个值的国家名
    • 写出代码where gdp>子查询
    • 将代码进行组合
    • 【运行代码】
      • select name
      • from world
      • where gdp>(
        • select max(gdp)
        • from world
        • where continent='europe'
        • and gdp is not null
        • )
    • 【运行结果】
    • 这题代码中的子查询结果是单行单列的标量子查询
    • 等同于where gdp > 3425956000000
    • 只是欧洲国家中最大的GDP数值我们并不知道,因此需要先构建子查询作为中转,具体的数值3425956000000就由子查询来代替了
  • 点击链接SELECT within SELECT Tutorial - SQLZOO第三题
    • 【题目】
      • 查询跟阿尔及尼亚(Argentina)和澳大利亚(Australia)在同一大洲的所有国家名称, 并按照国家名称进行排序展示
    • 由于阿尔及尼亚(Argentina)和澳大利亚(Australia)所属大洲未知,所以我们先写子查询得到这两个国家所属的大洲
      • 【运行代码】
        • select continent
        • from world
        • where name='Argentina'
        • or name='Australia'
      • 【运行结果】
    • 接下来查询属于这两个大洲的国家名称,并按照名字排序,这里没有指定排序降序还是升序,所以使用默认的升序
    • 由于子查询是列子查询,有多个值,所以条件筛选中使用in操作符
      • 【运行代码】
        • select name,continent
        • from world
        • where continent in (
          • select continent
          • from world
          • where name='Argentina'
          • or name='Australia'
          • )
        • order by name
      • 【运行结果】

【总结】

  • 子查询本身是一个完整的查询,由括号包裹嵌套在主查询中
  • 子查询最后返回查询出的结果给主查询
  • 子查询可以在select,from,where,having子句中使用,但要注意不同子句能接受的子查询种类有差别
  • 子查询可以多重嵌套

【练习题】

  • 【1】SELECT within SELECT Tutorial - SQLZOO第一题
    • 【题目】
      • 查询 人口(population)比俄罗斯Russia更多的国家名(name)
    • 【正确答案】
      • select
      • name
      • from world
      • where population > (
        • select population
        • from world
        • where name = 'Russia'
        • )
  • 【2】SELECT within SELECT Tutorial - SQLZOO第七题
    • 【题目】
      • 查找每个大陆(continent)中最大的国家(按区域area),显示该大陆(continent),名称(name)和区域(area)
    • 【正确答案】
      • select
      • continent
      • ,name
      • ,area
      • from world
      • where (continent,area) in (
        • select
        • continent
        • ,max(area)
        • from world
        • group by continent
        • )
  • 【3】SELECT within SELECT Tutorial - SQLZOO第二题
    • 【题目】
      • 查询在欧洲Europe中人均gdp大于 英国 'United Kingdom' 的国家名
    • 【正确答案】
      • select
      • name
      • from world
      • where continent = 'Europe'
      • and gdp / population > (
        • select
        • gdp / population
        • from world
        • where name = 'United Kingdom'
        • )
  • 【4】SELECT within SELECT Tutorial - SQLZOO第四题
    • 【题目】
      • 查询国家的人口数(population)超过加拿大(Canada)但少于波兰(Poland)的国家的名称(name)和人口数(population)
    • 【正确答案】
      • select
      • name
      • , population
      • from world
      • where population > (
        • select
        • population
        • from world
        • where name = 'Canada'
        • )
      • and population < (
        • select
        • population
        • from world
        • where name = 'Poland'
        • )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值