实验内容
实验一 熟悉数据库管理系统环境
实验二 SQL定义语言
实验三 使用SQL语言进行简单查询
实验四 使用SQL语言进行复杂查询
实验五 SQL常用数据更新操作
实验六 综合应用
实验一 熟悉数据库管理系统环境
实验目的
1、 熟悉并掌握SQL Server的基本使用环境;
2、 掌握SQL Server环境下SQL定义语言的用法,能进行基本表的结构的定义、修改、删除,会建立与删除索引。
实验内容
1、在SQL Server中练习如何与服务器建立连接、使用对象浏览器和查询编辑器等工具;
2、在SQL Server中建立数据库,使用SQL定义语言实现数据表的创建、修改删除等操作;
4、在创建的数据表中进行数据录入。
实验步骤
SQL SERVER中新建查询,建立到服务器的连接
1、 用SQL语言的CREATE TABLE语句创建实验一中学生表student、课程表course和选课表sc及其相应约束,
各表的结构分别如表1、表2和表3 所示。
表1 学生信息表 student
列名 | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
sno | 字符(文本)型 | 8 | 主键 |
sname | 字符(文本)型 | 4 | 不为空 |
ssex | 字符(文本)型 | 2 | 默认值为’男’,取值为’男’或’女’ |
sage | 整数(数值)型 | ||
sdept | 字符型 | 10 |
表2 课程信息表 course
列名 | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
cno | 字符(文本)型 | 2 | 主键 |
cname | 字符(文本)型 | 30 | |
credit | 整数(数值)型 | ||
cpno | 字符(文本)型 | 3 |
表3 学生选课表 sc
列名 | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
sno | 字符(文本)型 | 8 | 主属性,外键 |
cno | 字符(文本)型 | 30 | 主属性,外键 |
grade | 整数(数值)型 | 取值在0-100之间 |
2、向创建的表中输入数据,测试所创建的完整性约束是否起作用
3、用SQL语言ALTER语句修改表结构;
1) STUDENT表中增加一个字段入学时间scome,
2) 删除STUDENT表中sdept字段;
3) 删除创建的SC表中cno字段和COURSE表cno字段之间的外键约束;
4) 重建3)中删除的约束
4、重新定义一个简单表,然后用SQL语言DROP语句删除该表结构;
5、用SQL语言CREATE INDEX语句定义表STUDENT的SNAME字段的降序唯一索引;
6、用SQL语言DROP语句删除索引;
7、分别在student表、course表和sc表中输入如下表中的记录:
sno | sname | ssex | sage | sdept |
---|---|---|---|---|
95001 | 李勇 | 男 | 20 | CS |
95002 | 刘晨 | 女 | 19 | IS |
95003 | 王敏 | 女 | 18 | MA |
95004 | 张立 | 男 | 19 | IS |
95005 | 刘云 | 女 | 18 | CS |
cno | cname | credit | cpno |
---|---|---|---|
1 | 数据库 | 4 | 5 |
2 | 数学 | 6 | |
3 | 信息系统 | 3 | 1 |
4 | 操作系统 | 4 | 6 |
5 | 数据结构 | 4 | 7 |
6 | 数据处理 | 3 | |
7 | PASCAL语言 | 4 | 6 |
sno | cno | grade |
---|---|---|
95001 | 1 | 92 |
95001 | 2 | 85 |
95001 | 3 | 88 |
95002 | 2 | 90 |
95002 | 3 | 80 |
95003 | 2 | 85 |
95004 | 1 | 58 |
95004 | 2 | 85 |
观察输入时有无提示错误,如果有如何修改,体会参照完整性的作用,弄清楚先输入那些表中记录,为什么?
实验要求
1、编写本次实验任务SQL语句,调试并使之运行正确;
2、写出实验报告。
实验过程
1.建立数据库和三张表及其约束
CREATE DATABASE Student
CREATE TABLE student
(sno varchar(8) PRIMARY KEY,
sname varchar(4) not null,
ssex varchar(2) DEFAULT '男' CHECK (ssex = '男' OR ssex = '女'),
sage int,
sdept varchar(10),
);
CREATE TABLE course
(cno varchar(2) PRIMARY KEY,
cname varchar(30),
credit int,
cpno varchar(3),
);
CREATE TABLE sc
(sno varchar(8),
cno varchar(2),
grade int CHECK(grade >= 0 AND grade <= 100),
PRIMARY KEY(sno,cno),
FOREIGN KEY(sno) REFERENCES student(sno),
FOREIGN KEY(cno) REFERENCES course(cno)
);
2、向创建的表中输入数据,测试所创建的完整性约束是否起作用
略
3、用SQL语言ALTER语句修改表结构
1) STUDENT表中增加一个字段入学时间scome,
ALTER TABLE student
ADD scome datetime
2) 删除STUDENT表中sdept字段;
ALTER TABLE student
DROP COLUMN sdept
3) 删除创建的SC表中cno字段和COURSE表cno字段之间的外键约束;
ALTER TABLE sc
DROP CONSTRAINT FK__sc__cno__182C9B23
ALTER TABLE sc
DROP CONSTRAINT FK__sc__sno__173876EA
这里填写自己命名的外键
可使用下面的语句查询现有的外键信息
对于系统表的使用可以点击这里参考
SELECT b.name AS constname, c.name AS ForeignTable, d.name AS ForeignCol, e.name AS refTable, f.name AS refCol
FROM sysforeignkeys a
INNER JOIN sysobjects b ON a.constid = b.id
INNER JOIN sysobjects c ON a.fkeyid = c.id
INNER JOIN syscolumns d
ON a.fkeyid = d.id
AND a.fkey = d.colid
INNER JOIN sysobjects e ON a.rkeyid = e.id
INNER JOIN syscolumns f
ON a.rkeyid = f.id
AND a.rkey = f.colid
4) 重建3)中删除的约束
ALTER TABLE sc
ADD FOREIGN KEY (sno)
REFERENCES student(sno)
ALTER TABLE sc
ADD FOREIGN KEY (cno)
REFERENCES course(cno)
4、重新定义一个简单表,然后用SQL语言DROP语句删除该表结构
略
5.用SQL语言CREATE INDEX语句定义表STUDENT的SNAME字段的降序唯一索引
CREATE INDEX PersonIndex
ON student (sname DESC)
6、用SQL语言DROP语句删除索引;
DROP INDEX PersonIndex ON student;
7、分别在student表、course表和sc表中输入记录:
INSERT INTO student (sno,sname,ssex,sage,sdept)
VALUES('95001','李勇','男','20','CS'),
('95002','刘晨','女','19','IS'),
('95003','王敏','女','18','MA'),
('95004','张立','男','19','IS'),
('95005','刘云','女','18','CS');
INSERT INTO course (cno,cname,credit,cpno)
VALUES('1','数据库','4','5'),
('2','数学','6',''),
('3','信息系统','3','1'),
('4','操作系统','4','6'),
('5','数据结构','4','7'),
('6','数据处理','3',''),
('7','PASCAL语言','4','6');
INSERT INTO sc(sno,cno,grade)
VALUES('95001','1','92'),
('95001','2','85'),
('95001','3','88'),
('95002','2','90'),
('95002','3','80'),
('95003','2','85'),
('95004','1','58'),
('95005','2','85');
实验二 SQL定义语言
与实验一相同
实验三 使用SQL语言进行简单查询
实验目的
掌握简单数据查询操作。
实验内容
使用各种查询条件完成指定的查询操作
实验步骤
1、创建学生表student、课程表course和选课表SC,并输入数据(注意数据的完整性。);(可以使用实验一中已经建立的表和数据)
2、对各表中的数据进行不同条件的查询;
包括的运算:投影、选择、比较运算符、逻辑运算符、字符匹配运算符、匹配列表范围、算术运算符、内部函数、排序、分组、分组函数使用
(1) 查询全体学生的学号和姓名
(2) 查询全体学生的详细记录
(3) 查询软件学院的学生姓名、年龄、系别
(4) 查询所有选修过课程的学生学号(不重复)
(5) 查询考试不及格的学生学号(不重复)
(6) 查询不是软件学院、计算机系的学生性别、年龄、系别
(7) 查询年龄18-20岁的学生学号、姓名、系别、年龄;
(8) 查询姓刘的学生情况
(9) 查询姓刘或姓李的学生情况
(10) 查询姓刘且名字为两个字的学生情况
(11) 查询1983年以后出生的学生姓名。
(12) 创建表 studentgrad(sno,mathgrade,englishigrade,chinesegrade)
计算学生各科总成绩并赋予别名
(13) 利用内部函数 year()查找软件学院学生的出生年份
(14) 利用字符转换函数实现字符联接。
Select sname + ‘年龄为’+cast(sage as char(2))+’岁’
From student
(15) 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。
(16) 查询学生总人数。
(17) 查询选修了课程的学生人数。
(18) 查询选修了7号课程的学生总人数和平均成绩
(19) 查询选修6号课程学生的最好成绩
(20) 查询每个系的系名及学生人数。
(21) 查找每门课的选修人数及平均成绩
(22) 查找没有先修课的课程情况
实验要求
1、将上述任务中完整的SQL语句调试并使之运行正确;
2、写出实验报告(在实验报告纸上完成,包括预习报告、上机报告、总结报告)
实验过程
(1) 查询全体学生的学号和姓名
SELECT sno, sname
FROM student
(2) 查询全体学生的详细记录
SELECT *
FROM student
(3) 查询软件学院的学生姓名、年龄、系别
SELECT sname, sage, sdept
FROM student
WHERE sdept = 'IS'
(4) 查询所有选修过课程的学生学号(不重复)
SELECT DISTINCT sno
FROM student
WHERE sno IN (
SELECT sno
FROM sc
)
(5) 查询考试不及格的学生学号(不重复)
SELECT DISTINCT sno
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE grade < 60
)
(6) 查询不是软件学院、计算机系的学生性别、年龄、系别
SELECT ssex, sage, sdept
FROM student
WHERE sdept != 'IS'
AND sdept != 'CS'
(7) 查询年龄18-20岁的学生学号、姓名、系别、年龄;
SELECT sno, sname, sdept, sage
FROM student
WHERE sage BETWEEN 18 AND 20
(8) 查询姓刘的学生情况
SELECT *
FROM student
WHERE sname LIKE '刘%'
(9) 查询姓刘或姓李的学生情况
SELECT *
FROM student
WHERE sname LIKE '刘%'
OR sname LIKE '李%'
(10) 查询姓刘且名字为两个字的学生情况
SELECT *
FROM student
WHERE sname LIKE '刘__'
(11) 查询1983年以后出生的学生姓名。
SELECT sname
FROM student
WHERE 2019 - sage >= 1983
(12) 创建表 studentgrad(sno,mathgrade,englishigrade,chinesegrade)
计算学生各科总成绩并赋予别名
CREATE TABLE studentgrad (
sno varchar(8),
mathgrade int,
englishgrade int,
chinesegrade int
);
SELECT mathgrade + englishgrade + chinesegrade AS 总成绩
FROM studentgrad
(13) 利用内部函数 year()查找软件学院学生的出生年份
SELECT year(getdate()) - student.sage AS 出生年份
FROM student
WHERE sdept = 'IS'
(14) 利用字符转换函数实现字符联接。
Select sname + ‘年龄为’+cast(sage as char(2))+’岁’
From student
SELECT sname + '年龄为' + CAST(sage AS char(2)) + '岁'
FROM student
(15) 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。
SELECT *
FROM student
ORDER BY sdept, sage DESC
(16) 查询学生总人数。
SELECT COUNT(*) AS number
FROM student
(17) 查询选修了课程的学生人数。
SELECT COUNT(*) AS number
FROM student
WHERE sno IN (
SELECT DISTINCT sno
FROM sc
)
(18) 查询选修了7号课程的学生总人数和平均成绩
SELECT COUNT(*) AS number
, AVG(grade) AS 平均成绩
FROM sc
WHERE cno = 7
(19) 查询选修6号课程学生的最好成绩
SELECT TOP 1 grade
FROM sc
WHERE cno = 6
ORDER BY grade DESC
(20) 查询每个系的系名及学生人数。
SELECT sdept, COUNT(*)
FROM student
GROUP BY sdept;
(21) 查找每门课的选修人数及平均成绩
SELECT cno, COUNT(*) AS number, AVG(grade) AS 平均成绩
FROM sc
GROUP BY cno
(22) 查找没有先修课的课程情况
SELECT *
FROM course
WHERE cpno IS NULL
实验四 使用SQL语言进行复杂查询
实验目的
掌握复杂数据查询操作。
实验内容
掌握各种连接查询、嵌套查询的使用
实验步骤
1、实验一中的数据为基础
2、对各表中的数据进行不同条件的连接查询和嵌套查询;
(1) 查询每个学生及其选课情况;
(2) 查询每门课的间接先修课
(3) 将STUDENT,SC进行右连接
(4) 查询既选修了2号课程又选修了3号课程的学生姓名、学号;
(5) 查询和刘晨同一年龄的学生
(6) 选修了课程名为“数据库”的学生姓名和年龄
(7) 查询其他系比IS系任一学生年龄小的学生名单
(8) 查询其他系中比IS系所有学生年龄都小的学生名单
(9) 查询选修了全部课程的学生姓名
(10) 查询计算机系学生及其性别是男的学生
(11) 查询选修课程1的学生集合和选修2号课程学生集合的差集
(12) 查询李丽同学不学的课程的课程号
(13) 查询选修了3号课程的学生平均年龄
(14) 求每门课程学生的平均成绩
(15) 统计每门课程的学生选修人数(超过3人的才统计)。要求输出课程号和选修人数,结果按人数降序排列,若人数相同,按课程号升序排列
(16) 查询学号比刘晨大,而年龄比他小的学生姓名。
(17) 求年龄大于所有女同学年龄的男同学姓名和年龄
实验要求
1、将上述任务中完整的SQL语句调试并使之运行正确;
2、写出实验报告(在实验报告纸上完成,包括预习报告、上机报告、总结报告)
实验过程
1、实验一中的数据为基础
2、对各表中的数据进行不同条件的连接查询和嵌套查询;
(1) 查询每个学生及其选课情况;
SELECT student.sname, sc.cno
FROM student, sc
WHERE student.sno = sc.sno
(2) 查询每门课的间接先修课
SELECT c1.cname, c2.cpno
FROM course c1, course c2
WHERE c1.cpno = c2.cno
(3) 将STUDENT,SC进行右连接
SELECT *
FROM student
RIGHT JOIN sc ON student.sno = sc.sno
(4) 查询既选修了2号课程又选修了3号课程的学生姓名、学号;
SELECT student.sno, student.sname
FROM student, sc
WHERE student.sno = sc.sno
AND sc.cno = '2'
AND sc.sno IN (
SELECT sno
FROM sc
WHERE sc.cno = '3'
)
(5) 查询和刘晨同一年龄的学生
SELECT s1.sname
FROM student s1, student s2
WHERE s1.sage = s2.sage
AND s1.sname != s2.sname
AND s2.sname = '刘晨'
(6) 选修了课程名为“数据库”的学生姓名和年龄
SELECT DISTINCT sname, sage
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE sc.cno = (
SELECT cno
FROM course
WHERE cname = '数据库'
)
)
(7) 查询其他系比IS系任一学生年龄小的学生名单
SELECT sname
FROM student
WHERE sdept != 'IS'
AND sage < ANY (
SELECT sage
FROM student
WHERE sdept = 'IS'
)
(8) 查询其他系中比IS系所有学生年龄都小的学生名单
SELECT sname
FROM student
WHERE sdept != 'IS'
AND sage < ALL (
SELECT sage
FROM student
WHERE sdept = 'IS'
)
(9) 查询选修了全部课程的学生姓名
SELECT sname
FROM student
WHERE sno IN (
SELECT sno
FROM sc
GROUP BY sno
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM course
)
)
(10) 查询计算机系学生及其性别是男的学生
SELECT sname
FROM student
WHERE sdept = 'CS'
AND ssex = '男'
(11) 查询选修课程1的学生集合和选修2号课程学生集合的差集
SELECT sname
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE cno = '1'
)
EXCEPT
SELECT sname
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE cno = '2'
)
(12) 查询李丽同学不学的课程的课程号
SELECT cno
FROM course
WHERE cno NOT IN (
SELECT cno
FROM sc
WHERE sno = (
SELECT sno
FROM student
WHERE sname = '李丽'
)
)
(13) 查询选修了3号课程的学生平均年龄
SELECT AVG(sage)
FROM student
WHERE sage IN (
SELECT sage
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE cno = '3'
)
)
(14) 求每门课程学生的平均成绩
SELECT AVG(grade)
FROM sc
GROUP BY cno
(15) 统计每门课程的学生选修人数(超过3人的才统计)。要求输出课程号和选修人数,结果按人数降序排列,若人数相同,按课程号升序排列
SELECT course.cno, COUNT(sc.sno) AS 人数
FROM course, sc
WHERE course.cno = sc.cno
GROUP BY course.cno
ORDER BY COUNT(sc.cno) DESC, cno
(16) 查询学号比刘晨大,而年龄比他小的学生姓名。
SELECT s1.sname
FROM student s1, student s2
WHERE s1.sno > s2.sno
AND s1.sage < s2.sage
AND s2.sname = '刘晨'
(17) 求年龄大于所有女同学年龄的男同学姓名和年龄
SELECT sname, sage
FROM student
WHERE student.ssex = '男'
AND sage > ALL (
SELECT sage
FROM student
WHERE ssex = '女'
)
实验五 SQL的常用数据更新操作
实验目的
掌握SQL的常用数据更新操作,熟练应用INSERT,UPDATE,DELETE语句。
实验内容
1、 应用INSERT,UPDATE,DELETE语句进行更新操作;
(1) 插入如下学生记录(学号:95030,姓名:李莉,年龄:18)
(2) 插入如下选课记录(95030,1)
(3) 计算机系学生年龄改成20
(4) 把数学系所有学生成绩改成0
(5) 把低于总平均成绩的女同学成绩提高5分
(6) 删除95030学生信息
(7) 删除SC表中无成绩的记录
(8) 删除张娜的选课记录
(9) 删除不及格的学生选课记录
(10) 删除数学系所有学生选课记录
(11) 删除所有未被选修的课程
(12) 查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,把值送往另一个已经存在的基本表STU(SNO,SNAME,SSEX)中
(13) 建立一个sdeptgrade 表,包含(sdept,avggrade)字段,对每一个系,求学生的成绩,并把结果存入sdeptgrade
2、熟练掌握INSERT,UPDATE,DELETE语句并能综合应用;
实验要求
1、将上述任务中完整的SQL语句调试并使之运行正确;
2、写出实验报告(在实验报告纸上完成,包括预习报告、上机报告、总结报告)
实验过程
(1) 插入如下学生记录(学号:95030,姓名:李莉,年龄:18)
INSERT INTO student (sno, sname, sage)
VALUES ('95030', '李莉', '18')
(2) 插入如下选课记录(95030,1)
INSERT INTO sc (sno, cno)
VALUES ('95030', '1')
(3) 计算机系学生年龄改成20
UPDATE student
SET sage = '20'
WHERE sdept = 'IS'
(4) 把数学系所有学生成绩改成0
UPDATE sc
SET grade = '0'
WHERE sno IN (
SELECT sno
FROM student
WHERE sdept = 'MA'
)
(5) 把低于总平均成绩的女同学成绩提高5分
UPDATE sc
SET grade = grade + 5
WHERE grade IN (
SELECT grade
FROM sc
WHERE grade < (
SELECT AVG(grade)
FROM sc
)
)
AND sno IN (
SELECT sno
FROM student
WHERE ssex = '女'
)
(6) 删除95030学生信息
DELETE FROM student
WHERE sno = '95030'
(7) 删除SC表中无成绩的记录
DELETE FROM sc
WHERE grade IS NULL
(8) 删除张娜的选课记录
DELETE FROM sc
WHERE sno IN (
SELECT sno
FROM student
WHERE sname = '张娜'
)
(9) 删除不及格的学生选课记录
DELETE FROM sc
WHERE grade < 60
(10) 删除数学系所有学生选课记录
DELETE FROM sc
WHERE sno IN (
SELECT sno
FROM student
WHERE sdept = 'MA'
)
(11) 删除所有未被选修的课程
DELETE FROM course
WHERE cno NOT IN (
SELECT cno
FROM sc
)
(12) 查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,把值送往另一个已经存在的基本表STU(SNO,SNAME,SSEX)中
CREATE TABLE STU (
sno varchar(8) PRIMARY KEY,
sname varchar(4) NOT NULL,
ssex varchar(2) DEFAULT '男' CHECK (ssex = '男'
OR ssex = '女')
);
INSERT INTO STU (sno, sname, ssex)
SELECT sno, sname, ssex
FROM student
WHERE sno NOT IN (
SELECT sno
FROM sc
WHERE grade < 80
)
(13) 建立一个sdeptgrade 表,包含(sdept,avggrade)字段,对每一个系,求学生的成绩,并把结果存入sdeptgrade
CREATE TABLE sdeptgrade (
sdept varchar(10),
avggrade int
);
INSERT INTO sdeptgrade
SELECT sdept, AVG(grade)
FROM student
JOIN sc ON student.sno = sc.sno
GROUP BY sdept
实验六 综合应用
实验目的
根据数据库设计步骤完成相关操作。
实验内容
设有关系模式:
SB(SN,SNAME,CITY)
其中,S表示供应商,SN为供应商代号,SNAME为供应商名字,CITY为供应商所在城市,主关键字为SN。
PB(PN,PNAME,COLOR,WEIGHT)
其中P表示零件,PN为零件代号,PNAME为零件名字,COLOR为零件颜色,WEIGHT为零件重量,主关键字为PN。
JB(JN,JNAME, CITY)
其中,J表示工程,JN为工程编号,JNAME为工程名字,CITY为工程所在城市,主关键字为JN。
SPJB(SN,PN,JN,QTY)
其中,SPJ表示供应关系,SN是为指定工程提供零件的供应商代号,PN为所提供的零件代号,JN为工程编号,QTY表示提供的零件数量,主关键字为(SN,PN,JN),外部关键字为SN,PN,JN。
写出实现以下各题功能的SQL语句:
(1).取出所有工程的全部细节;
(2).取出所在城市为上海的所有工程的全部细节;
(3).取出重量最轻的零件代号;
(4).取出为工程J1提供零件的供应商代号;
(5).取出为工程J1提供零件P1的供应商代号;
(6).取出由供应商S1提供零件的工程名称;
(7).取出供应商S1提供的零件的颜色;
(8).取出为工程J1或J2提供零件的供应商代号;
(9).取出为工程J1提供红色零件的供应商代号;
(10).取出为所在城市为上海的工程提供零件的供应商代号;
(11).取出为所在城市为上海或北京的工程提供红色零件的供应商代号;
(12).取出供应商与工程所在城市相同的供应商提供的零件代号;
(13).取出上海的供应商提供给上海的任一工程的零件的代号;
(14).取出至少由一个和工程不在同一城市的供应商提供零件的工程代号;
(15).取出上海供应商不提供任何零件的工程的代号;
(16).取出这样一些供应商代号,它们能够提供至少一种由红色零件的供应商提供的零件;
(17).取出由供应商S1提供零件的工程的代号;
(18).取出所有这样的一些〈CITY,CITY〉二元组,使得第1个城市的供应商为第2个
城市的工程提供零件;
(19).取出所有这样的三元组〈CITY,PN CITY〉,使得第1个城市的供应商为第2个城市的工程提供指定的零件;
(20).重复(19)题,但不检索两个CITY值相同的三元组。
实验要求
1、编写本次实验任务SQL语句,调试并使之运行正确;
2、写出实验报告。
实验过程:
实验指导书没有给出测试数据,我在下面贴出了自己创建的测试数据,仅供参考
CREATE DATABASE test
CREATE TABLE JB (
JN varchar(8) PRIMARY KEY,
JNAME varchar(50),
CITY varchar(50)
);
CREATE TABLE PB (
PN varchar(8) PRIMARY KEY,
PNAME varchar(50),
COLOR varchar(8),
WEIGHT int
);
CREATE TABLE SB (
SN varchar(8) PRIMARY KEY,
SNAME varchar(50),
CITY varchar(8)
);
CREATE TABLE SPJB (
SN varchar(8),
PN varchar(8),
JN varchar(8),
QTY int,
PRIMARY KEY (SN, JN, PN),
FOREIGN KEY (SN)
REFERENCES SB (SN),
FOREIGN KEY (JN)
REFERENCES JB (JN),
FOREIGN KEY (PN)
REFERENCES PB (PN)
);
INSERT INTO JB (JN, JNAME, CITY)
VALUES ('J1', '项目1', '上海'),
('J2', '项目2', '北京'),
('J3', '项目3', '上海'),
('J4', '项目4', '北京');
INSERT INTO SB (SN, SNAME, CITY)
VALUES ('S1', '公司1', '上海'),
('S2', '公司2', '北京'),
('S3', '公司3', '上海'),
('S4', '公司4', '北京');
INSERT INTO PB (PN, PNAME, COLOR, WEIGHT)
VALUES ('P1', '零件1', 'RED', 3),
('P2', '零件2', 'BLACK', 5),
('P3', '零件3', 'YELLOW', 7);
INSERT INTO SPJB (SN, PN, JN, QTY)
VALUES ('S1', 'P1', 'J1', 2),
('S1', 'P1', 'J3', 3),
('S1', 'P2', 'J1', 3),
('S2', 'P3', 'J1', 5),
('S2', 'P3', 'J3', 5),
('S2', 'P3', 'J4', 7),
('S3', 'P3', 'J2', 3),
('S4', 'P2', 'J2', 3);
(1).取出所有工程的全部细节;
SELECT *
FROM JB
(2).取出所在城市为上海的所有工程的全部细节;
SELECT *
FROM JB
WHERE CITY = '上海'
(3).取出重量最轻的零件代号;
SELECT PN
FROM PB
WHERE WEIGHT IN (
SELECT MIN(WEIGHT)
FROM PB
)
(4).取出为工程J1提供零件的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE JN = 'J1'
(5).取出为工程J1提供零件P1的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE JN = 'J1'
AND PN = 'P1'
(6).取出由供应商S1提供零件的工程名称;
SELECT DISTINCT JN
FROM SPJB
WHERE SN = 'S1'
(7).取出供应商S1提供的零件的颜色;
SELECT COLOR
FROM PB
WHERE PN IN (
SELECT PN
FROM SPJB
WHERE SN = 'S1'
)
(8).取出为工程J1或J2提供零件的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE JN = 'J1'
OR JN = 'J2'
(9).取出为工程J1提供红色零件的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE PN IN (
SELECT PN
FROM PB
WHERE COLOR = 'RED'
)
AND JN = 'J1'
(10).取出为所在城市为上海的工程提供零件的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE JN IN (
SELECT JN
FROM JB
WHERE CITY = '上海'
)
(11).取出为所在城市为上海或北京的工程提供红色零件的供应商代号;
SELECT DISTINCT SN
FROM SPJB
WHERE JN IN (
SELECT JN
FROM JB
WHERE CITY = '上海'
OR CITY = '北京'
)
AND PN IN (
SELECT PN
FROM PB
WHERE COLOR = 'RED'
)
(12).取出供应商与工程所在城市相同的供应商提供的零件代号;
SELECT DISTINCT PN
FROM SPJB
WHERE SN IN (
SELECT SN
FROM SB
RIGHT JOIN JB ON JB.CITY = SB.CITY
)
(13).取出上海的供应商提供给上海的任一工程的零件的代号;
SELECT DISTINCT PN
FROM SPJB
WHERE SN IN (
SELECT SN
FROM SB
WHERE CITY = '上海'
)
AND JN IN (
SELECT JN
FROM JB
WHERE CITY = '上海'
)
(14).取出至少由一个和工程不在同一城市的供应商提供零件的工程代号;
SELECT DISTINCT JB.JN
FROM (JB, SB)
RIGHT JOIN SPJB ON SB.SN = SPJB.SN
WHERE SB.CITY != JB.CITY
AND JB.JN = SPJB.JN
(15).取出上海供应商不提供任何零件的工程的代号;
SELECT JN
FROM SPJB
WHERE JN NOT IN (
SELECT JN
FROM SPJB
WHERE SN IN (
SELECT SN
FROM SB
WHERE CITY = '上海'
)
)
(16).取出这样一些供应商代号,它们能够提供至少一种由红色零件的供应商提供的零件;
SELECT DISTINCT SN
FROM SPJB
WHERE PN IN (
SELECT PN
FROM SPJB
WHERE SN IN (
SELECT SN
FROM SPJB
WHERE PN IN (
SELECT PN
FROM PB
WHERE COLOR = 'RED'
)
)
)
(17).取出由供应商S1提供零件的工程的代号;
SELECT DISTINCT JN
FROM SPJB
WHERE SN = 'S1'
(18).取出所有这样的一些〈CITY,CITY〉二元组,使得第1个城市的供应商为第2个
城市的工程提供零件;
SELECT SB.CITY, JB.CITY
FROM (SB, JB)
RIGHT JOIN SPJB ON JB.JN = SPJB.JN
WHERE SB.SN = SPJB.SN
AND JB.JN = SPJB.JN
(19).取出所有这样的三元组〈CITY,PN CITY〉,使得第1个城市的供应商为第2个城市的工程提供指定的零件;
SELECT SB.CITY, JB.CITY, SPJB.PN
FROM (SB, JB)
RIGHT JOIN SPJB ON JB.JN = SPJB.JN
WHERE SB.SN = SPJB.SN
AND JB.JN = SPJB.JN
(20).重复(19)题,但不检索两个CITY值相同的三元组。
SELECT SB.CITY, JB.CITY
FROM (SB, JB)
RIGHT JOIN SPJB ON JB.JN = SPJB.JN
WHERE SB.SN = SPJB.SN
AND JB.JN = SPJB.JN
AND SB.CITY != JB.CITY