一、面试题
1.1、表结构
有两个表,一个是赛程表,出于节省空间考虑,并没有把主队与客队的名称写进去,包含以下字段:
另外有一张专门的参赛队伍表:
由team_ID 与 team_name两个字段组成。(类似于前面左连接例子中的商品表与商品名称两个表)
1.2、构造表并插入数据
用sql构建这两张表,这里偷懒就不为每个字段赋默认值了。
其中字母m代表match表示比赛,字母t代表team表示队伍,注意不能用match单词作为表名,因为“match”是sql中的关键字。
1.3、题目:
已知有两个如上的表,现在要求取出6月1号到7月1号之间的比赛的结果,并且队伍id应显示出队名才行。也就是,最终结果样例应该如下:
二、题目思路:
根据题意,“队伍id显示出队名”,想到一定会用左连接来做。但是有h_id与g_id两个字段,一个左连接是做不出来的。具体应该怎么做呢?
由简入繁,由浅入深,解决问题的王道。
2.1、第一步:调整字段的顺序,向最后的结果靠齐。
调整顺序2.2、第二步:再前进一小步,根据h_id,左连team表,查出主队的队伍名称(即简单的2张表左连接)
h_id表其中t_name就是从team表中左连接以后,得到的。
2.3、第三步:同理于上面,根据g_id得到客队的队伍名称。
想要得到g_id,我们就把h_id表看成结果,然后和team表,再一次左连即可。
也就是说我们可以把 m left join on m.h_id = t.t_id 这个语句当做一个表名来看。于是,再次左联一次,得到如下语句:
但还是出错了。注意看,在第一个左联中,有m,t两个表,第二个左联表中,还有一个t表。表名不唯一,导致的错误。
解决方法:起个别名就可以解决,select 列名 as 别名,那么也就可以 from 表名 as 表别名。
比如,在下面from中,让第一个t变成t1。重新执行h_id的语句
发现结果跟(h_id表)中结果是一样的。
同样,我们也可以让第二天t变成t2,注意,后面调用该t表名时,都要改成t2才行,在t_name也有重复情况,前面需要加上表名加以区分。
2.4、快要成功了
我们把多余的列去掉即可,如下:
2.5、最后一步
题目要求取出6月1号到7月一号之间的。于是想到表查询的的where子句。
前面说过,左连接之后,得到的是一张表,那么where,group,等五个子句也是照常使用的。
因此加一个where筛选条件即可。
这里我们认为“之间”代表包括边界值,那么就用between and 即可。
得到最终结果。
一个简单的三表联查的题目。
网友评论