实验二 交互式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;  

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

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

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

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

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

  1. 对表S,按学号升序建唯一索引(索引名为sno);
-- 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;

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

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

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

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

  1. 删除S表
drop table S;

  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_snoFOREIGN KEY(SNO) REFERENCES S(SNO),CONSTRAINT fk_pnoFOREIGN KEY(PNO) REFERENCES P(PNO),CONSTRAINT fk_jnoFOREIGN 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!

检查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'

插入数据

  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,'上海');

[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_snoFOREIGN KEY(SNO) REFERENCES S(SNO),CONSTRAINT fk_pnoFOREIGN KEY(PNO) REFERENCES P(PNO),CONSTRAINT fk_jnoFOREIGN 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
);

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'
WHEREname = '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;

数据库系统实验二作业-SQL实验报告相关推荐

  1. 江南大学物联网工程学院数据库课程实验二作业2实验报告

    一.开发环境 DBMS: Microsoft SQL Server 2019 (64- bit) 可视化管理工具: Microsoft SQL Server Management Studio- 18 ...

  2. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  3. 【数据库实验课堂】实验二 使用SQL Server管理数据表

    实验二 使用SQL Server管理数据表: 1.请在指定数据库内完成以下内容: 1) 依据数据表的结构创建相对应的数据表,表结构如下所示: **学生信息表(student)**字段名称 字段类型及长 ...

  4. 20172310《程序设计与数据结构》(下)实验二:二叉树实验报告

    20172310<程序设计与数据结构>(下)实验二:二叉树实验报告 报告封面 课程:<软件结构与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王 ...

  5. java 二叉树实验报告_20172310《程序设计与数据结构》(下)实验二:二叉树实验报告...

    20172310<程序设计与数据结构>(下)实验二:二叉树实验报告 报告封面 课程:<软件结构与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王 ...

  6. matlab建立二阶开环系统仿真图,实验二 Simulink仿真实验

    实验二 Simulink仿真实验 一. 实验目的: 1.学会使用Matlab软件中的Simulink仿真工具. 2.了解二阶系统瞬态响应指标的意义其计算. 二. 实验内容及原理 1. 用Matlab仿 ...

  7. 【通信原理】实验二 角度调制实验

    目录 实验二 角度调制实验 一.实验目的 二.实验原理: 1.角度调制 (1)角度调制 (1)频率调制(FM): (2)相位调制(PM) (3)单音调制FM与PM (4)非相干解调 2.MATLAB中 ...

  8. CSAPP实验二——bomb lab实验

    CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...

  9. 计算机图形学——实验二 几何图形变换实验

    实验二 几何图形变换实验 一.实验目的和要求 进一步掌握二维.三维变换的数学知识.变换原理.变换种类.变换方法: 利用OpenGL实现二维.三维图形变换,在屏幕上显示变换过程或变换结果: 掌握Open ...

最新文章

  1. Keras训练神经网络进行分类并使用GridSearchCV进行参数寻优
  2. MySQL 高级 - 索引 - 索引分类
  3. python数据可视化的特点_Python数据可视化, 看这一篇就够了
  4. Initializer provides no value for this binding element and the binding element has no default value
  5. zabbix网络发现主机
  6. 【TensorFlow】TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型
  7. 用Python爬数据,FineBI做分析后,我发现淘宝的手机原来这么便宜
  8. UVA 10391 STL容器的使用
  9. Chapter 1 First Sight——37
  10. mac搜索不到wifi wtg_如何设置隐藏wifi 防止蹭网隐藏wifi方法【详解】
  11. java番茄钟_番茄时间管理 - java Swing版
  12. 利用IE登陆windows 2003 的终端服务器
  13. 《西游记》《封神榜》各路神仙基本层次图,不要再傻傻分不清楚了
  14. Julia·Pluto·Plots报错解决方法
  15. 微信只允许二级分销,否则封停账号,三级分销何去何从?
  16. Python实战项目:俄罗斯方块(源码分享)(文章较短,直接上代码)
  17. 时间函数millis( )
  18. 《高难度谈话》你需要知道的高效沟通技巧
  19. 期货模拟盘有效果吗?
  20. jpush android 离线推送,JPush极光推送3分钟搞定Android Push

热门文章

  1. java管理系统中期报告_基于Java的图书馆管理系统的设计-中期报告
  2. Nokia Open MSS 学习个人笔记
  3. Linux安装与卸载Nginx
  4. Mac 系统下VisualVM的安装
  5. JavaScript ES5-ES6详解
  6. MD5算法的编程实现
  7. 家中联通光纤宽带200MB,测试速度才92.87mbps,需要换个猫吗?
  8. hahaha终于注册了一个博客
  9. SQL 语句多表联查
  10. GPRS模块 测试项目