SQL数据分析之子查询的综合用法和案例题【耐心整理】

2023-05-16

文章目录

    • 零、写在前面
    • 一、子查询基础用法
    • 二、子查询综合用法(难题)

零、写在前面

本文所有代码均是在SQL ZOO平台进行,数据也该平台下的world表和一些其他平台提供的数据表,所有代码均已通过测试。
在这里插入图片描述

一、子查询基础用法

1、说明
子查询本身就是一段完整的查询语句,然后用括号英文括号(包裹嵌套在主查询语包虫,
子查询可以多层嵌套最常用的子查询运用在from和where子句中。

2、查询gdp高于欧洲每个国家的所有国家名,有一些国家gdp可能为null,需要进行排除

select name
from world
where gdp is not null 
and gdp>=(select max(gdp) from world where continent='Europe')

注意:记得子查询的select要加括号,而且返回的必须是一个值(max(gdp)),而不是一列值(gdp)
1.1.1
3、查询与澳大利亚Australia和智利Chile同一个大洲的国家和所属大洲

select continent,name
from world
where continent in (select continent from world where name in('Australia','Chile'))
order by continent,name

1.3.1
4、子查询详细解释
(1)子查询是可以自己正常独立运行的一段完整的查询语句,然后将子查询的查询结果作为主查询的一部分,因此子查询优先于主查询运行

(2)练习1是带比较运算符的子查询,要求子查询为标量子查询,即子查询结果为一行- -列(相当于-一个单元格)

(3)练习2是带in关键字的子查询,要求子查询为列子查询,即子查询结果为多行一列(单列)

(4)where子句中的子查询适用于查询条件无法一步到位, 需要先进行一步查询得到结果,基于这个查询结果再进行条件判断的情况,相当于我们无法直达时,需要进行换乘

二、子查询综合用法(难题)

1、查询2017年所有在爱丁堡的选区当选议员所在选区(constituency) 及其团队(party) ,已知爱丁堡选区编号为S14000021至S14000026,当选议员即各选区得票数最高的候选人

第一步:使用窗口函数对各个选区的候选人进行排序

select constituency,party,votes,
rank() over(PARTITION BY consitituency ORDER BY votes desc) as RV
from ge
where constituency between 'S14000021' and 'S14000026' and yr=2017
group by constituency,party,votes

第二步:将窗口函数作为from的子查询,筛选出当前选区得票数最高的候选人(议员)

select RK.constituency,RK.party
from (
select constituency,party,votes,
rank() over(PARTITION BY constituency ORDER BY votes desc) as RV
from ge
where constituency between 'S14000021' and 'S14000026' and yr=2017
group by constituency,party,votes
) as RK
where RK.RV=1

2.1.1

2、查询人口数(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'
)

2.2.1

3、查询所有国家人口均小于25000000的大洲,及其国家名(name)和人口数(population)

select continent,name,population
from world
where continent not in (
select distinct continent from world where population>25000000
)
order by continent;

重点:所有国家人口均小于,很难判断,但可以很容易把存在有国家大于该population的大洲找出来,再not in这些大洲
2.3.1

4、查询在欧洲(Europe)人均gdp大于英国(United Kingdom)的国家名

select name
from world
where continent='Europe'
and (gdp/population)>(
select (gdp/population) from world where name='United Kingdom'
)

2.4.1

5、查询每个大洲中最大的国家(判断area),显示该大洲(continent),国家名(name)和面积(area)

第一步:将每个大洲的国土面积进行排名

select continent,name,area,
rank() over(PARTITION BY continent ORDER BY area desc) as RA
from world
group by continent,name,area

第二步:把排名好的国家作为from子查询,再筛选出每个大洲排名第一的国家

select RK.continent,RK.name,RK.area
from (
select continent,name,area,
rank() over(PARTITION BY continent ORDER BY area desc) as RA from world
group by continent,name,area) as RK
where RK.RA=1
order by RK.continent;

2.5.1
6、查询法国和意大利每天新增治愈人数并从高到低排名,查询结果按国家名,截至日期(月*日),新增治愈人数,按排名排序

第一步:查询法国和意大利的国家名,截止日期,每天新增治愈人数(后一天减去前一天)

select name
,date_format(whn,'%Y年%m月%d日') 截止日期
,(recovered-lag(recovered,1) over(PARTITION BY name ORDER BY whn)) 每天新增治愈人数
from covid
where name in ('France','Italy')
group by name,whn,recovered

第二步:将第一步查询结果作为from的子查询,筛选出name,截止日期,每天新增治愈人数,并按照每天新增治愈人数进行排名

select name
,截止日期
,每天新增治愈人数
,rank() over(PARTITION BY RE.name ORDER BY RE.每天新增治愈人数 desc) 排名
from (
select name
,date_format(whn,'%Y年%m月%d日') 截止日期
,(recovered-lag(recovered,1) over(PARTITION BY name ORDER BY whn)) 每天新增治愈人数
from covid
where name in ('France','Italy')
group by name,whn,recovered
) as RE
group by RE.name,RE.截止日期,RE.每天新增治愈人数
order by 排名

写在后面:文章总结归纳于自戴师兄的课程:https://www.bilibili.com/video/BV1ZM4y1u7uF?p=4
在此课程学习的基础上进行了一些修改和验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL数据分析之子查询的综合用法和案例题【耐心整理】 的相关文章

  • 如果 Oracle SQL 中存在视图,则删除视图[重复]

    这个问题在这里已经有答案了 我是 Oracle 数据库系统的新手 Oracle 12c 中以下 SQL 语句的等效项是什么 DROP VIEW IF EXIST
  • Ruby ActiveRecord 和 sql 元组支持

    ActiveRecord 是否支持 where 子句中的元组 假设底层数据库支持 结果 where 子句看起来像这样 where name address in John 123 Main St I tried Person where n
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 为什么 ISNUMERIC('.') 返回 1?

    最近我在 SQL Server 中使用 ISNUMERIC 时遇到了一个问题 导致找到了这段代码 SELECT ISNUMERIC 这会返回 1 如 true 所示 难道不应该像 false 一样返回 0 吗 See Numeric 损坏了
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是
  • SQLite SQL 查询出现问题[重复]

    这个问题在这里已经有答案了 我正在尝试在 SQLite 3 中运行以下查询 SELECT DISTANCE latitude longitude AS distance FROM country WHERE id NOT LIKE HAVI
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • 使用来自另一个的 SELECT 更新表,但字段为 SUM(someField)

    基本上我有这样的事情 UPDATE Table SET Table col1 other table col1 FROM Table INNER JOIN other table ON Table id other table id 问题是
  • PostgreSQL 和锁定

    希望一些比我更聪明的 DBA 可以帮助我找到一个好的解决方案来完成我需要做的事情 为了便于讨论 我们假设我有一个名为 work 的表 其中包含一些列 其中一列表示给定客户端对该行工作的所有权 场景是 我将连接 2 个客户端并轮询表以查找要完
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • 使用“AND”表达式构建动态 SQL,而不混淆嵌套条件?

    总的来说 我对 php 和编码相当陌生 我有一系列条件需要测试它们是否已设置 它们是 option1 option2 option3 if isset option1 if isset option2 if isset option3 qu
  • Entity Framework 6 多对多想要插入重复行

    不应该这么难 我准备放弃EF了 我的模型有周刊版本 每个版本可以有许多分类广告 每个分类可以出现在一个或多个版本中 我的模型 public class Classifieds Key DatabaseGenerated DatabaseGe

随机推荐