统计小白er

V1

2023/01/13阅读:247主题:草原绿

SQL刷题-T1:比赛名单整理

1、比赛名单整理(1星)

1.1 题目介绍

有一张参加比赛的队伍名称表competition_list,包括字段team_name(队名):varchar。

每个参赛队伍都会和其他参赛队伍开展一次组队比赛,要求输出两两参赛队伍的所有比赛情况组合(队伍A和队伍B),并按照队名依次升序排列。

1.2 注释(思路想法):

第一想法:

就是左连接,最开始使用了 a.team_name <> b.team_name 连接条件,返回了20条记录,因为经常看足球比赛,知道主客场之分,对于该结果,我个人觉得是一定现实意义的。再分析该题目需求来说,并不存在主客场的需求,是另外一种比赛形式,如果双方比赛过一场即可。

这个时候使用了 a.team_name < b.team_name 的连接条件,因为这个team_name一列是存在一定顺序的,这样的话,我们舍弃掉了一些结果,得到和题目需求类似的结果。唯一存在的问题是谁与争锋队作为队伍A的时候,是没有匹配上队伍的,也就是队伍B是NULL值,因为我是使用的左右表连接,所以队伍A是左表中所有的元素,然后team_name有一定的排序,谁与争锋队是在这个顺序中最大的,所以最终导致目前出现NULL值的情况。 这个时候,我又加了一条筛选条件where b.team_name is not null ,来得到最终的结果。

第二想法:

因为第一想法中存在NULL值,然后对其进行删除操作,让我是不是可以使用内连接,这样就不存在没有连接还存在记录的情况。试了试是ok的。

注:试了下两种方法,发现第二种方法相对第一种更快一些。

建表语句:

DROP TABLE IF EXISTS competition_list; 
CREATE TABLE competition_list( 
team_name VARCHAR(8

ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO
competition_list (team_name) 
VALUE 
 ('乘风破浪队'
 ,('梦之队')
 ,('必胜队'
 ,('谁与争锋队'
 ,('群英汇队'
;

1.3 脚本:

-- 代码
-- 第一想法:左连接 
select a.team_name as `队伍A`,b.team_name as `队伍B`
from competition_list as a 
left join competition_list as b 
on a.team_name < b.team_name 
where b.team_name is not null 
order by `队伍A` asc`队伍B` asc  ;


-- 第二想法:内连接 
select a.team_name as `队伍A`,b.team_name as `队伍B`
from competition_list as a 
inner join competition_list as b 
on a.team_name < b.team_name 
order by `队伍A` asc`队伍B` asc ;

分类:

后端

标签:

数据库

作者介绍

统计小白er
V1