SQL Server数据库原理实验报告(完)

本文全面解析了SQL数据库操作,涵盖数据库环境熟悉、定义语言、简单及复杂查询、数据更新操作,以及综合应用实例,适合初学者和进阶者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验内容

实验一 熟悉数据库管理系统环境
实验二 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表中输入如下表中的记录:

snosnamessexsagesdept
95001李勇20CS
95002刘晨19IS
95003王敏18MA
95004张立19IS
95005刘云18CS
cnocnamecreditcpno
1数据库45
2数学6
3信息系统31
4操作系统46
5数据结构47
6数据处理3
7PASCAL语言46
snocnograde
95001192
95001285
95001388
95002290
95002380
95003285
95004158
95004285

观察输入时有无提示错误,如果有如何修改,体会参照完整性的作用,弄清楚先输入那些表中记录,为什么?

实验要求
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
本文档为数据库上机实验报告,是自己认认真真一步一步写的,报告包含试验中的具体步骤,过程以及代码和实验结果截图,和实验总结。 实验实验题目: 数据库管理系统的使用 实验目的: 掌握SQL SERVER2005的使用和数据库设计的一般方法。 实验内容: (1)SQL SERVER2005的使用 (2)数据库的设计过程并利用SQL SERVER2005建立数据库实验实验题目: 数据库的定义 实验目的:掌握数据表建立、修改、删除、索引的SQL语句。 实验内容: (1)数据表的建立 (2)数据表的修改 (3)数据表的删除 (4)数据表的索引建立 为S表的DEPT建立唯一索引 (5)视图的建立与删除 建立一个计算机系学生基本信息视图CSV(SNO,SNAME,SEX,AGE) 查询1983年以后出生的计算机系学生基本信息。 建立一个计算机系学生成绩视图JSGV(SNO,CNO,GRADE)。 查询计算机系学生选课多于3门的学生学号。 查询计算机系学生2号课不及格的学生学号和成绩。 实验实验题目: 数据表的操作 实验目的: 掌握数据表数据操作的SQL语句。 实验内容: SQL语句插入数据操作 SQL语句修改数据操作 SQL语句删除数据操作 SQL语句查询数据操作 维护数据SQL语句: (1)在学生表中插入一新生信息(‘200213808’,’HUJING’,’女’,22,’计算机’) (2)删除数据库中学号为’200213801’的退学学生有关信息。 (3)将计算机系学生2号课成绩全部提高5%。 查询数据SQL语句: (4)统计有学生选修的课程门数。 (5)统计HU老师所授每门课程的学生平均成绩。 (6)统计所有选修人数多于20的课程号和选课人数,并按人数降序排列,若人数相等,则按课程号升序排列。 (7)检索所有缓考即成绩为NULL的同学学号、姓名和缓考课程号。 (8)检索‘OS’课成绩高于该课平均成绩的同学学号。 (1) 检索计算机系女生的学号和姓名。 (2) 检索全体学生姓名、出生年份和所在系。 (3) 检索未选修任何课程的学生学号。 (4) 检索WANG老师所授课程号、课程名。 (5) 检索所有姓LI同学的基本信息。 (6) 检索选修‘DATABASE’课程的学生学号。 (7) 检索年龄介于LIPING同学年龄和28岁之间的学生基本信息。 (8) 检索选修TIAN老师所授全部课程的学生学号。 实验实验题目: T-SQL编程 实验目的: 掌握T-SQL语句的使用。 实验内容: 1.定义一个表变量,用来存储两名学生的学号,姓名,所在系。 2.编写一个自定义的函数,该函数接受一个学生姓名,返回其学生表中基本信息及选课情况。 3.试用CASE语句输出学生表中各年龄段的学生人数。 4.编写存储过程,以系别作为参数,统计指定系别的人数,并作为存储过程的输出。 实验题目: 数据库整性 实验目的: 掌握数据库整性约束定义,整性检查及违约处理方式。 掌握触发器的定义及使用。 实验内容: 1. 定义S, C表的整性约束 2. 定义SC表的整性约束,要求当其被参照表发生删除操作时,违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。 3. 触发器 ☆ 建立一DML触发器,每当学生的成绩发生更新时,将更新的学号,成绩存入g-log表内 ☆ 建立一个INSTEAD OF触发器,每当修改课程表中记录时,利用触发器动作替代修改操作。 ☆ 建立一个DDL 触发器,不允许删除数据库中表,并作出响应。 实验实验题目: 数据库的安全性 实验目的: 掌握SQL SERVER 2005的安全控制机制 实验内容: 1. 创建登录 创建lg1,lg2,并设定口令 2. 定义用户 定义user1,user2,user1以lg1登录,user2以lg2登录,user1定义角色ddl_admin,datareader,datawriter 3. 掌握SQL SERVER 2005架构和用户分离的概念 为user1创建架构u1,并建立test表,通过授权模式的方法,授权给user2表访问test的权限 4. 数据库的授权、收权语句 ☆ 将查询SC表和修改GRADE属性的权限授予用户user1。 ☆ 将对表S的插入权限授予用户user2,并允许他将此权限授予其他用户。 ☆ 收回所有用户对表S的插入权限。 实验实验题目: 数据库的设计 实验目的: 掌握数据库的概念结构设计和逻辑结构与设计,掌握ER图的表示方法即如何将ER模型转化为关系模型 1.学校有若干系,每个系有若干班级和教研室,每个教研室有若干教师,其中有教授和副教授每人各带若干研究生,每个班有若干学生,每个学生选修若干课程,每门课有若干学生选修。 2.某工厂生产若干产品,每种产品由不同的零件组成,有的零件可用在不同的产品上。这些零件由不同的原材料组成,不同零件所用的材料可以相同。有些零件按所属的不同产品分别放在仓库中,原材料按照类别放在若干仓库中。
数据库随课实验数据库原理及应用》 实验类别: 课内实验 实验课程名称: 数据库原理及应用 实验室名称:软件工程实验实验课程编号: 02060007 总学时: 56 学 分: 3.5 适用专业: 计算机科学与技术、网络工程、软件工程 先修课程: 离散数学、计算机导论及操作、数据结构 实验在教学培养计划中地位、作用: 数据库原理及应用是一门理论与实践相结合的课程,上机实验环节是本课程的重要组成部分。实验的目的是为了配合课堂教学,进一步强化对数据库原理的理解。实验的任务是要结合数据库原理SQL Server 2000数据库系统,熟练掌握和深入理解课堂教学内容,实现从理论到实践的统一。 实验SQL的数据定义(2学时) 1、实验目的 掌握DBMS的数据定义功能 掌握SQL语言的数据定义语句 2、实验内容 创建、删除表 查看、修改表的定义 理解索引的特点 创建和删除索引 3、实验要求 熟练掌握SQL的数据定义语句CREATE、ALTER、DROP 写出实验报告 4、实验步骤 设有一个学生-课程数据库,包括学生关系Student、课程关系Course和选修关系SC: 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit) 学生选课表:SC(Sno,Cno,Grade) 创建、删除表,例如: CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20) UNIQUE, Ssex CHAR(1) , Sage INT, Sdept CHAR(15))
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值