表的连接查询
在数据查询中,经常涉及到提取两个或多个表的数据,这就需要使用表的连接来实现若干个表数据的联合查询。
在一个查询中,当需要对两个或多个表连接时,可以指定连接列,在WHERE子句中给出连接条件,在FROM子句中指定要连接的表,其格式如下:
SELECT 列名1,列名2,…
FROM 表1,表2,…
WHERE 连接条件
对于连接的多个表通常存在公共列,为了区别是哪个表中的列,在连接条件中通过表名前缀指定连接列,例如,teacher.tno表示teacher表的tno列,student.sno表示student表的sno列,由此来区别连接列所在的表。
【例5.14】查询所有学生的sname、cno和degree列。
SELECT student.sname,score.cno,score.degree
FROM student,score
WHERE student.sno=score.sno
本例执行结果如下:
sname cno degree
-------- ---------- -----------
陆君 3-245 86
匡明 3-245 75
王芳 3-245 68
陆君 3-105 92
匡明 3-105 88
王芳 3-105 76
李军 3-105 64
王丽 3-105 91
曾华 3-105 78
李军 6-166 85
王丽 6-166 79
曾华 6-166 81
SQL为了简化输入,允许在查询中使用表的别名,以缩写表名,我们可以在FROM子句中为表定义一个临时别名,然后在查询中引用。
根据连接条件分为等值连接和非等值连接。所谓等值连接,是指表之间通过“等于”关系连接起来,产生一个连接临时表,然后对该临时表进行处理后生成最终结果。
【例5.15】查询所有学生的sno、cname和degree列。
SELECT x.sno,y.cname,x.degree
FROM score x,course y
WHERE x.cno=y.cno
本例执行结果如下:
sno cname degree
----- ---------------- --------
103 操作系统 86
105 操作系统 75
109 操作系统 68
103 计算机导论 92
105 计算机导论 88
109 计算机导论 76
101 计算机导论 64
107 计算机导论 91
108 计算机导论 78
101 数字电路 85
107 数字电路 79
108 数字电路 81
【例5.16】查询“95033”班所选课程的平均分。
SELECT y.cno,avg(y.degree)AS '平均分'
FROM student x,score y
WHERE x.sno=y.sno and x.class='95033'
GROUP BY y.cno
本例执行结果如下:
cno 平均分
---------- --------------
3-105 77.666666
6-166 81.666666
所谓非等值连接,是指表之间的连接关系不是“等于”,而是其他关系。通过指定的非等值关系将两个表连接起来的,产生一个连接临时表,然后对该临时表进行处理后生成最终结果。
【例5.17】假设使用如下命令建立了一个grade的表:
CREATE TABLE grade(low int,upp int,rank char(1))
INSERT INTO grade VALUES(90,100,'A')
INSERT INTO grade VALUES(80,89,'B')
INSERT INTO grade VALUES(70,79,'C')
INSERT INTO grade VALUES(60,69,'D')
INSERT INTO grade VALUES(0,59,'E')
查询所有学生的no,cno和rank列:
SELECT sno,cno,rank
FROM score,grade
WHERE degree between low and upp
ORDER BY rank
本例执行结果如下:
sno cno rank
----- ---------- ----
103 3-105 A
107 3-105 A
103 3-245 B
105 3-105 B
101 6-166 B
108 6-166 B
105 3-245 C
109 3-105 C
108 3-105 C
107 6-166 C
109 3-245 D
101 3-105 D
在数据查询中有时需要将同一个表进行连接,这种连接称之为自连接,进行自连接就如同两个分开的表一样,可以把一个表的某行与同一表中的另一行连接起来。
【例5.18】查询选学“3-105”课程的成绩高于“109”号学生成绩的所有学生记录,并按成绩从高到低排列。
SELECT x.cno,x.sno,x.degree
FROM score x,score y
WHERE x.cno='3-105' and x.degree>y.degree and y.sno='109' and y.cno='3-105'
ORDER BY x.degree DESC
本例执行结果如下:
cno sno degree
---------- ----- -----------
3-105 103 92
3-105 107 91
3-105 105 88
3-105 108 78
【例5.19】查询成绩高于学号“109”的课程号“3-105”的成绩的所有记录,并按成绩从低到高排列。
SELECT x.cno,x.sno,x.degree
FROM score x,score y
WHERE x.degree>y.degree and y.sno='109' and y.cno='3-105'
ORDER BY x.degree
本例执行结果如下:
cno sno degree
---------- ----- -----------
3-105 108 78
6-166 107 79
6-166 108 81
6-166 101 85
3-245 103 86
3-105 105 88
3-105 107 91
3-105 103 92