本教程为《SQL数据查询实践》系列的第一部分,专注于介绍SQL语言的基础知识和基本的数据查询技巧,旨在帮助初学者掌握SQL的核心概念。
目录连接+嵌套查询练习S,C,SC关系表及S,J,P,SPJ关系表简易介绍
### 连接+嵌套查询练习
#### S,C,SC关系表
设有学生-课程关系数据库,它由三个关系组成:
1. **S**(学号`SNO`,姓名`SN`,所在系`DEPT`,年龄`AGE`)
2. **C**(课程号`CNO`,课程名`CN`,先修课号 `CPNO`)
3. **SC**(学号 `SNO`, 课程号 `CNO`, 成绩 `SCORE`)。
请用SQL语句写出下列查询:
1. 检索选修了课程号为C1且成绩为A的所有学生姓名。
```sql
SELECT SN
FROM S
WHERE SNO IN (SELECT SNO FROM SC WHERE CNO=C1 AND SCORE=A)
```
2. 查询学号为S1的学生所修读的全部课程名称及先修课号:
```sql
SELECT CN, CPNO
FROM C
WHERE CNO IN (SELECT CNO FROM SC WHERE SNO = S1)
```
3. 查询年龄为23岁的学生所选的所有课程名。
```sql
SELECT CN
FROM C
WHERE CNO IN (SELECT CNO FROM SC WHERE SNO IN (SELECT SNO FROM S WHERE AGE=23))
```
4. 查找至少修读了学号为S5的学生之一门课程的其他学生的姓名:
```sql
SELECT DISTINCT SN
FROM S INNER JOIN SC ON S.SNO = SC.SNO
WHERE Cno = ANY (SELECT Cno FROM SC WHERE Sno=S5)
EXCEPT SELECT SN FROM S WHERE SNO=S5
```
#### 更复杂的数据库模型:涉及四个表(供应商、工程、零件和SPJ)
1. 查询工程代码为 J2 的所有使用过的零件名称与数量:
```sql
SELECT PNAME, QTY
FROM P INNER JOIN SPJ ON P.PNO = SPJ.PNO
WHERE JNO=J2
```
2. 找出使用上海产零件的工程名。
```sql
SELECT JNAME FROM J WHERE JNO IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY= 上海))
```
3. 列出没有使用天津产零件的所有工程号:
```sql
SELECT JNO
FROM J
WHERE JNO NOT IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY=天津))
```
4. 求未用到天津生产且颜色为红色的零件的工程号。
```sql
SELECT JNO
FROM J
WHERE JNO NOT IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY= 天津 AND COLOR=红))
```
5. 检索姓刘的学生选修的所有课程名与教师姓名:
```sql
SELECT CN, TH
FROM C, SC, S
WHERE S.SNO = SC.SNO AND SC.CNO = C.CNO AND SN LIKE 刘%
```
6. 查询未选修数据库相关课程的学生学号和姓名。
```sql
SELECT SNO, SN FROM S WHERE SNO NOT IN (SELECT SNO FROM SC WHERE CNO IN (SELECT CNO FROM C WHERE CN LIKE %数据库%))
```
通过这些练习,我们能够深入了解SQL中的连接查询、子查询、聚合函数及条件过滤等操作。这些技能在实际的数据库管理和数据分析工作中至关重要。