经过之前的学习,现在我们已经对查询有了一定的了解,但是我们目前的所有查询都只能找到在一张表中的数据,但如果我们需要寻找分布在多张表格中的数据时,这种之前的查询就做不到了,这时就需要引入一种新的查询方法,多表查询。
一、联结的介绍
还记得我们最开始数据库结构中提到的联结(JOIN)吗?它就是我们用来连接多个表格的工具,当需要提取的数据分布在不同表格时。我们可以使用JOIN链接,多个数据库关联起来,
如图所示这四张表格使用了JOIN相互连接,学生表学号与成绩表学号连接,成绩表课程号与课程表课程号连接,课程表教师号与教师表教师号连接,表之间的连接可以这样写
SELECT
FROM 学生表 as a1 JOIN 成绩表 as a2
ON a1.学号 = a2.学号
JOIN 课程表 as a3 /*如果需要关联第三个表*/
ON a2.课程表 = a3.课程表
在表和表之间使用 JOIN 来进行联接,用来关联的字段则写在 ON 后面
二、联结的种类
连接又分类几个种类
1.交叉连接,交叉连接会将表中的每一行和另外一张表中的每一行合并在一起,结果的行数是两张表行数的乘积(一共6行)。
2.内连接,内连接将两张表中共有的数据相联,如图所示,我们可以看到通过学号相联结的时学号0001为两张表中共有的行,因此将学号为0001的列与成绩表中0001的列相联结。
3.左联结/右联结,左联结会将左侧表中的全部数据与右侧表中的数据相联结。右边没有的数据则用空值表示。右联结则会将右侧表中的全部数据与左侧表中的数据相联结,左边表没有的数据则为空值。
4.全联结,全连接会将左右两边的值都进行合并,没有值的行则会用空值表示
三、CASE表达式
CASE表达式可以用来解决复杂的问题
CASE WHEN<判断表达式> THEN <表达式>WHEN<判断表达式> THEN <表达式>WHEN<判断表达式> THEN <表达式>.......ELSE
END
CASE表达式可以用来进行复杂的判断,每一句CASE表达式都能进行一个判断,当满足这个条件时就会结束,如果不满足这个条件则会继续运行后面的WHEN语句,最后的语句都没有找到符合条件的语句则会运行ELSE子句。
每一个CASE表达式都必须含有END
四、练习题
将分数分段并统计各分段的人数
SELECT c1.课程号,c2.课程名称,
SUM(CASE WHEN 成绩 BETWEEN 70 AND 85
THEN 1 ELSE 0 END) AS '[85-70]',
SUM(CASE WHEN 成绩 BETWEEN 60 AND 70
THEN 1 ELSE 0 END) AS '[70-60]',
SUM(CASE WHEN 成绩 <60 THEN 1 ELSE 0 END) AS '[<60]'
FROM score as c1 JOIN courser as c2
ON c1.课程号 = c2.课程号
GROUP BY c1.课程号
4.列出球員名字叫Mario (player LIKE 'Mario%'
)有入球的 隊伍1 team1, 隊伍2 team2 和 球員名 player
SELECT team1,team2,player
FROM goal as c1 JOIN game as c2
ON id =matchid
WHERE player LIKE 'Mario%'
6.列出'Fernando Santos'作為隊伍1 team1 的教練的賽事日期,和隊伍名。
SELECT mdate,teamname
FROM game as c1 JOIN eteam as c2
ON c1.team1 = c2.id
WHERE coach = 'Fernando Santos'
8.列出全部賽事,射入德國龍門的球員名字
SELECT DISTINCT(player)
FROM game JOIN goal ON matchid = id
WHERE (team1='GER' or team2='GER')
AND teamid <> ('GER')
12.每一場德國'GER'有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。
SELECT matchid,mdate,count(team1)
FROM game AS c1 JOIN goal as c2
ON c2.matchid = c1.id
WHERE (team1 = 'GER' OR team2 = 'GER')
AND c2.teamid = 'GER'
GROUP BY c2.matchid,mdate