如何合并两个表?
1)不保留重复行
2)保留重复行
交叉联结(cross join)、内联结(inner join)、左联结(left join)、右联结(right join)、全联结(full join)
join如果不带有其他标识,则默认是内连接即join=inner join。
1)交叉联结(cross join),也叫“笛卡尔积”
2)内联结(inner join)
3)左联结(left join)
联结:
理解思路:首先通过图中的红箭头,定位筛选出是交叉联结表中的最后一行(即学号为0002那一行),然后对号入座输出select子句对应列名的值(图中的3个绿色箭头)。
注意:空值(Null)不能使用等号=,只能使用 is null或者is not null。
4)右联结(right join)
联结:
5)全联结(full join)
小结:
1)查询所有学生的学号、姓名、选课数、总成绩
2)查询平均成绩大于85分的所有学生的学号、姓名和平均成绩
3)查询学生的选课情况:学号,姓名,课程号,课程名称
1)查询出每门课程的及格人数和不及格人数
因为输出结果包含“课程名称”列,所以牵涉到score和course两张表。需要用到“联结”。
因为输出结果不包含“课程名称”列,只牵涉到score一张表,不需要用到“联结”。
2)使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
注意:成绩的分段区间两侧需要加上单引号‘’
sqlzoo:
以下题目来自sqlzoo的多表查询题目:
网址:https://sqlzoo.net/wiki/The_JOIN_operation/zh
这部分题目使用的是‘2012年欧洲足球锦标赛’数据库里的表。
join如果不带有其他标识,则默认是内连接即 join=inner join。
其实,group by子句子句中只用到“a.id”来分组就可以了的。是因为分组结果中没有比赛日期(mdate),而查询结果要求有比赛日期(mdate)。
“select子句中的列名只能是group by子句中的列名”。
当然,此语法是适用于所有数据库的通用语法。对应不同的数据库会有差别,比如mysql(最新版本)就不受“select子句中的列名只能是group by子句中的列名”条件的限制。
对比上面3张图:题目“入球数字”的意思,是总的入球数,即无论是POL,还是对方进的球,都算入“入球数字”;
注意:题目限制的是“德国”入球的数字,不是总入球数字,所以用到了【where teamid= 'GER'】
这恰好验证了自己上一题(第11题)的想法,突然觉得自己有出题者的天分,做上一题就把下一题的思路想到了,自夸一下,哈哈~
此题由于是右联结,即score是主表,所以select子句中的“学号”必须得用“b”。
总结体会:select子句中列名的别名(a、b、c……)必须得和下面的对应的联结种类对应,不然会得出不同的运行结果。(就算有时候运行结果一样,也只是各表之间的数据巧合而已)。
多表查询,既复杂也简单,确实是有一定的“套路”的,需要自己不断摸索体会。很多容易出错的细节地方,需要不断总结。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!