a) ****熟悉数据库的交互式SQL工具****。如:MySQL 查询分析器。
b) *掌握SQL语言的DDL子语言,在MySQL环境下实现表的定义、删除与修改,掌握索引的建立与删除方法。*
c) *掌握SQL语言的DDL子语言,在MySQL环境下实现表的定义中主键、外键、唯一值、检查、非空和默认值等列级或表级完整性约束条件* *的使用。*
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语句。
CREATE DATABASE test;
CREATE TABLE S(
NO varchar(2) NOT NULL UNIQUE,
NAME varchar(10) NOT NULL UNIQUE,
SEX varchar(2),
AGE int,
CLASS varchar(5));
唯一性约束UNIQUE;注意和主键约束区别开!
INSERT INTO S(NO,NAME,SEX,AGE,CLASS)
VALUES
('25','李明','男',21,'95031'),
('10','王丽','女',20,'95101');
注意语句中的符号不能出现中文的!
-- 假设郑和同学为男性,且为18岁。
INSERT INTO S(NO,NAME,SEX,AGE,CLASS)
VALUES
('30','郑和','男',18,'95031');
-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
CREATE INDEX sno ON S (NO ASC );
SHOW INDEX FROM S FROM test;
对表S,按年龄降序建索引(索引名为sage);
-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
CREATE INDEX sage ON S (AGE DESC );
SHOW INDEX FROM S FROM test;
alter table S add comedate datetime after CLASS;
DROP INDEX sage ON S;
alter table S modify column AGE smallint;
DROP INDEX NAME ON S;
-- 或ALTER TABLE语法:
-- ALTER TABLE S DROP INDEX NAME;
drop table S;
a.主键不能为空,当插入记录的主键值为空时报错,如图1-1所示;
b.主键不能重复,必须唯一,当插入的主键值与已存在的主键值相同时报错,如图1-2所示;
c.采用UNIQUE约束的NAME字段必须唯一,当发生重复时会报错,如图1-3所示。
(2)** *创建数据库db_SPJ*
确保当前操作的数据库为db_SPJ
在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)*
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)
);
-- **主键、外键、唯一值、检查、非空和默认值六种约束的特性**
-- primary key
insert into j values ('J1','三建','北京'),('J1','三建','深圳');
-- failed!
insert into j values ('J1','三建','北京');
-- sucessful!
-- **主键、外键、唯一值、检查、非空和默认值六种约束的特性**
-- primary key
insert into j values (NULL,'三建','北京');
-- failed!
insert into j values ('J10','三建','北京');
-- sucessful!
-- 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!
表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)]
表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'
[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,'上海');
[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);
[3] 工程项目表J
*jno* | *jname* | *city* |
---|---|---|
J1 | 三建 | 北京 |
J2 | 一汽 | 长春 |
J3 | 弹簧厂 | 天津 |
J4 | 造船厂 | 天津 |
J5 | 机车厂 | 唐山 |
J6 | 无线电厂 | 常州 |
J7 | 半导体厂 | 南京 |
insert into j values
('J1','三建','北京'),
('J2','一汽','长春'),
('J3','弹簧厂','天津'),
('J4','造船厂','天津'),
('J5','机车厂','唐山'),
('J6','无线电厂','常州'),
('J7','半导体厂','南京');
[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);
-- 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);
mysqldump -hlocalhost -uroot -pmypassword db_spj > D:\vs_code\db_spj.sql
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”;
a) 学会使用 MySQL的联机丛书。
b) 查看具体表的信息可使用如下SQL命令:exec sp_help <表名>;
对照以下考核点,完成以下内容:
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
);
2,修改test表中一个已有属性为另一类型
alter table test modify column id varchar(20);
3.修改test表,插入一个新的列“new_attr”,数据类型为日期型 20
alter table test add column new_attr datetime;
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');
5、更新test表中某一行数据 20
UPDATE test
SET
weight = '150'
WHERE
name = 'xiaoming';
6、按test表中某一属性升序建立索引 20
-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
CREATE INDEX weight_index ON test (weight DESC );
SHOW INDEX FROM test;
7、删除test表任一索引 20
DROP INDEX weight_index ON test;
8、删除test表中所有数据(但保留表) 20
truncate test;
select * from test;
9、删除test表 20
drop table test;
show tables;