sqlzoo刷题——SELECT within SELECT Tutorial/zh(子查询)

2023-11-28 21:10

本文主要是介绍sqlzoo刷题——SELECT within SELECT Tutorial/zh(子查询),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本文章记录sqlzoo刷题过程以及解题思路,每个小节不仅包含练习,还有选择题(quiz)部分的实现思路
网址:sqlzoo_SELECT within SELECT Tutorial/zh

一、代码练习部分

  1. 列出每個國家的名字 name,當中人口 population 是高於俄羅斯’Russia’的人口。

查询结果列——国家名,人口
条件——人口>俄罗斯人口(子查询)
查询逻辑——先用子查询查出俄罗斯的人口,再查询全表人口>俄罗斯人口的行,选择国家名,人口显示

select name,population 
from world
where population >(select populatonfrom worldwhere name='Russia')
  1. 列出歐州每國家的人均GDP,當中人均GDP要高於英國’United Kingdom’的數值。

查询结果列——国家名,gdp_人均(gdp/population)
条件——
1、洲际:欧洲
2、gdp_人均>英国gdp_人均(子查询)
3、两个条件同时满足,缺一不可
查询逻辑——先用子查询得到英国人均gdp,再查询欧洲国家且人均gdp大于英国数值的gdp的行,选择国家名和人均gdp显示

select name,gdp/population as gdp_pop_avg
from world
where continent='Europe' and gdp/population>(select gdp/populationfrom worldwhere name='United Kingdom')
  1. 在阿根廷Argentina 及 澳大利亞 Australia所在的洲份中,列出當中的國家名字 name 及洲分 continent 。按國字名字順序排序

查询结果列——国家名,洲份
条件——
1、洲份:阿根廷所在的洲,澳大利亚所在洲,两个群体(子查询得出洲)
2、排序:按国家名,默认即可
查询逻辑——先用子查询查出满足条件的洲,选择包含这两个洲的行(in关键字),显示国家名和洲份列,排序

select name,continent
from world
where continent in (select continent from world where name='Argentina 'or name='Australia ')
order by name
  1. 哪一個國家的人口比加拿大Canada的多,但比波蘭Poland的少?列出國家名字name和人口population 。

查询结果列——国家名,人口
条件——人口>加拿大人口 and 人口<波兰人口

两种方法实现:1)between关键字,但要剔除首尾值;2)当成2个主体看。3)不可以使用连等号表示区间,如1<x<100

查询逻辑——
方法1:先用子查询查出加拿大人口和波兰人口,选择人口数在这个区间的行,显示国家名和人口。

select name,population 
from world
where population between (select population from world where name='Canada') and (select population from world where name='Poland')
and name not in ('Canada','Poland')

方法2:分两个部分查询群体,再拼接起来。先查询人口>加拿大人口的行,再查询人口<加拿大人口的行,用and连接,显示国家名和人口

方法2select name,population 
from world 
where population>(select population from world where name='Canada') and population<(select population from world where name='Poland') 
  1. 顯示歐洲的國家名稱name和每個國家的人口population。以德國的人口的百分比作人口顯示。

查询结果列——国家名,人口(%)
条件——
1、洲际=欧洲
2、人口:转化为占德国的百分之几(子查询得出德国人口再计算)

1)数值转化成百分比:concat(小数,‘%’),注意小数要比原来大100倍再与%连接,才是正确的百分数
2)利用round(数值,保留的小数位数)四舍五入

查询逻辑——查询包含欧洲的所有行,显示国家名,人口/(查询出的德国人口数)转化成百分数

select name,concat(round((population/(select population from world where name='Germany'))*100,0),'%')as population##这里使用concat连接百分号之后小数点后突然有很多 0,不知道为什么
from world
where continent='Europe'
  1. 哪些國家的GDP比Europe歐洲的全部國家都要高呢? [只需列出 name 。] (有些國家的記錄中,GDP是NULL,沒有填入資料的。)

查询结果列——国家名
条件——
gdp高于欧洲国家,需要满足2个方面。1)gdp>=全部欧洲国家gdp,2)gdp>0(这是个很重要的条件,与null值比较会报错)
查询逻辑——查询gdp高于欧洲国家的行(子查询),显示国家名列

select name
from world
where continent='Europe'and gdp>=all(select gdpfrom worldwhere continent='Europe' and gdp>0)
  1. 在每一個州中找出最大面積的國家,列出洲份 continent, 國家名字 name 及面積 area。 (有些國家的記錄中,AREA是NULL,沒有填入資料的。)

查询结果列——洲份,国家名,面积
条件——每个洲中,面积最大

旧表area VS all (新表中新洲=旧洲的所有area)
一个面积和这个洲所有的国家面积相比较,自己是不是最大的哪个,是则选择。需要将这个洲的所有国家的面积数据抽取出来(从新表中选取数据)

查询逻辑——先选择新表中两个表中相同continent的area列,旧表area>全部area的行,且面积>0,显示洲份,国家名,面积

select continent,name,area
from world x ##基础表
where area >=all(select area from world y where y.continent=x.continent and area>0)
  1. 列出洲份名稱,和每個洲份中國家名字按字母順序是排首位的國家名。(即每洲只有列一國)

查询结果列——洲份,国家
条件——每个洲只选择一行,字母是首位的国家。

字符串也可以比大小,依据是字母顺序,A~Z对应的是从小到大,所以选择名字是这个洲全部国家中最小的

