SQL语法基础篇 —— 子查询

子查询


什么是关联子查询,什么是非关联子查询

子查询是一种嵌套查询的形式,不过可以依据查询是否执行多次,从而将子查询分为关联子查询和非关联子查询。

子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,这样的子查询叫做非关联子查询。

如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为关联子查询。

创建NBA球员数据库:https://github.com/cystanford/sql_nba_data

文件中一共包含了5张表,player表为球员表,team为球队表,team_score为球队比赛表,player_score为球员比赛成绩表,height_grades为球员身高对应的登记表。

player表,37个球员
在这里插入图片描述
team表,3支球队
在这里插入图片描述
team_score表为球队比赛成绩表,两场比赛
在这里插入图片描述
player_score表为球员比赛成绩表,记录了一场比赛中球员的表现。包含19个字段
在这里插入图片描述
其中shoot_attepts代表总出手的次数,它等于二分球出手和三分球出手次数的总和。

以NBA球员数据为例,查找哪个球员的身高最高,最高身高是多少,就可以采用子查询的方式:

SELECT player_name, height FROM player
WHERE height = (SELECT max(height) FROM player;

查询结果:
在这里插入图片描述
通过SELECT可以得到最高身高这个数值,然后再通过player这个表,看谁具有这个身高,再进行输出,这样的子查询就是非关联子查询。

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此没执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。

实例:

  • 查询每个球队中大于平均身高的球员有哪些,并显示他们的球员姓名、身高以及所在球队ID
SELECT player_name, height, team_id FROM player AS a
WHERE heihgt > (SELECT avg(height) FROM player AS b
a.team_id = b.team_id);

查询结果
在这里插入图片描述

EXISTS 子查询

关联子查询通常会和EXISTS一起来使用,EXISTS子查询用来判断条件是否满足,满足的话为True,不满足为False。

实例:

  • 查询出场过的球员都有哪些,并显示他们的姓名、球员ID和球队ID。
-- 如果某个球员在player_score中有出场记录则代表他出场过
SELECT player_id, team_id, player_name FROM player
WHERE EXISTS (SELECT player_id FROM player_score
WHERE player.player_id = player_score.player_id);

查询结果
在这里插入图片描述
NOT EXISTS就是不存在的意思,也可以通过NOT EXISTS查询不存在player_score表中的球员信息。

实例

  • 查询不存在于player_score表中的球员信息
SELECT player_id, team_id, player_name FROM player
WHERE NOT EXISTS (SELECT player_id FROM player_score
WHERE player.player_id = player_score.player_id);

查询结果
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值