《数据库系统概论》课程之实验二:交互式SQL
《数据库系统概论》课程之实验二:交互式SQL
实验目的
1.熟悉数据库的交互式SQL工具。
2.熟悉通过SQL对数据库进行操作。
3.完成作业的上机练习。
实验工具 MySQL
利用MySQL及其图形化界面工具Navicat来熟悉SQL。
实验流程
1. 建立数据库
在MySQL中建立一个数据库,进行实验所要求的各种操作,所有的SQL操作均在此建立的新库里进行。
第4题
用SQL语句建立第2章习题6中的4个表;针对建立的4个表用SQL语言完成第2章习题6中的查询。
建表并添加数据
运行以下SQL语句:
1 |
|
结果
供应商表S:
零件表P:
工程项目表J:
供应情况表SPJ:
查询
求供应工程J1零件的供应商号码SNO:
SQL:
1
SELECT DISTINCT SNO FROM SPJ WHERE JNO='J1';
结果:
求供应工程J1零件P1的供应商号码SNO:
SQL:
1
SELECT DISTINCT SNO FROM SPJ WHERE JNO='J1' AND PNO='P1';
结果:
求供应工程J1零件为红色的供应商号码SNO:
SQL:
1
2SELECT DISTINCT SNO FROM SPJ WHERE JNO='J1' AND PNO IN
(SELECT DISTINCT PNO FROM P WHERE COLOR='红');结果:
求没有使用天津供应商生产的红色零件的工程号JNO:
SQL:
1
2
3
4
5
6SELECT DISTINCT JNO FROM J WHERE JNO NOT IN
(SELECT JNO FROM SPJ,P,S WHERE
S.CITY='天津' AND
P.COLOR='红' AND
S.SNO=SPJ.SNO AND
P.PNO=SPJ.PNO);结果:
求至少用了供应商S1所供应的全部零件的工程号JNO:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12SELECT DISTINCT JNO
FROM SPJ SPJX
WHERE NOT EXISTS -- 不存在情况:
(SELECT *
FROM SPJ SPJY
WHERE SNO='S1'
AND NOT EXISTS -- S1提供的零件没有被该工程使用
(SELECT *
FROM SPJ SPJZ
WHERE SPJZ.PNO=SPJY.PNO -- 确定S1的零件名
AND SNO='S1' -- 确定零件是S1提供的
AND SPJZ.JNO=SPJX.JNO)); -- 确定工程结果:
第5题
针对习题4中的4个表试用SQL语言完成以下各项操作:
找出所有供应商的姓名和所在城市:
SQL:
1
SELECT DISTINCT SNAME,CITY FROM S;
结果:
找出所有零件的名称、颜色、重量;
SQL:
1
SELECT DISTINCT PNAME,COLOR,WEIGHT FROM P;
结果:
找出使用供应商S1所供应零件的工程号码:
SQL:
1
SELECT DISTINCT JNO FROM SPJ WHERE SNO='S1';
结果:
找出工程项目J2使用的各种零件的名称及其数量:
SQL:
1
2SELECT DISTINCT PNAME,QTY FROM P,SPJ WHERE
SPJ.JNO='J2' AND P.PNO=SPJ.PNO;结果:
找出上海厂商供应的所有零件号码:
SQL:
1
2SELECT DISTINCT PNO FROM S,SPJ WHERE
S.CITY='上海' AND S.SNO=SPJ.SNO;结果:
找出使用上海产的零件的工程名称:
SQL:
1
2SELECT DISTINCT JNO FROM S,SPJ WHERE
S.CITY='上海' AND S.SNO=SPJ.SNO;结果:
找出没有使用天津产的零件的工程号码:
SQL:
1
2
3SELECT JNO FROM J WHERE JNO NOT IN
(SELECT JNO FROM S,SPJ WHERE
S.CITY='天津' AND S.SNO=SPJ.SNO);结果:
把全部红色零件的颜色改成蓝色:
SQL:
1
2UPDATE P SET COLOR='蓝' WHERE COLOR='红';
SELECT * FROM P; -- 用于显示结果结果:
由S5供给J4的零件P6改为由S3供应,请作必要的修改:
SQL:
1
2UPDATE SPJ SET SNO='S3' WHERE SNO='S5' AND JNO='J4' AND PNO='P6';
SELECT * FROM SPJ; -- 用于显示结果结果:
从供应商关系中删除S2的记录,并从供应情况关系中删除相应的记录:
因为表SPJ的外键SNO是表S的主键,故要先从表SPJ中删除S2的记录,在从表S中删除S2的记录
SQL:
1
2DELETE FROM SPJ WHERE SNO='S2';
DELETE FROM S WHERE SNO='S2';结果:
表SPJ:
表S:
请将(S2,J6,P4,200)插入供应情况关系:
因为表SPJ的外键SNO是表S的主键,故在表SPJ插入关于S2的记录前,要先在表S中还原S2的信息
SQL:
1
2INSERT INTO S VALUES('S2','盛锡','10','北京');
INSERT INTO SPJ VALUES('S2','P6','J6',200);结果:
表S:
表SPJ:
第9题
请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY):
SQL:
1
2
3CREATE VIEW SANJIAN AS
SELECT SNO,PNO,QTY FROM SPJ,J
WHERE SPJ.JNO=J.JNO AND J.JNAME='三建'在“视图”中查看结果:
针对该试图完成下列查询:
找出三建工程项目使用的各种零件代码及其数量:
SQL:
1
SELECT DISTINCT PNO,QTY FROM SANJIAN;
结果:
找出供应商S1的供应情况。
SQL:
1
SELECT * FROM SANJIAN WHERE SNO='S1';
结果:
实验心得
通过这次实验,我学会通过SQL语句对基本表、索引和视图进行创建、修改及删除,并完成各类的查询数据、更新数据操作。在整个实验过程中,主要有三个注意点:
- 一是
IN
或NOT IN
前需要指定字段,否则会产生SQL语法错误,例子如下:
二是使用
INSERT
语句插入、UPDATE
语句更新数据时注意字段在表中顺序。三是要注意数据库完整性,包括:
- 实体完整性,要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。
- 域完整性,指数据库表中的列必须满足某种特定的数据类型或约束。
- 参照完整性,属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一,就会影响数据的完整性。故删除一个表的主键时,若它是另一个表的外键,要先把在另一个表中把这个外键删除。
本博客所有文章除特别声明外,均为博客作者本人编写整理,转载请联系作者!