数据库系统实验二作业-SQL实验报告

实验二 交互式SQL 1(DDL语言实践)

1 实验目的

a) ****熟悉数据库的交互式SQL工具****。如:MySQL 查询分析器。

b) *掌握SQL语言的DDL子语言,在MySQL环境下实现表的定义、删除与修改,掌握索引的建立与删除方法。*

c) *掌握SQL语言的DDL子语言,在MySQL环境下实现表的定义中主键、外键、唯一值、检查、非空和默认值等列级或表级完整性约束条件* *的使用。*

2 实验内容及要求

a) 在MySQL中建立一个数据库,进行实验所要求的各种操作,所有的SQL操作均在此建立的新库里进行。

b) 根据以下实验内容的要求认真填写实验报告,记录所有的实验用例。

(1) *设有如下关系表S:*

****S(NO, NAME, SEX, AGE, CLASS)****,主关键字是NO。

其中NO为学号,char(2),学号不能为空,值是唯一的;

NAME为姓名,char(10),姓名的取值也唯一;

SEX为性别,char(2);

AGE为年龄,int;

CLASS为班号,char(5)。

写出实现下列功能的SQL语句。

TEST

  1. 创建数据库test,在test中创建表S;
  • db
CREATE DATABASE test;  

image-20200404165421032

  • table
CREATE TABLE S(
	NO varchar(2) NOT NULL UNIQUE,
	NAME varchar(10) NOT NULL UNIQUE,
    SEX varchar(2),
    AGE int,
    CLASS varchar(5));

数据库系统实验二作业-SQL实验报告_第1张图片

唯一性约束UNIQUE;注意和主键约束区别开!

  1. 插入一个记录(25,“李明”,“男”,21,“95031”);
    再插入一个记录(10,“王丽”,“女”,20,“95101”);
INSERT INTO S(NO,NAME,SEX,AGE,CLASS) 
VALUES 
('25','李明','男',21,'95031'),
('10','王丽','女',20,'95101');

数据库系统实验二作业-SQL实验报告_第2张图片

注意语句中的符号不能出现中文的!

  1. 插入“95031”班学号为30,姓名为“郑和”的学生记录;
-- 假设郑和同学为男性,且为18岁。
INSERT INTO S(NO,NAME,SEX,AGE,CLASS) 
VALUES 
('30','郑和','男',18,'95031');

数据库系统实验二作业-SQL实验报告_第3张图片

  1. 对表S,按学号升序建唯一索引(索引名为sno);
-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])

CREATE INDEX sno ON S (NO  ASC );
SHOW INDEX FROM S FROM test;

image-20200404180303245

对表S,按年龄降序建索引(索引名为sage);

-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
CREATE INDEX sage ON S (AGE  DESC );
SHOW INDEX FROM S FROM test;

image-20200404180325465

  1. 向S表添加“入学时间(comedate)”列,其数据类型为日期型(datetime)
alter table S add comedate datetime after CLASS;

数据库系统实验二作业-SQL实验报告_第4张图片

  1. 删除S表的sage索引;
DROP INDEX sage ON S;

数据库系统实验二作业-SQL实验报告_第5张图片

  1. 将年龄的数据类型改为smallint;
alter table S modify column AGE smallint;

数据库系统实验二作业-SQL实验报告_第6张图片

  1. 删除学生姓名必须取唯一值的约束;(注意:MySQL与标准SQL语言有区别)
DROP INDEX NAME ON S;
-- 或ALTER TABLE语法:
-- ALTER TABLE S DROP INDEX NAME;

数据库系统实验二作业-SQL实验报告_第7张图片

  1. 删除S表
drop table S;

数据库系统实验二作业-SQL实验报告_第8张图片

  1. 错误操作示例

a.主键不能为空,当插入记录的主键值为空时报错,如图1-1所示;

b.主键不能重复,必须唯一,当插入的主键值与已存在的主键值相同时报错,如图1-2所示;

c.采用UNIQUE约束的NAME字段必须唯一,当发生重复时会报错,如图1-3所示。

db_SPJ

(2)** *创建数据库db_SPJ*

  1. 确保当前操作的数据库为db_SPJ

  2. 在db_SPJ中创建以下四个关系(表)

*供应商表S(********SNO********,SNAME,STATUS,CITY)*

*零件表P(********PNO********,PNAME,COLOR,WEIGHT)*

*工程项目表J(********JNO********,JNAME,CITY)*

*供应情况表SPJ(********S NO,PNO,JNO********,QTY)*

² 每一张表都必须有主键

² 需要使用外键的表必须使用外键

² 根据需要适当采用唯一值、检查、非空和默认值约束。要求这四种约束在S、P和J表这三张表中至少使用一次

