实验一 #
实验二 #
(1)创建stu数据库 #
(2)在stu数据库中创建学生表S,表结构如表1所示 #
表1 基本表S的结构
| 字段说明 | 数据类型 | 长度 | 是否为空 | 备注 | 字段说明 |
|---|---|---|---|---|---|
| SNO | VARCHAR | 6 | NOT NULL | 主键 | 学号 |
| SNAME | VARCHAR | 20 | NULL | 姓名 | |
| SEX | VARCHAR | 2 | NULL | 性别 | |
| AGE | INT | 4 | NULL | 年龄 | |
| SDEPT | VARCHAR | 20 | NULL | 系别 |
示例
CREATE TABLE S ( SNO VARCHAR(6) NOT NULL PRIMARY KEY, SNAME VARCHAR(20) NULL, SEX VARCHAR(2) NULL, AGE INT(4) NULL, SDEPT VARCHAR(20) NULL );说明:
SNO字段设置为NOT NULL并作为主键- 其他字段均允许为空值(
NULL)- 数据类型和长度按照表结构要求设置
- 表名按照题目要求命名为
S- 该SQL语句在stu数据库中创建学生表S
(3)在stu数据库中创建课程表C,表结构如表2所示 #
表2 基本表C的结构
| 字段名称 | 数据类型 | 长度 | 是否为空 | 备注 | 字段说明 |
|---|---|---|---|---|---|
| CNO | VARCHAR | 8 | NOT NULL | 主键 | 课程号 |
| CNAME | VARCHAR | 20 | NOT NULL | 课程名 | |
| PCNO | VARCHAR | 8 | NULL | 先修课号 | |
| CREDIT | INT | 4 | NULL | 学分 |
示例
CREATE TABLE C ( CNO VARCHAR(8) PRIMARY KEY, CNAME VARCHAR(20) NOT NULL, PCNO VARCHAR(8), CREDIT INT(4) );代码说明:
CNO设置为VARCHAR(8)类型并定义为主键CNAME设置为VARCHAR(20)类型且不允许为空PCNO设置为VARCHAR(8)类型,允许为空(表示可能没有先修课程)CREDIT设置为INT(4)类型,允许为空- 表名按照要求命名为
C
(4)在stu数据库中创建学生选课表SC,表结构如表3所示 #
表3 基本表SC的结构
| 字段名称 | 字段说明 | 数据类型 | 长度 | 是否为空 | 备注 |
|---|---|---|---|---|---|
| CNO | 课程号 | VARCHAR | 8 | NOT NULL | 主键为(SNO, CNO) |
| SNO | 学号 | VARCHAR | 6 | NOT NULL | 主键为(SNO, CNO) |
| GRADE | 成绩 | INT | 4 | NULL |
示例
CREATE TABLE SC ( CNO VARCHAR(8) NOT NULL, SNO VARCHAR(6) NOT NULL, GRADE INT(4) NULL, PRIMARY KEY (SNO, CNO) );或者使用另一种写法:
USE stu; GO CREATE TABLE SC ( CNO VARCHAR(8) NOT NULL, SNO VARCHAR(6) NOT NULL, GRADE INT, CONSTRAINT PK_SC PRIMARY KEY (SNO, CNO) );说明:
USE stu;指定使用stu数据库CNO和SNO都设置为NOT NULL,因为它们是主键的一部分GRADE允许为空(NULL),因为学生可能还没有成绩- 主键由
(SNO, CNO)组合构成,确保每个学生每门课程只能有一条记录- 字段长度按照要求设置:CNO为8位,SNO为6位,GRADE为INT类型(默认4字节)
Go
这行代码是在 SQL Server 数据库中执行以下操作:
第一段:
USE stu; GO
USE stu;:切换到名为stu的数据库GO:批处理命令分隔符,表示前面的语句作为一个批次执行第二段:创建 SC 表 创建一个名为
SC的表(通常表示学生选课关系表),包含以下字段:字段定义:
CNO VARCHAR(8) NOT NULL:课程编号,可变字符类型,最大长度8,不能为空SNO VARCHAR(6) NOT NULL:学号,可变字符类型,最大长度6,不能为空GRADE INT NULL:成绩,整数类型,允许为空主键约束:
PRIMARY KEY (SNO, CNO):将学号和课程编号组合作为复合主键- 这意味着每个学生的每门课程只能有一条记录,确保数据唯一性
这个表结构常用于存储学生选课信息和成绩记录。
(5)修改C表,删除PCNO字段 #
命令行
根据您的要求,删除 C 表中的 PCNO 字段,完整的 SQL 语句如下:
ALTER TABLE C DROP COLUMN PCNO;请注意:
- 数据丢失:执行此操作后,PCNO 列及其所有数据将被永久删除,且无法撤销(除非有备份)。请在执行前确认。
- 语法差异:不同的数据库管理系统(如 MySQL, SQL Server, Oracle, PostgreSQL)语法可能略有不同,但上述标准 SQL 语法在大多数主流数据库中都是通用的。
- 依赖关系:如果数据库中有视图、存储过程或应用程序代码依赖于 PCNO 字段,删除该字段会导致它们出错。请在操作前进行评估。
举例一些常见数据库的特定写法:
- MySQL / PostgreSQL:
ALTER TABLE C DROP COLUMN PCNO;- SQL Server:
ALTER TABLE C DROP COLUMN PCNO;- Oracle:
ALTER TABLE C DROP COLUMN PCNO;总结:最直接和通用的命令就是
ALTER TABLE C DROP COLUMN PCNO;
(6)在C表中添加一个列,列名为TNAME,数据类型为VARCHAR,长度为10,允许为空。 #
命令行
在C表中添加列TNAME的SQL语句如下:
ALTER TABLE C ADD TNAME VARCHAR(10) NULL;或者更完整的写法:
ALTER TABLE C ADD TNAME VARCHAR(10) NULL;说明:
ALTER TABLE C- 修改C表结构ADD TNAME- 添加名为TNAME的列VARCHAR(10)- 数据类型为可变长度字符串,最大长度10个字符NULL- 允许为空值(这是默认设置,可以省略)
(7)修改S表中的SDEPT字段,将其长度改为30 #
示例
ALTER TABLE S ALTER COLUMN SDEPT VARCHAR(30);或者如果使用的是MySQL:
ALTER TABLE S MODIFY SDEPT VARCHAR(30);或者如果使用的是Oracle:
ALTER TABLE S MODIFY SDEPT VARCHAR2(30);请根据你使用的具体数据库系统选择相应的SQL语句。
(8)修改S表,添加CHECK约束。使S表的SEX列的值只能是男或女 #
示例
ALTER TABLE S ADD CONSTRAINT CHK_S_SEX CHECK (SEX IN ('男', '女'));或者也可以写成:
ALTER TABLE S ADD CONSTRAINT CHK_S_SEX CHECK (SEX = '男' OR SEX = '女');这个CHECK约束会确保:
- 插入或更新数据时,SEX列的值只能是’男’或’女'
- 如果尝试插入其他值(如’未知’、‘M’、‘F’等),数据库会拒绝操作并报错
- 约束名为CHK_S_SEX,便于后续管理和维护
(9)修改S表,添加DEFAULT默认值约束。在S表AGE列上创建默认值为18的约束 #
示例
ALTER TABLE S ALTER COLUMN AGE SET DEFAULT 18;或者在某些数据库系统中(如SQL Server):
ALTER TABLE S ADD CONSTRAINT DF_S_AGE DEFAULT 18 FOR AGE;说明:
- 第一种语法是标准SQL语法,适用于大多数数据库系统(MySQL、PostgreSQL等)
- 第二种语法是SQL Server特有的语法
- 这样设置后,当向S表插入新记录时,如果没有指定AGE值,系统会自动将其设置为18
(10)修改SC表,添加FORENIGN KEY约束。使SC表中的SNO参照S表中的SNO属性,CNO参照C表中的CNO属性。 #
示例
在SQL中,为SC表添加外键约束的语句如下:
ALTER TABLE SC ADD CONSTRAINT FK_SC_SNO FOREIGN KEY (SNO) REFERENCES S(SNO); ALTER TABLE SC ADD CONSTRAINT FK_SC_CNO FOREIGN KEY (CNO) REFERENCES C(CNO);说明:
FK_SC_SNO和FK_SC_CNO是外键约束的名称(可自定义)FOREIGN KEY (SNO)指定SC表中的SNO列为外键REFERENCES S(SNO)表示参照S表的主键SNOFOREIGN KEY (CNO)指定SC表中的CNO列为外键REFERENCES C(CNO)表示参照C表的主键CNO注意事项:
- 被参照的表S和C必须已存在
- 被参照的列SNO和CNO必须是各自表的主键或具有唯一约束
- 添加约束前,SC表中现有的数据必须满足参照完整性要求
(11)删除已将建立的 S 表、C 表、SC 表。 #
示例
DROP TABLE SC; DROP TABLE S; DROP TABLE C;说明:
- 由于 SC 表可能包含外键约束引用 S 表和 C 表,建议先删除 SC 表
- 然后依次删除 S 表和 C 表
- 如果表之间有外键约束,也可以使用
CASCADE选项级联删除:DROP TABLE SC CASCADE; DROP TABLE S CASCADE; DROP TABLE C CASCADE;
(12)创建S表,C表,SC表,并在创建的同时定义各表的主键,各表之间的参照完整性约束,使S表的sex列的默认值为男,定义CHECK约束,使SEX属性列的值只能取男或女,使SC表中的grade值限定在[0,100]之间。 #
示例
```sql -- 创建S表 CREATE TABLE S ( SNO VARCHAR(6) PRIMARY KEY, SNAME VARCHAR(20), SEX VARCHAR(2) DEFAULT '男' CHECK (SEX IN ('男', '女')), AGE INT(4), SDEPT VARCHAR(20) ); -- 创建C表 CREATE TABLE C ( CNO VARCHAR(8) PRIMARY KEY, CNAME VARCHAR(20) NOT NULL, PCNO VARCHAR(8), CREDIT INT(4) ); -- 创建SC表 CREATE TABLE SC ( SNO VARCHAR(6), CNO VARCHAR(8), GRADE INT(4) CHECK (GRADE BETWEEN 0 AND 100), PRIMARY KEY (SNO, CNO), FOREIGN KEY (SNO) REFERENCES S(SNO), FOREIGN KEY (CNO) REFERENCES C(CNO) ); ``` **代码说明:** 1. **S表**: - 定义`SNO`为主键 - `SEX`字段设置默认值为'男' - 使用`CHECK`约束限制`SEX`只能取'男'或'女' 2. **C表**: - 定义`CNO`为主键 - `CNAME`设置为`NOT NULL` 3. **SC表**: - 定义复合主键`(SNO, CNO)` - 使用`CHECK`约束限制`GRADE`在0-100之间 - 建立外键约束: - `SNO`参照`S`表的`SNO` - `CNO`参照`C`表的`CNO` 这样就完整实现了题目要求的所有约束条件。
表1 基本表S的结构:
| 字段说明 | 数据类型 | 长度 | 是否为空 | 备注 | 字段说明 |
|---|---|---|---|---|---|
| SNO | VARCHAR | 6 | NOT NULL | 主键 | 学号 |
| SNAME | VARCHAR | 20 | NULL | 姓名 | |
| SEX | VARCHAR | 2 | NULL | 性别 | |
| AGE | INT | 4 | NULL | 年龄 | |
| SDEPT | VARCHAR | 20 | NULL | 系别 |
表2 基本表C的结构:
| 字段名称 | 数据类型 | 长度 | 是否为空 | 备注 | 字段说明 |
|---|---|---|---|---|---|
| CNO | VARCHAR | 8 | NOT NULL | 主键 | 课程号 |
| CNAME | VARCHAR | 20 | NOT NULL | 课程名 | |
| PCNO | VARCHAR | 8 | NULL | 先修课号 | |
| CREDIT | INT | 4 | NULL | 学分 |
表3 基本表SC的结构:
| 字段名称 | 字段说明 | 数据类型 | 长度 | 是否为空 | 备注 |
|---|---|---|---|---|---|
| CNO | 课程号 | VARCHAR | 8 | NOT NULL | 主键为(SNO, CNO) |
| SNO | 学号 | VARCHAR | 6 | NOT NULL | 主键为(SNO, CNO) |
| GRADE | 成绩 | INT | 4 | NULL |
(13)在S,C,SC表中插入分别插入表4-6中的数据,注意数据的参照完整性 #
示例
在向 S、C、SC 三个表中插入数据时,需要确保数据的参照完整性,即 SC 表中的 Sno 和 Cno 必须分别存在于 S 表和 C 表中。以下是插入数据的 SQL 语句:
1. 向 S 表插入数据
INSERT INTO S (SNO, SNAME, AGE, SEX, SDEPT) VALUES ('S1', '王芳', 20, '女', '数学'), ('S2', '李莉', 19, '女', '计算机'), ('S3', '王华', 22, '男', '管理'), ('S4', '王明', 19, '男', '数学'), ('S5', '宋江', 21, '男', '管理'), ('S6', '曹操', 18, '男', '计算机');2. 向 C 表插入数据
INSERT INTO C (CNO, CNAME, PCNO, CREDIT) VALUES ('C2', '数学', 4, '2'), ('C4', '程序设计', 3, '2'), ('C3', '数据库', 4, '2'), ('C1', '操作系统', 4, '2'), ('C5', 'C语言', 4, '2');3. 向 SC 表插入数据
INSERT INTO SC (SNO, CNO, GRADE) VALUES ('S1', 'C1', 80), ('S2', 'C1', 85), ('S3', 'C1', 90), ('S4', 'C1', 75), ('S5', 'C1', 70), ('S6', 'C1', 90), ('S1', 'C2', 70), ('S3', 'C2', 85), ('S4', 'C2', 60), ('S1', 'C3', 85), ('S3', 'C3', 95), ('S5', 'C3', 80), ('S6', 'C3', 90), ('S1', 'C4', 90), ('S4', 'C4', 70), ('S1', 'C5', 70), ('S5', 'C5', 65);注意:
- 表 6 中
NULL表示该学生未选修该课程,因此在 SC 表中不插入对应记录。- 插入顺序很重要:必须先插入 S 表和 C 表的数据,再插入 SC 表的数据,以确保参照完整性。
- 如果数据库设置了外键约束,违反参照完整性的插入操作会被自动拒绝。
表4 基本表 S的数据:
| S1 | 王芳 | 20 | 女 | 数学 |
| S2 | 李莉 | 19 | 女 | 计算机 |
| S3 | 王华 | 22 | 男 | 管理 |
| S4 | 王明 | 19 | 男 | 数学 |
| S5 | 宋江 | 21 | 男 | 管理 |
| S6 | 曹操 | 18 | 男 | 计算机 |
表 5 基本表 C的数据:
| C2 | 数学 | 4 | 刘明 |
| C4 | 程序设计 | 3 | 吴一 |
| C3 | 数据库 | 4 | 李方华 |
| C1 | 操作系统 | 4 | 刘备 |
| C5 | C语言 | 4 | 张飞 |
表 6 基本表 SC的数据:
| Cno/Sno | S1 | S2 | S3 | S4 | S5 | S6 |
|---|---|---|---|---|---|---|
| C1 | 80 | 85 | 90 | 75 | 70 | 90 |
| C2 | 70 | NULL | 85 | 60 | NULL | NULL |
| C3 | 85 | NULL | 95 | NULL | 80 | 90 |
| C4 | 90 | NULL | NULL | 70 | NULL | NULL |
| C5 | 70 | NULL | NULL | NULL | 65 | NULL |
(14)将stu数据库更名为STUDENT。 #
mysql -u root -p -e “RENAME TABLE stu.table1 TO STUDENT.table1;” EXEC sp_renamedb ‘stu’, ‘STUDENT’; 退出数据库 命令行 查看数据库 stu
示例
在MySQL中,可以使用以下语句将数据库
stu重命名为STUDENT:ALTER DATABASE stu MODIFY NAME = STUDENT;或者在某些数据库管理系统中(如SQL Server),也可以使用:
ALTER DATABASE stu MODIFY NAME = STUDENT;注意:
- 执行此操作需要相应的权限
- 在重命名数据库之前,请确保没有用户正在连接该数据库
- 不同数据库管理系统可能有不同的语法,请根据实际使用的数据库类型调整
如果使用的是MySQL 5.1.7及以上版本,还可以使用:
RENAME DATABASE stu TO STUDENT;但请注意,某些MySQL版本出于安全考虑可能已禁用此功能。建议先备份数据再执行此类操作。
4.实验代码和结果截图 (1)创建stu数据库。 …… 5. 实验总结/心得