### 数据库实验知识点详解
#### 实验二:SQL Server 2000 查询分析器
**实验背景**
本实验旨在通过SQL Server 2000的查询分析器,帮助初学者掌握基本的SQL查询语句。通过具体的SQL查询案例,加深对SQL语言的理解。
**实验任务**
本次实验主要涉及以下查询语句:
1. **查询自动化系的学生信息**
```sql
SELECT 学号, 姓名 FROM 学生 WHERE 所在系 = '自动化系';
```
- **解析**: 此语句用于检索“学生”表中所有“所在系”为“自动化系”的学生的学号和姓名。
- **应用场景**: 适用于查询特定系别下的学生信息,如统计自动化系的学生人数等。
2. **查询选课表中的不同学号**
```sql
SELECT DISTINCT 学号 FROM 选课;
```
- **解析**: 该语句用于获取“选课”表中不同的学号记录。
- **应用场景**: 可用于统计选课表中有多少不同的学生选择了课程。
3. **按成绩降序、学号升序查询特定课程的成绩**
```sql
SELECT 学号, 成绩 FROM 选课 WHERE 课程号 = 'C' ORDER BY 成绩 DESC, 学号 ASC;
```
- **解析**: 此查询用于检索课程号为'C'的所有学生学号及成绩,并按成绩降序排序,相同成绩时按学号升序排序。
- **应用场景**: 适用于查看某个课程的成绩分布情况,如查看哪个学生的成绩最高,以及分数相同的学生成绩排名。
4. **查询特定课程成绩在80到90分之间,成绩乘以0.8的结果**
```sql
SELECT 学号, 成绩 * 0.8 FROM 选课 WHERE 课程号 = 'C' AND 成绩 BETWEEN 80 AND 90;
```
- **解析**: 该查询用于检索课程号为'C'且成绩在80至90分之间的学生的学号及调整后的成绩(成绩*0.8)。
- **应用场景**: 例如计算成绩的折合分数或统计优秀率时使用。
5. **查询成绩为空的学号和课程号**
```sql
SELECT 学号, 课程号 FROM 选课 WHERE 成绩 IS NULL;
```
- **解析**: 此查询用于找出“选课”表中成绩为空的记录。
- **应用场景**: 适用于统计未提交成绩的学生名单。
6. **查询电气系或自动化系中姓“钱”的学生**
```sql
SELECT * FROM 学生 WHERE 所在系 IN ('电气系', '自动化系') AND 姓名 LIKE '钱%';
```
- **解析**: 此查询用于检索“学生”表中所在系为电气系或自动化系,且姓名以“钱”开头的学生信息。
- **应用场景**: 如统计特定姓氏的学生数量,或者查找特定姓氏的学生信息。
7. **连接学生表和选课表**
```sql
SELECT 学生.*, 选课.* FROM 学生, 选课 WHERE 学生.学号 = 选课.学号;
```
- **解析**: 该查询通过内连接的方式,将“学生”表和“选课”表中学号相同的记录连接起来。
- **应用场景**: 适用于查看某个学生的所有选课记录。
8. **多表连接查询学生信息、课程名和成绩**
```sql
SELECT 学生.学号, 姓名, 课程名, 成绩 FROM 学生, 课程, 选课 WHERE 学生.学号 = 选课.学号 AND 课程.课程号 = 选课.课程号;
```
- **解析**: 此查询通过三个表的连接,获取学生的学号、姓名、所选课程的名称及其成绩。
- **应用场景**: 例如统计学生所选课程的具体成绩信息。
9. **查询特定课程的成绩信息**
```sql
SELECT 学生.学号, 姓名, 成绩 FROM 学生, 选课 WHERE 学生.学号 = 选课.学号 AND 选课.课程号 = 'C';
```
- **解析**: 此查询用于检索学生表和选课表中,学号匹配且课程号为'C'的学生的学号、姓名和成绩。
- **应用场景**: 查看某个课程的学生名单及其成绩。
10. **使用NOT EXISTS子查询过滤学生信息**
```sql
SELECT 学号, 姓名 FROM 学生 WHERE NOT EXISTS (SELECT * FROM 选课 AS 选课1 WHERE 选课1.学号 = 'B0002' AND NOT EXISTS (SELECT * FROM 选课 AS 选课2 WHERE 学生.学号 = 选课2.学号 AND 选课2.课程号 = 选课1.课程号));
```
- **解析**: 此查询较为复杂,用于查找满足条件的学生信息,即学号不等于'B0002'且没有选择其他学生选择的课程的学生。
- **应用场景**: 例如筛选出未选择某些课程的学生名单。
#### 实验三:SQL语言的DDL
**实验目的**
本实验的目标是让学习者了解并掌握SQL的DDL(Data Definition Language)部分,主要包括如何使用`CREATE`、`DROP`、`ALTER`等关键字来创建、删除和修改数据库对象(如表、索引和视图)。
**实验内容**
实验涵盖了以下DDL命令的基本使用方法:
- `CREATE DATABASE`: 创建一个新的数据库。
- `CREATE TABLE`: 创建新的表。
- `DROP TABLE`: 删除一个已存在的表。
- `ALTER TABLE`: 修改现有的表结构。
- `CREATE VIEW`: 创建视图。
- `DROP VIEW`: 删除视图。
- `CREATE INDEX`: 创建索引。
- `DROP INDEX`: 删除索引。
**实验任务**
1. **创建“图书借阅”数据库**
```sql
CREATE DATABASE [图书借阅] ON (
NAME = '图书借阅_Data',
FILENAME = 'D:\图书借阅_Data.MDF',
SIZE = 3,
FILEGROWTH = 10%
)
LOG ON (
NAME = '图书借阅_Log',
FILENAME = 'D:\图书借阅_Log.LDF',
SIZE = 1,
FILEGROWTH = 10%
);
GO
```
- **解析**: 该命令用于创建名为“图书借阅”的数据库,包含数据文件和日志文件,并指定了文件的初始大小和增长比例。
2. **创建“图书”表**
```sql
CREATE TABLE 图书 (
书号 varchar(10) NOT NULL,
类别 varchar(10) NOT NULL,
出版社 varchar(20) NULL,
作者 varchar(30) NULL,
书名 varchar(30) NOT NULL,
定价 smallmoney NULL,
借出否 bit NOT NULL,
CONSTRAINT PK_图书 PRIMARY KEY CLUSTERED (书号)
);
GO
```
- **解析**: 此命令用于创建“图书”表,并定义了主键(书号)。
3. **创建“读者”表**
```sql
CREATE TABLE 读者 (
读者编号 varchar(8) NOT NULL,
姓名 varchar(8) NOT NULL,
单位 varchar(20) NOT NULL,
性别 char(2) NULL,
电话 varchar(12) NULL,
CONSTRAINT PK_读者 PRIMARY KEY CLUSTERED (读者编号)
);
GO
```
- **解析**: 创建“读者”表,包括主键(读者编号)。
4. **创建“借阅”表**
```sql
CREATE TABLE 借阅 (
书号 varchar(10) NOT NULL,
读者编号 varchar(8) NOT NULL,
借阅日期 datetime NOT NULL,
归还日期 datetime NULL,
CONSTRAINT PK_借阅 PRIMARY KEY CLUSTERED (书号, 读者编号)
);
GO
```
- **解析**: 创建“借阅”表,并定义复合主键(书号、读者编号)。
通过以上实验内容的学习,初学者可以熟悉SQL Server 2000中DDL命令的基本语法和使用场景,为后续深入学习SQL语言打下坚实的基础。