(七)SQL——子查询

1. 非关联子查询

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

例如:假设我们想要知道哪个球员的身高最高,最高身高是多少

select play_name, height from player where height = (select max(height) from player)

2. 关联子查询

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

例如:需要统计球队的平均身高,然后筛选身高大于这个数值的球员姓名、身高和球队ID

select play_name, height, team_id from player as a where height > (select avg(height) from player as b where b.team_id = a.team_id)

3. Exist子查询

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

NOT EXISTS就是不存在的意思,满足的话为True,不满足为False。

想要看出场过的球员都有哪些,并且显示他们的姓名、球员ID和球队ID。是否出场是通过player_score这张表中的球员出场表现来统计的

select play_name, team_id, play_id from player where exist (select play_id from play_score where player.id = play_score.id)

4. 集合比较子查询

  • 子查询也可以作为主查询的计算字段

  • ANY、ALL关键字必须与一个比较操作符一起使用。因为如果你不使用比较操作符,就起不到集合比较的作用,那么使用ANY和ALL就没有任何意义

  • in和exist的区别

    我们可以把两个模式抽象为:

    SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
    SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)
    

    如果表A比表B大,那么IN子查询的效率要高; 如果表A比表B小,那么使用EXISTS子查询效率会更高

想要看出场过的球员都有哪些,并且显示他们的姓名、球员ID和球队ID。

select play_name, team_id, play_id from player where play_id in (select play_id from play_score)

我们想要查询球员表中,比印第安纳步行者(对应的team_id为1002)中任意一个球员身高高的球员信息,并且输出他们的球员ID、球员姓名和球员身高

select play_name, team_id, play_id from player where heigth > any(select height from player where play_id = 1002)

我们想要知道比印第安纳步行者(对应的team_id为1002)中所有球员身高都高的球员的信息,并且输出球员ID、球员姓名和球员身高

select play_name, team_id, play_id from player where heigth > all(select height from player where play_id = 1002)

比如我想查询每个球队的球员数,也就是对应team这张表,我需要查询相同的team_id在player这张表中所有的球员数量是多少。

select team_name, (select count(*) from player where player.team_id = team.team_id) from team
posted @ 2022-08-24 17:11  言思宁  阅读(86)  评论(0编辑  收藏  举报