² 根据主键、外键、唯一值、检查、非空和默认值六种约束的特性,设计适当的方案对S、P和J表中的这六种约束进行检验。方案自定。一种约束进行检验一次即可。

– S表示供应商:各属性依次为供应商号(主键),供应商名,供应商状态值(用bool变量表示,1表示供应,0表示不供应),供应商所在城市;

– P表示零件,各属性依次为零件号,零件名,零件颜色,零件重量,零件存放的城市;
– J表示工程,各属性依次为工程号,工程名字,工程所在城市;
– SPJ表示供货关系,各属性依次为供应商号,零件号,工程号,供货数量。

*供应商表S(********SNO********,SNAME,STATUS,CITY)*

*零件表P(********PNO********,PNAME,COLOR,WEIGHT)*

*工程项目表J(********JNO********,JNAME,CITY)*

*供应情况表SPJ(********S NO,PNO,JNO********,QTY)*

DDL:

create database db_spj;

-- 创建表S,SNO字段采用PRIMARY KEY和UNIQUE约束,STATUS字段采用NOTNULL约束;
create table S(
    SNO char(20) UNIQUE,-- 唯一值约束
    SNAME char(20),
    `STATUS` smallint NOT NULL, -- 非空约束
    CITY char(20),
    primary key(SNO)
);

-- 创建表P
create table P(
    PNO char(20),
    PNAME char(100),
    COLOR char(20),
    WEIGHT smallint,
    primary key(PNO)
);

-- 创建表J,JNAME字段采用DEFAULT约束,DEFAULT默认值为“unknow_JobName”;
create table J(
    JNO char(20),
    JNAME char(100) DEFAULT "unknow_JobName", -- 默认值约束
    CITY char(20),
    primary key(JNO)
);

-- 创建表SPJ,SNO、PNO和JNO字段采用主键和外键约束;
create table SPJ(
    SNO char(20),
    PNO char(20),
    JNO char(20),
    QTY int CHECK(QTY>=0),-- 检查约束
    primary key(SNO,PNO,JNO),
    CONSTRAINT fk_sno
    FOREIGN KEY(SNO) REFERENCES S(SNO),
    CONSTRAINT fk_pno
    FOREIGN KEY(PNO) REFERENCES P(PNO),
    CONSTRAINT fk_jno
    FOREIGN KEY(JNO) REFERENCES J(JNO)
);

数据库系统实验二作业-SQL实验报告_第9张图片

检查主键唯一约束

-- **主键、外键、唯一值、检查、非空和默认值六种约束的特性**

-- primary key
insert into j values ('J1','三建','北京'),('J1','三建','深圳');
-- failed!
insert into j values ('J1','三建','北京');
-- sucessful!

数据库系统实验二作业-SQL实验报告_第10张图片

检查主键不能为空约束

-- **主键、外键、唯一值、检查、非空和默认值六种约束的特性**
-- primary key
insert into j values (NULL,'三建','北京');
-- failed!
insert into j values ('J10','三建','北京');
-- sucessful!

image-20200404210055477

-- foreign key
-- preparing..
insert into j values ('J1','三建','北京');
insert into s values ('S1','精益',20,'天津');
insert into p values ('P1','螺母','红',12);
-- check
insert into spj values ('S2','P1','J1',200);
-- failed!
insert into spj values ('S1','P1','J1',200);
-- sucessful!

数据库系统实验二作业-SQL实验报告_第11张图片

检查UNIQUE约束

表S中的SNO字段采用了UNIQUE约束,因此SNO的值必须唯一,当发生重复时报错;

-- 唯一值
insert into s values ('S1','精益',20,'深圳'); -- sno重复了
-- failed!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z7TyRU6T-1586007338963)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200404195052481.png)]

-- 非空
insert into s values ('S1','精益',NULL,'深圳'); -- NOTNULL!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFSUMVaY-1586007338964)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200404195211653.png)]

检查DEFAULT约束

表J中的JNAME字段采用了DEFAULT约束,默认值为“unknow_JobName”,若插入时采用默认值,JNAME字段会自动填入默认值“unknow_JobName”,

-- 默认值
insert into j(JNO,CITY) values ('Jt','深圳');
SELECT * FROM J;
-- we can see that the column of the new data is set to the default value 'unknow_JobName'

数据库系统实验二作业-SQL实验报告_第12张图片

插入数据

  1. 插入以下记录

[1] 供应商表S

*sno* *sname* *status* *city*
S1 精益 20 天津
S2 盛锡 10 北京
S3 东方红 30 北京
S4 丰泰 20 天津
S5 为民 30 上海
insert into s values
('S1','精益',20,'天津'),
('S2','盛锡',10,'北京'),
('S3','东方红',30,'北京'),
('S4','丰泰',20,'天津'),
('S5','为民',30,'上海');

