<think>我们已有以下表结构和数据(根据用户提供的INSERT语句):
教师表(t): tno, sn, sex, age, prof, sal, maj, dept
学生表(S): sno, sn, sex, age, maj, dept
课程表(c): cno, cn, ct
授课表(tc): tno, cno, tcdate
选课表(sc): sno, cno, score
接下来,我们将分别用自然连接、内连接、左外连接、右外连接来实现每个查询。注意:自然连接会自动根据相同列名进行连接,而其他连接需要明确指定连接条件。
1. 查询所有男生的姓名和成绩。
- 自然连接:自然连接会在学生表S和选课表sc之间根据相同的列名(sno)进行连接,但注意,自然连接会去重相同列名的列,所以结果中sno只出现一次。
- 内连接:显式指定连接条件(S.sno = sc.sno),然后筛选性别为男。
- 左外连接:以学生表为左表,连接选课表,这样即使没有成绩的男生也会被列出(成绩为NULL)。
- 右外连接:以选课表为右表,连接学生表,但这样会丢失没有选课的男生,所以不适用。因此,我们可以将学生表放在右边,然后使用右外连接,这样等价于左外连接(学生表在右边,右外连接则保留学生表所有行)。但为了统一,我们通常用左外连接,这里我们尝试用右外连接实现同样的效果(即保留所有男生,包括没有选课的)。
2. 查询计算机学院的学生的姓名及其所选修的课程名。
- 需要连接学生表S、选课表sc和课程表c。
- 自然连接:根据相同列名自动连接(S和sc通过sno,sc和c通过cno)。
- 内连接:显式指定连接条件。
- 左外连接:以计算机学院的学生为左表,连接选课表和课程表,这样即使没有选课的学生也会被列出(课程名为NULL)。但题目要求是选修的课程名,所以没有选课的学生的课程名应该是空的,符合要求。
- 右外连接:这里不适用,因为我们要的是计算机学院的所有学生(包括没有选课的),所以应该以学生表为左表。但为了演示右外连接,我们可以将学生表放在右边,然后右外连接选课表和课程表,这样等价于左外连接(学生表在右边,右外连接则保留学生表所有行)。
3. 查询所有讲师的教师编号、教师姓名、授课课程名。
- 注意:讲师的条件是prof='讲师'
- 需要连接教师表t、授课表tc和课程表c。
- 自然连接:根据相同列名(tno连接t和tc,cno连接tc和c)自动连接。
- 内连接:显式指定连接条件。
- 左外连接:以讲师为左表(教师表按讲师筛选),连接授课表和课程表,这样即使该讲师没有授课也会列出(课程名为NULL)。但题目要求是授课课程名,所以没有授课的讲师将没有课程名,符合要求。
- 右外连接:同样,我们可以用右外连接,但为了保证讲师全部出现,我们通常用左外连接。这里为了演示,用右外连接实现(将教师表放在右边)。
4. 查询所有信息专业学生的姓名以及选修的课程名以及考试成绩。
- 信息专业学生的条件是:maj='信息'
- 需要连接学生表S、选课表sc和课程表c。
- 自然连接:自动连接相同列名。
- 内连接:显式指定条件。
- 左外连接:以信息专业学生为左表,连接选课表和课程表,这样即使没有选课的学生也会被列出(课程名和成绩为NULL)。
- 右外连接:同样,我们可以用右外连接,将学生表放在右边,然后左表是选课表和课程表的连接结果,这样保留学生表所有行(即信息专业学生)。
5. 查询石丽老师所带课程及学生选课信息和成绩。
- 需要连接教师表t(条件:sn='石丽')、授课表tc、课程表c、选课表sc、学生表S。
- 自然连接:自动根据相同列名连接。
- 内连接:显式指定连接条件(t.tno=tc.tno, tc.cno=c.cno, c.cno=sc.cno, sc.sno=S.sno)。
- 左外连接:这里我们希望得到石丽老师的所有授课课程,即使没有学生选课(那么学生信息和成绩为NULL)。同时,对于有选课的,显示学生信息和成绩。所以以教师表(石丽)为起点,左外连接授课表、课程表,再左外连接选课表和学生表。
- 右外连接:为了演示,我们可以尝试用右外连接,但逻辑上左外连接更自然。
注意:由于自然连接在实际使用中容易出错(因为会自动匹配所有相同列名,如果多个表中存在多个相同列名,可能导致连接条件不符合预期),因此我们通常推荐使用显式连接条件。但为了满足题目要求,我们仍然给出自然连接的写法。
下面我们分别写出每个查询的四种连接方式的SQL语句。
注意:由于表名和列名大小写问题,在MySQL中可能不区分,但在其他数据库可能区分。这里按照用户提供的表名和列名(例如,表名t, S, c, tc, sc,列名如tno, sn等)。
另外,由于表S和学生表S,表t和教师表t,为了避免混淆,我们使用别名。
开始写SQL:
1. 查询所有男生的姓名和成绩。
- 自然连接(NATURAL JOIN):
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S NATURAL JOIN sc
WHERE S.sex = '男';
```
注意:自然连接会基于sno自动连接,但是这里S表和sc表都有sno,所以会按sno连接。但是,自然连接会合并相同列名,所以结果中sno只出现一次。另外,自然连接是内连接,所以只会返回有选课的男生。
- 内连接(INNER JOIN):
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S INNER JOIN sc ON S.sno = sc.sno
WHERE S.sex = '男';
```
- 左外连接(LEFT OUTER JOIN):
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S LEFT OUTER JOIN sc ON S.sno = sc.sno
WHERE S.sex = '男';
```
- 右外连接(RIGHT OUTER JOIN): 为了得到所有男生(包括没有选课的),我们可以将S表放在右边,然后sc表右外连接S表,这样S表的所有男生都会出现。或者我们也可以将S表放在左边,用左外连接已经实现。这里为了演示右外连接,我们写成:
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM sc RIGHT OUTER JOIN S ON sc.sno = S.sno
WHERE S.sex = '男';
```
2. 查询计算机学院的学生的姓名及其所选修的课程名。
- 自然连接(需要连接S、sc、c三张表):
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
NATURAL JOIN sc
NATURAL JOIN c
WHERE S.dept = '计算机';
```
注意:这里自然连接会基于sno连接S和sc,再基于cno连接sc和c。但是,S表和c表没有相同的列名,所以不会产生额外的连接条件。但是,自然连接会合并所有相同列名的列,所以sno和cno在结果中只出现一次。另外,这个连接是内连接,所以只返回有选课且选课对应的课程存在的计算机学院学生。
- 内连接:
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
INNER JOIN sc ON S.sno = sc.sno
INNER JOIN c ON sc.cno = c.cno
WHERE S.dept = '计算机';
```
- 左外连接(保留计算机学院的所有学生,即使他们没有选课):
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
LEFT OUTER JOIN sc ON S.sno = sc.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.dept = '计算机';
```
- 右外连接:我们可以将计算机学院的学生表放在右边,然后先用sc和c做内连接或左外连接,再用右外连接S表。但是这样写复杂,并且为了保留所有学生,我们通常用左外连接。这里为了演示右外连接,我们可以这样写(效果与上面的左外连接相同):
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM sc
RIGHT OUTER JOIN S ON sc.sno = S.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.dept = '计算机';
```
解释:先右外连接S表,这样S表的所有计算机学院学生都会出现(sc可能为NULL),然后再左外连接课程表c(即使在sc.cno为NULL的情况下,c表连接也会为NULL)。
3. 查询所有讲师的教师编号、教师姓名、授课课程名。
讲师的条件:t.prof='讲师'
- 自然连接(连接t、tc、c):
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 授课课程名
FROM t
NATURAL JOIN tc
NATURAL JOIN c
WHERE t.prof = '讲师';
```
注意:自然连接会自动根据tno连接t和tc,再根据cno连接tc和c。但是,这个连接是内连接,所以只会返回有授课的讲师。
- 内连接:
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 授课课程名
FROM t
INNER JOIN tc ON t.tno = tc.tno
INNER JOIN c ON tc.cno = c.cno
WHERE t.prof = '讲师';
```
- 左外连接(保留所有讲师,即使他们没有授课):
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 授课课程名
FROM t
LEFT OUTER JOIN tc ON t.tno = tc.tno
LEFT OUTER JOIN c ON tc.cno = c.cno
WHERE t.prof = '讲师';
```
- 右外连接:我们可以将教师表放在右边,然后tc和c先做内连接,再用右外连接教师表。这样所有讲师都会出现(因为右外连接保留教师表):
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 授课课程名
FROM tc
INNER JOIN c ON tc.cno = c.cno -- 先连接tc和c,得到授课课程的信息
RIGHT OUTER JOIN t ON tc.tno = t.tno -- 再右外连接教师表,保留教师表所有行
WHERE t.prof = '讲师';
```
4. 查询所有信息专业学生的姓名以及选修的课程名以及考试成绩。
条件:S.maj='信息'
- 自然连接(S、sc、c):
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 考试成绩
FROM S
NATURAL JOIN sc
NATURAL JOIN c
WHERE S.maj = '信息';
```
- 内连接:
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 考试成绩
FROM S
INNER JOIN sc ON S.sno = sc.sno
INNER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
- 左外连接(保留所有信息专业的学生):
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 考试成绩
FROM S
LEFT OUTER JOIN sc ON S.sno = sc.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
- 右外连接:
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 考试成绩
FROM sc
RIGHT OUTER JOIN S ON sc.sno = S.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
5. 查询石丽老师所带课程及学生选课信息和成绩。
条件:t.sn='石丽'
- 自然连接(连接t, tc, c, sc, S):
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
NATURAL JOIN tc
NATURAL JOIN c
NATURAL JOIN sc
NATURAL JOIN S
WHERE t.sn = '石丽';
```
注意:自然连接会自动根据相同的列名(tno, cno, sno)连接,但是这里需要注意,tc表和sc表都有cno,但是tc表没有sno,sc表没有tno,所以连接顺序很重要。实际上,自然连接在连接tc和c时根据cno,然后连接sc和c也是根据cno,但这样连接可能会导致数据不准确?而且,我们无法通过自然连接明确指定tc和sc之间的关联(它们之间没有直接相同列名?tc表有tno和cno,sc表有sno和cno,所以共同列是cno,但这样连接会得到该课程的所有学生,而不仅是石丽老师授课的班级?)。所以自然连接在这里可能不合适,因为石丽老师讲授的课程可能有多门,而每门课程可能有多个学生选课,但是自然连接只能根据列名相同来连接,而无法指定通过课程号cno连接后,还要确保该课程是石丽老师授课的?实际上,在自然连接中,t和tc通过tno连接,tc和c通过cno连接,然后c和sc通过cno连接,sc和S通过sno连接。所以理论上是可以的,但是要注意,如果tc和sc表中都有cno,那么自然连接会合并cno列,所以连接顺序没有要求,因为最终都是通过相同列名连接。但是,由于tc和sc都有cno,在连接tc和sc时,也会根据cno连接?而在我们的自然连接链中,是先连接了tc和c,然后再连接sc,这样sc连接的是c,所以不会直接连接tc。所以这个自然连接链应该是:t自然连接tc(使用tno),然后tc自然连接c(使用cno),然后c自然连接sc(使用cno),然后sc自然连接S(使用sno)。所以可以。
- 内连接:
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
INNER JOIN tc ON t.tno = tc.tno
INNER JOIN c ON tc.cno = c.cno
INNER JOIN sc ON c.cno = sc.cno
INNER JOIN S ON sc.sno = S.sno
WHERE t.sn = '石丽';
```
- 左外连接(为了包括石丽老师授课的课程,即使没有学生选课):
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
INNER JOIN tc ON t.tno = tc.tno -- 假设石丽老师一定授课了,所以用内连接tc表
INNER JOIN c ON tc.cno = c.cno -- 课程表c肯定存在,所以内连接
LEFT OUTER JOIN sc ON c.cno = sc.cno -- 该课程可能没有学生选,所以用左外连接sc
LEFT OUTER JOIN S ON sc.sno = S.sno -- 如果sc有记录,再连接学生表
WHERE t.sn = '石丽';
```
注意:这里我们用了两个左外连接,因为我们要确保石丽老师的所有课程都出现(即使没有学生选课)。另外,由于tc和c表我们假设课程信息是存在的,所以用内连接。如果tc表中课程在c表中不存在,那么内连接会过滤掉,但这种情况不应该发生。
另一种写法(全部用左外连接,但这样可能会包括没有授课的教师?但是我们用条件t.sn='石丽',并且tc表可能为空,但我们希望即使没有授课也要显示教师信息吗?题目要求是所带课程,所以如果石丽老师没有授课,那么课程信息为空,也没有学生信息。所以我们可以这样写:
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
LEFT OUTER JOIN tc ON t.tno = tc.tno
LEFT OUTER JOIN c ON tc.cno = c.cno
LEFT OUTER JOIN sc ON c.cno = sc.cno
LEFT OUTER JOIN S ON sc.sno = S.sno
WHERE t.sn = '石丽';
```
这样,如果石丽老师没有授课,那么课程名、学生姓名和成绩都是NULL。但是题目要求的是所带课程,所以没有授课的课程也就没有课程记录,所以这样写也是合理的。
但是,根据题目,石丽老师有授课记录(见tc表),所以两种写法都可以。不过内连接tc和c表可以减少数据量。
- 右外连接:这个查询用右外连接不太自然,我们可以尝试将教师表放在右边,但这样逻辑反而不清晰。因此,我们用左外连接已经满足。为了演示右外连接,我们可以这样写:
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM tc
INNER JOIN c ON tc.cno = c.cno -- 先连接tc和c
RIGHT OUTER JOIN t ON tc.tno = t.tno -- 右外连接教师表,保留所有教师(这里我们要的是石丽老师)
LEFT OUTER JOIN sc ON c.cno = sc.cno -- 然后连接选课表
LEFT OUTER JOIN S ON sc.sno = S.sno -- 再连接学生表
WHERE t.sn = '石丽';
```
解释:先内连接tc和c,然后右外连接教师表(这样教师表的所有教师都会出现,即使没有授课),然后左外连接选课表和学生表。这样,石丽老师如果没有授课,则课程信息为NULL,学生信息也为NULL。
注意:在实际查询中,我们可能会根据数据情况选择最合适的连接方式。上面的右外连接的写法可能不是最优的,但为了展示右外连接的使用,我们这样写。
由于SQL语句较多,这里只给出每种连接方式的写法,实际执行时请根据数据库环境调整(如表名大小写,字符串引号等)。
接下来,我们将按照要求生成相关问题。
</think>### 1. 查询所有男生的姓名和成绩
#### 自然连接(NATURAL JOIN)
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S NATURAL JOIN sc
WHERE S.sex = '男';
```
*说明*:自然连接自动基于相同列名 `sno` 匹配,但会过滤掉未选课的男生(内连接特性)[^2]。
#### 内连接(INNER JOIN)
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S INNER JOIN sc ON S.sno = sc.sno
WHERE S.sex = '男';
```
*说明*:显式指定连接条件,同样只返回有成绩记录的男生[^3]。
#### 左外连接(LEFT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM S LEFT OUTER JOIN sc ON S.sno = sc.sno
WHERE S.sex = '男';
```
*说明*:保留所有男生记录,未选课的学生成绩显示为 `NULL`[^1]。
#### 右外连接(RIGHT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, sc.score AS 成绩
FROM sc RIGHT OUTER JOIN S ON sc.sno = S.sno
WHERE S.sex = '男';
```
*说明*:等价于左外连接,确保未选课的男生不被过滤[^3]。
---
### 2. 查询计算机学院的学生的姓名及其所选修的课程名
#### 自然连接(NATURAL JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
NATURAL JOIN sc
NATURAL JOIN c
WHERE S.dept = '信息学院' AND S.maj = '计算机';
```
*说明*:自动基于 `sno` 和 `cno` 匹配,但会过滤未选课的学生[^3]。
#### 内连接(INNER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
INNER JOIN sc ON S.sno = sc.sno
INNER JOIN c ON sc.cno = c.cno
WHERE S.dept = '信息学院' AND S.maj = '计算机';
```
*说明*:精确匹配选课记录,仅返回有选课的学生[^2]。
#### 左外连接(LEFT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM S
LEFT OUTER JOIN sc ON S.sno = sc.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.dept = '信息学院' AND S.maj = '计算机';
```
*说明*:包含所有计算机学院学生,未选课者课程名显示为 `NULL`[^1]。
#### 右外连接(RIGHT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名
FROM sc
RIGHT OUTER JOIN S ON sc.sno = S.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.dept = '信息学院' AND S.maj = '计算机';
```
*说明*:通过右外连接保留 `S` 表所有行,确保未选课学生被包含[^3]。
---
### 3. 查询所有讲师的教师编号、教师姓名、授课课程名
#### 自然连接(NATURAL JOIN)
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 课程名
FROM t
NATURAL JOIN tc
NATURAL JOIN c
WHERE t.prof = '讲师';
```
*说明*:自动基于 `tno` 和 `cno` 连接,但会过滤未授课的讲师[^3]。
#### 内连接(INNER JOIN)
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 课程名
FROM t
INNER JOIN tc ON t.tno = tc.tno
INNER JOIN c ON tc.cno = c.cno
WHERE t.prof = '讲师';
```
*说明*:仅返回实际授课的讲师记录[^2]。
#### 左外连接(LEFT OUTER JOIN)
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 课程名
FROM t
LEFT OUTER JOIN tc ON t.tno = tc.tno
LEFT OUTER JOIN c ON tc.cno = c.cno
WHERE t.prof = '讲师';
```
*说明*:包含所有讲师,未授课者课程名显示为 `NULL`[^1]。
#### 右外连接(RIGHT OUTER JOIN)
```sql
SELECT t.tno AS 教师编号, t.sn AS 教师姓名, c.cn AS 课程名
FROM tc
RIGHT OUTER JOIN t ON tc.tno = t.tno
LEFT OUTER JOIN c ON tc.cno = c.cno
WHERE t.prof = '讲师';
```
*说明*:通过右外连接确保未授课讲师不被遗漏[^3]。
---
### 4. 查询所有信息专业学生的姓名以及选修的课程名以及考试成绩
#### 自然连接(NATURAL JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 成绩
FROM S
NATURAL JOIN sc
NATURAL JOIN c
WHERE S.maj = '信息';
```
*说明*:自动匹配三表关联,但过滤未选课的学生[^3]。
#### 内连接(INNER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 成绩
FROM S
INNER JOIN sc ON S.sno = sc.sno
INNER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
*说明*:精确返回选课学生的考试成绩[^2]。
#### 左外连接(LEFT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 成绩
FROM S
LEFT OUTER JOIN sc ON S.sno = sc.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
*说明*:包含所有信息专业学生,未选课者成绩和课程名为 `NULL`[^1]。
#### 右外连接(RIGHT OUTER JOIN)
```sql
SELECT S.sn AS 姓名, c.cn AS 课程名, sc.score AS 成绩
FROM sc
RIGHT OUTER JOIN S ON sc.sno = S.sno
LEFT OUTER JOIN c ON sc.cno = c.cno
WHERE S.maj = '信息';
```
*说明*:等价于左外连接,确保未选课学生被包含[^3]。
---
### 5. 查询石丽老师所带课程及学生选课信息和成绩
#### 自然连接(NATURAL JOIN)
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
NATURAL JOIN tc
NATURAL JOIN c
NATURAL JOIN sc
NATURAL JOIN S
WHERE t.sn = '石丽';
```
*说明*:自动匹配所有关联列,但会过滤未选课的课程[^3]。
#### 内连接(INNER JOIN)
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
INNER JOIN tc ON t.tno = tc.tno
INNER JOIN c ON tc.cno = c.cno
INNER JOIN sc ON c.cno = sc.cno
INNER JOIN S ON sc.sno = S.sno
WHERE t.sn = '石丽';
```
*说明*:仅返回有学生选课的成绩记录[^2]。
#### 左外连接(LEFT OUTER JOIN)
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM t
INNER JOIN tc ON t.tno = tc.tno -- 石丽老师必授课
INNER JOIN c ON tc.cno = c.cno -- 课程必存在
LEFT OUTER JOIN sc ON c.cno = sc.cno
LEFT OUTER JOIN S ON sc.sno = S.sno
WHERE t.sn = '石丽';
```
*说明*:包含石丽所有授课课程,未选课的课程显示学生姓名为 `NULL`[^1]。
#### 右外连接(RIGHT OUTER JOIN)
```sql
SELECT c.cn AS 课程名, S.sn AS 学生姓名, sc.score AS 成绩
FROM tc
INNER JOIN c ON tc.cno = c.cno
RIGHT OUTER JOIN t ON tc.tno = t.tno -- 优先保留教师
LEFT OUTER JOIN sc ON c.cno = sc.cno
LEFT OUTER JOIN S ON sc.sno = S.sno
WHERE t.sn = '石丽';
```
*说明*:通过右外连接确保石丽老师所有记录被保留[^3]。
---
### 连接类型对比总结
| 连接类型 | 特点 | 适用场景 |
|----------------|----------------------------------------------------------------------|----------------------------------------|
| **自然连接** | 自动匹配相同列名,简洁但易出错 | 表结构简单且列名一致时 |
| **内连接** | 显式指定条件,仅返回匹配记录 | 需精确关联数据时(如统计选课学生) |
| **左外连接** | 保留左表所有行,右表无匹配时补`NULL` | 需包含主体对象全部记录时(如所有学生) |
| **右外连接** | 保留右表所有行,左表无匹配时补`NULL` | 等价左外连接,可互换使用 |