查询逻辑——选择基础表的国家名,与辅助表中同一洲的国家相比较最小的行,显示洲份,国家

select continent,name
from world x
where name<=all(select name from world y where y.continent=x.continent)
order by continent
  1. 找出洲份,當中全部國家都有少於或等於 25000000 人口. 在這些洲份中,列出國家名字name,continent 洲份和population人口。

查询结果列——国家名,洲份,人口
条件——全部国家人口<=2500万人口的洲。即任一人口>2500万国家坐在的洲被排除
查询逻辑——查询出人口>2500万的所在的行,选择洲列,不包含这些洲的洲就是要查找的,显示这些洲的国家,洲份和人口

select name,continent,population 
from world 
where continent not in (select continent from world where population>25000000)
  1. 有些國家的人口是同洲份的所有其他國的3倍或以上。列出 國家名字name 和 洲份 continent。

查询结果列——国家名,洲份
条件——人口/3仍然是同洲所有国家人口中最大的
查询逻辑——选择基础表人口/3>辅助表相同洲下的所有行人口总数最高的行,同时人口>0,且剔除自己(新表中是原数值,基础表的人口是原来的1/3),显示国家名,洲份

select name,continent
from world x
where population/3 >=all(select population from world y where y.continent=x.continent and population>0 and y.name!=x.name)

二、测试部分(选择题)

在这里插入图片描述

  1. 選擇代碼以顯示在每個區域人口最小的國家的國家名稱,區域和人口。

查询结果列——国家名,区域,人口
条件——人口<=该区域内全部国家的人口*(辅助表,子查询,all关键字)*
查询逻辑——先查询每个区域内包含的人口行(辅助表),当辅助表region=基础表region时,基础表population VS 辅助表population,选择其中最小且>0的列,显示国家名,区域,人口

select name,region,population
from bbc a
where population<=(select population from bbc b where b.region=a.region and population>0)
  1. 選擇代碼以顯示國家名稱,該國所在的地區每國人口都超過50000。

查询结果列——国家名
条件——地区:所有行的人口>5万=剔除人口>5万地区=5万>该地区最大的人口数。
查询逻辑——
思路1:子查询+逆向思维。选择所有洲,剔除查询人口>5万包含的洲,显示国家名
思路2:子查询+all关键字。查询5万>该地区最大的人口数的行,显示名称

思路1select name
from bbc
where region not in (select region from bbc where population >50000)
思路2select name
from bbc a
where 50000>all(select population from bbc b where b.region=a.region and b.population>0)
  1. 選擇代碼以顯示國家名稱,該國家人口少於它周圍的全部國家的人口三分之一。

查询结果列——国家名
条件——人口<all(同区域国家人口/3)=某国人口3<all(同区域国家人口)。选择后者sql执行会更快
查询逻辑——查询出人口
3之后<同区域人口最低数的行,显示国家名。

写法1select name
from bbc a
where population*3<all(select population from bbc b where b.region=a.region and population>0 and b.name!=a.name)
写法2select name
from bbc a
where population<all(select population/3 from bbc b where b.region=a.region and population>0 and b.name!=a.name)
  1. 選擇你會從這個代碼獲得的結果。
SELECT name FROM bbcWHERE population >(SELECT populationFROM bbcWHERE name='United Kingdom')AND region IN(SELECT regionFROM bbcWHERE name = 'United Kingdom')

查询结果列——国家名
条件——
1、人口:>英国人口
2、地区:与英国所在同地区
查询逻辑——将英国的人口和英国的地区作为两个群体分别查询,再用and连接,同时满足两个条件的行被选中,显示国家名列

  1. 選擇代碼以顯示國家名稱,該國有比非洲任何國家更大的國內生產總值GDP。

查询结果列——国家名称
条件——gdp>all(非洲国家gdp)
查询逻辑——子查询+all关键字查询gdp>全部非洲国家gdp的行,选择国家名列显示。注意gdp不一定都是正的,也会有负的gdp,所以写查询的时候条件应该使用 is not null

#我的写法:
select name
from bbc
where gdp>all(select gdp from bbc where region='Africa' and gdp is not null)
#选项写法:使用了子查询+all+max函数
select name
from bbc
where gdp>all(select max(gdp) from bbc where region='Africa' and gdp is not null)
#这样应该是让查询更快。每一行只需要和一个数值比较就可以得出结果。
  1. 選擇代碼以顯示國家名稱,該國人口比俄羅斯少,但比丹麥的多。

查询结果列——国家名称
条件——人口:俄人口<人口<丹人口(between…and…)=俄人口<人口&人口<丹人口(and)
查询逻辑——俄罗斯和丹麦的人口先用子查询分别查出来,再使用between或者and连接起来。需要注意如果使用between会包括区间的首尾值,要剔除,所以这种数值区间的问题更推荐and连接的方式。

select population
from bbc
where population<(select population from bbc where name='Russia')and population<(select population from bbc where name='Denmark')
  1. 選擇你會從這個代碼獲得的結果。
SELECT name FROM bbcWHERE population > ALL(SELECT MAX(population)FROM bbcWHERE region = 'Europe')AND region = 'South Asia'

查询结果列——国家名
条件——
1、人口大于欧洲最大人口
2、南美洲国家
查询逻辑——查询南美洲国家中人口大于欧洲最大国家人口的国家名称

这篇关于sqlzoo刷题——SELECT within SELECT Tutorial/zh(子查询)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430264

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.