数据库系统实验二作业-SQL实验报告_第13张图片

[2] 零件表P

*pno* *pname* *color* *weight*
P1 螺母 12
P2 螺栓 绿 17
P3 螺丝刀 14
P4 螺丝刀 14
P5 凸轮 40
P6 齿轮 30
insert into p values
('P1','螺母','红',12),
('P2','螺栓','绿',17),
('P3','螺丝刀','蓝',14),
('P4','螺丝刀','红',14),
('P5','凸轮','蓝',40),
('P6','齿轮','红',30);

数据库系统实验二作业-SQL实验报告_第14张图片

[3] 工程项目表J

*jno* *jname* *city*
J1 三建 北京
J2 一汽 长春
J3 弹簧厂 天津
J4 造船厂 天津
J5 机车厂 唐山
J6 无线电厂 常州
J7 半导体厂 南京
insert into j values
('J1','三建','北京'),
('J2','一汽','长春'),
('J3','弹簧厂','天津'),
('J4','造船厂','天津'),
('J5','机车厂','唐山'),
('J6','无线电厂','常州'),
('J7','半导体厂','南京');




数据库系统实验二作业-SQL实验报告_第15张图片

[4] 供应情况表SPJ

*sno* *pno* *jno* *qty*
S1 P1 J1 200
S1 P1 J3 100
S1 P1 J4 700
S1 P2 J2 100
S2 P3 J1 400
S2 P3 J2 200
S2 P3 J4 500
S2 P3 J5 400
S2 P5 J1 400
S2 P5 J2 100
S3 P1 J1 200
S3 P3 J1 200
S4 P5 J1 100
S4 P6 J1 100
S4 P6 J4 200
S5 P2 J4 100
S5 P3 J1 200
S5 P6 J2 200
S5 P6 J4 500
insert into spj values
('S1','P1','J1',200),
('S1','P1','J3',100),
('S1','P1','J4',700),
('S1','P2','J2',100),
('S2','P3','J1',400),
('S2','P3','J2',200),
('S2','P3','J4',500),
('S2','P3','J5',400),
('S2','P5','J1',400),
('S2','P5','J2',100),
('S3','P1','J1',200),
('S3','P3','J1',200),
('S4','P5','J1',100),
('S4','P6','J1',100),
('S4','P5','J4',200),
('S5','P2','J4',100),
('S5','P3','J1',200),
('S5','P6','J2',200),
('S5','P6','J4',500);



数据库系统实验二作业-SQL实验报告_第16张图片

汇总

-- all
create database db_spj;
use db_spj;

create table S(
    SNO char(2) UNIQUE, -- 唯一约束
    SNAME char(20),
    `STATUS` smallint NOT NULL, -- 非空约束
    CITY char(20),
    primary key(SNO)
);


create table P(
    PNO char(2),
    PNAME char(100),
    COLOR char(20),
    WEIGHT smallint,
    primary key(PNO)
);

create table J(
    JNO char(2),
    JNAME char(100) DEFAULT "unknow_JobName", -- 默认值约束
    CITY char(20),
    primary key(JNO)
);

create table SPJ(
    SNO char(2),
    PNO char(2),
    JNO char(2),
    QTY int CHECK(QTY>=0),-- 检查约束
    primary key(SNO,PNO,JNO),
    CONSTRAINT fk_sno
    FOREIGN KEY(SNO) REFERENCES S(SNO),
    CONSTRAINT fk_pno
    FOREIGN KEY(PNO) REFERENCES P(PNO),
    CONSTRAINT fk_jno
    FOREIGN KEY(JNO) REFERENCES J(JNO)
);

insert into s values
('S1','精益',20,'天津'),
('S2','盛锡',10,'北京'),
('S3','东方红',30,'北京'),
('S4','丰泰',20,'天津'),
('S5','为民',30,'上海');


insert into p values
('P1','螺母','红',12),
('P2','螺栓','绿',17),
('P3','螺丝刀','蓝',14),
('P4','螺丝刀','红',14),
('P5','凸轮','蓝',40),
('P6','齿轮','红',30);

insert into j values
('J1','三建','北京'),
('J2','一汽','长春'),
('J3','弹簧厂','天津'),
('J4','造船厂','天津'),
('J5','机车厂','唐山'),
('J6','无线电厂','常州'),
('J7','半导体厂','南京');

