数据璐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' )
数据璐(大数据分析岗位推荐师)
———————————————— 版权声明:本文为CSDN博主「数据璐(大数据分析岗位推荐师)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/shujlu0908/article/details/124296550