第1关:内连接(1)
任务描述
本关任务:在 TESTDB 数据库中查询指定数据。
相关知识
连接查询
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息,连接操作给用户带来很大的灵活性。
内连接
内连接的查询结果显示符合条件的记录。
如图所示的表A和表B,我们对其进行内连接查询。

表的连接方法有以下两种:
(1)FROM子句指明进行连接的表名,WHERE子句指明连接的列名及其连接条件。
SELECT <字段名1>, <字段名2>...
FROM <表名1>,<表名2>,...
WHERE 表连接条件 <AND 检索条件>;
(2)利用关键字JOIN进行连接。
内连接:inner join
基本语法:
SELECT <字段名1>, <字段名2>...
FROM <表名1> INNER JOIN <表名2>
ON 表连接条件
WHERE 检索条件;
示例用法
(1)select * from A, B WHERE A.type = B.type;
(2)select * from A inner join B on A.type = B.type;
示例结果(黄色部分)

这样,就内连接查询到了表中含有相同信息的结果集。
编程要求
查询参加了G001课程的学生人数。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
SELECT SUM(gnum)
from class INNER JOIN teaching ON class.gno=teaching.gno
INNER JOIN course on teaching.cno=course.cno AND course.cno='G001'
GROUP BY teaching.cno;
---------- END ----------
第2关:内连接(2)
任务描述
本关任务:在 TESTDB 数据库中查询指定数据。
相关知识
连接查询
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息,连接操作给用户带来很大的灵活性。
内连接
内连接的查询结果显示符合条件的记录。
如图所示的表A和表B,我们对其进行内连接查询。

表的连接方法有以下两种:
(1)FROM子句指明进行连接的表名,WHERE子句指明连接的列名及其连接条件。
SELECT <字段名1>, <字段名2>...
FROM <表名1>,<表名2>,...
WHERE 表连接条件 <AND 检索条件>;
(2)利用关键字JOIN进行连接。
内连接:inner join
基本语法:
SELECT <字段名1>, <字段名2>...
FROM <表名1> INNER JOIN <表名2>
ON 表连接条件
WHERE 检索条件;
示例用法
(1)select * from A, B WHERE A.type = B.type;
(2)select * from A inner join B on A.type = B.type;
示例结果(黄色部分)

这样,就内连接查询到了表中含有相同信息的结果集。
编程要求
查询"杨梅"老师所讲授的课程,要求列出教师号、教师姓名和课程号。
列顺序请按照 tno | tname | cno 。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
select teacher.tno,tname,cno
from teacher,teaching
where teacher.tno=teaching.tno and tname='杨梅';
---------- END ----------
第3关:外连接
任务描述
本关任务:在 TESTDB 数据库中查询指定数据。
相关知识
外连接
内连接的查询结果显示符合条件的记录,而外连接的查询结果除了显示符合条件的记录,还包括不符合条件的记录。
实例还是使用此表。

外连接是以某张表(左表或右表)为主,取出里面的所有记录, 然后每条与另外一张表(从表)进行连接;不管能不能匹配上条件,主表记录最终都会保留。能匹配,正确保留;不能匹配,从表的字段都置空NULL。而内连接只保留匹配条件的行。
左(外)连接
left join: 以左表为主表
基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
示例用法
select * from A left join B on A.type = B.type;
示例结果(黄色部分,无数据为null)

右(外)连接
right join: 以右表为主表
基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
示例用法
select * from A right join B on A.type = B.type;
示例结果(黄色部分,无数据为null)

全(外)连接
全外连接的查询结果显示符合条件的记录,以及左、右表中不符合条件的记录。
基本语法: from 左表 full join 右表 on 左表.字段 = 右表.字段;
示例用法
select * from A full join B on A.type = B.type;
示例结果(黄色部分,无数据为null)

编程要求
查询18级所有班级的上课信息,要求列出班级号、课程号、开课学期和教室名。
列顺序请按照 gno | cno | term | classroom 。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
select teaching.gno,cno,term,classroom
from class
inner JOIN teaching ON class.gno=teaching.gno and grade='18级'
---------- END ----------
第4关:自连接
任务描述
本关任务:在 TESTDB 数据库中查询指定数据。
相关知识
自连接
针对相同的表进行的连接被称为"自连接"。自联接用于将表连接到自身(同一个表)。 它对于比较同一个表中的行很有用。
由于使用自联接的查询引用同一个表,因此表别名用于为查询中的表分配不同的名称。
请注意,如果在不使用表别名的情况下在查询中多次引用同一个表,则会出现错误。
基本语法:
(1)利用FROM...WHERE...
SELECT <字段名1>, <字段名2>...
FROM <表名> AS X , <表名> AS Y
WHERE 表连接条件 <AND 检索条件>;
(2)利用关键字JOIN。
SELECT <字段名1>, <字段名2>...
FROM <表名> AS X INNER JOIN <表名> AS Y
ON 表连接条件
WHERE 检索条件;
自连接的用途以及用法
例子:查找收入超过各自经理的员工的姓名
Id Name Salary ManagerId
1 Joe 70000 3
2 Henry 80000 4
3 Sam 60000 NULL
4 Max 90000 NULL
SELECT e1.Name AS employee_name
FROM Employee AS e1, Employee AS e2
WHERE e1.ManagerId=e2.Id
AND e1.Salary>e2.Salary
例子:查找比昨天温度高的所有日期的 Id
Id(INT) RecordDate(DATE) Temperature(INT)
1 2015-01-01 10
2 2015-01-02 25
3 2015-01-03 20
4 2015-01-04 30
SELECT w1.Id
FROM weather w1
JOIN weather w2
ON DATEDIFF(w1.RecordDate,w2.RecordDate)=1
WHERE w1.Temperature>w2.Temperature
编程要求
查询比"软件19级3班"人数少的班级信息。
列顺序请按照 gno | gname | gnum 。
测试说明
平台会对你编写的代码进行测试,结果正确即可通关。
开始你的任务吧,祝你成功!
---------- BEGIN ----------
select gno,gname,gnum
from class
where gnum<(
select gnum
from class
where gname='软件19级3班'
)
---------- END ----------