insert into spj values
('S1','P1','J1',200),
('S1','P1','J3',100),
('S1','P1','J4',700),
('S1','P2','J2',100),
('S2','P3','J1',400),
('S2','P3','J2',200),
('S2','P3','J4',500),
('S2','P3','J5',400),
('S2','P5','J1',400),
('S2','P5','J2',100),
('S3','P1','J1',200),
('S3','P3','J1',200),
('S4','P5','J1',100),
('S4','P6','J1',100),
('S4','P5','J4',200),
('S5','P2','J4',100),
('S5','P3','J1',200),
('S5','P6','J2',200),
('S5','P6','J4',500);

导出

  1. 导出所有的数据(供下一实验用)
mysqldump -hlocalhost -uroot -pmypassword db_spj > D:\vs_code\db_spj.sql
  1. 约束检查示例

a) 创建表S,SNO字段采用PRIMARY KEY和NOT NULL约束,SNAME字段采用UNIQUE约束;

b) 创建表P,WEIGHT字段采用CHECK约束,CHECK条件为WEIGHT>0;

c) 创建表J,JNAME字段采用DEFAULT约束,DEFAULT默认值为“工厂”;

d) 创建表SPJ,SNO、PNO和JNO字段采用主键和外键约束;

e) 检查主键唯一约束;

f) 检查主键不能为空约束;

g) 检查UNIQUE约束,表S中的SNAME字段采用了UNIQUE约束,因此SNAME的值必须唯一,当发生重复时报错;

h) 检查DEFAULT约束,表J中的JNAME字段采用了DEFAULT约束,默认值为“工厂”,若插入时采用默认值,JNAME字段会自动填入默认值“工厂”,

i) 检查外键级联操作CASCADE,当表P中主键“P2”更新为“P200”时,SPJ表中相应位置的外键“P2”同时更新为“P200”;

j) 检查外键级联操作NO ACTION,当被参照表中发生删除或更新时将会报错;

k) 检查外键级联操作SET DEFAULT,此时外键必须事先设定默认值,表SPJ中将SNO默认值设为“S1”,PNO默认值设为“P1”,JNO默认值设为“J1”,当被参照表S中“S2”所在行被删除后,SPJ表中对应的“S2”更新为默认值“S1”;

3 实验提示:

a) 学会使用 MySQL的联机丛书。

b) 查看具体表的信息可使用如下SQL命令:exec sp_help <表名>;

4 考核内容

对照以下考核点,完成以下内容:

a) 确定自己熟练掌握之后联系助教进行考核,助教将从考核点中随机抽取4个,考核分数将登记在册,分值占比80%。

b) 完成《实验报告》,对所有的考核点进行操作说明(对应的SQL语句/操作、输出截图),分值占比20%。

考核点 分值
1、创建一个临时表test,包含至少4个不同类型的属性,并指定主码 20
2、修改test表中一个已有属性为另一类型 20
3、修改test表,插入一个新的列“new_attr”,数据类型为日期型 20
4、向test表中插入2条数据 20
5、更新test表中某一行数据 20
6、按test表中某一属性升序建立索引 20
7、删除test表任一索引 20
8、删除test表中所有数据(但保留表) 20
9、删除test表 20

解答:

1、创建一个临时表test,包含至少4个不同类型的属性,并指定主码

create TABLE test(
	id int primary key,
    name char(20),
    time datetime,
    weight smallint
);

数据库系统实验二作业-SQL实验报告_第17张图片

2,修改test表中一个已有属性为另一类型

alter table test modify column id varchar(20);

数据库系统实验二作业-SQL实验报告_第18张图片

3.修改test表,插入一个新的列“new_attr”,数据类型为日期型 20

alter table test add column new_attr datetime;

数据库系统实验二作业-SQL实验报告_第19张图片

4、向test表中插入2条数据 20

insert into test values
('s1','xiaoming','1999-09-10',140,'2099-09-10'),
('s2','xiaohuang','1998-09-10',125,'2098-09-10');

数据库系统实验二作业-SQL实验报告_第20张图片

5、更新test表中某一行数据 20

UPDATE test 
SET 
    weight = '150'
WHERE
    name = 'xiaoming';

数据库系统实验二作业-SQL实验报告_第21张图片

6、按test表中某一属性升序建立索引 20

-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
CREATE INDEX weight_index ON test (weight  DESC );
SHOW INDEX FROM test;

数据库系统实验二作业-SQL实验报告_第22张图片

7、删除test表任一索引 20

DROP INDEX weight_index ON test;

数据库系统实验二作业-SQL实验报告_第23张图片

8、删除test表中所有数据(但保留表) 20

truncate test;
select * from test;

数据库系统实验二作业-SQL实验报告_第24张图片

9、删除test表 20

drop table test;
show tables;

数据库系统实验二作业-SQL实验报告_第25张图片

你可能感兴趣的:(数据库)