如果你对其他数据库原理的实验感兴趣,请考虑阅读我的专栏
SQL Server实验系列
实验目的:
1.熟练掌握SQL语言进行基本表结构的创建。
2.熟练应用SQL语言进行表结构的修改。
3.掌握SQL语言进行基本表的删除。
4.掌握SQL语言进行索引的建立和删除
5.选择具体的数据库管理系统进行实现
实验过程:
第一步 打开 Microsoft SQL Service Management Studio 并连接数据库 schTest
use schTest
第二步 用SQL语言CREATE TABLE语句创建实验一中学生表student、课程表course和选课表sc及其相应约束
表1 学生信息表student
字段(列名) | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
Sno | 字符型 | 8 | 主键 |
Sname | 字符型 | 4 | 不为空 |
Ssex | 字符型 | 2 | 默认值为‘男’,取值范围‘男’,‘女’ |
Sage | 整数型 | ||
Sdept | 字符型 |
表2 课程信息表course
字段(列名) | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
Cno | 字符型 | 2 | 主键 |
Cname | 字符型 | 30 | |
Credit | 整数型 | ||
Cpno | 字符型 | 3 |
表3 选课表SC
字段(列名) | 数据类型 | 长度 | 完整性约束 |
---|---|---|---|
Sno | 字符型 | 8 | 主属性,外键 |
Cno | 字符型 | 30 | 主属性、外键 |
Grade | 整数型 | 取值范围0-100 |
CREATE TABLE Student
(
Sno CHAR(9) PRIMARY KEY, --学号,主码
Sname CHAR(6) NOT NULL, --姓名,取唯一值
Ssex CHAR(2) DEFAULT '男' CHECK (Ssex= '男'or Ssex='女' ), --性别
Sage INT, --年龄
Sdept CHAR(10) --系院
);
go
CREATE TABLE Course
(
Cno CHAR(2) PRIMARY KEY, --课程号
Cname CHAR(30), --课程名
Cpno CHAR(3), --先行课
Ccredit SMALLINT, --学分
);
go
CREATE TABLE SC
(
Sno CHAR(8), --学号
Cno CHAR(2) , --课程号
Grade INT CHECK(Grade >=0 AND Grade <=100) --成绩
PRIMARY KEY(Sno,Cno),
/*主码由两个属性构成,必须作为表级完整性进行定义*/
CONSTRAINT fk_Sno FOREIGN KEY (Sno) REFERENCES Student(Sno) on delete cascade on update cascade,
CONSTRAINT fk_Cno FOREIGN KEY (Cno) REFERENCES Course(Cno) on delete cascade on update cascade
);
GO
第三步 向创建的表中输入数据,测试所创建的完整性约束是否起作用
INSERT INTO student (sno,sname,ssex,sage,sdept)
VALUES('95001','刘晨','男','20','CS'),
('95002','月儿','女','19','IS'),
('95003','孙空空','女','18','MA'),
('95004','韩信','男','19','IS'),
('95005','刘云','女','17','CS'),
('95006','刘皇姨','女','21','IS'),
('95007','马部长','女','19','MA'),
('95008','李丽','女','20','CS'),
('95009','石头','女','19','IS'),
('95010','张半','女','18','CS');
go
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('1', '数据库', '15', '4')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('2', '数学', '', '2')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('3', '信息系统', '1', '4')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('4', '操作系统', '6', '3')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('5', '数据结构', '7', '4')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('6', '数据处理', '', '2')
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES ('7', 'PASCAL语言', '6', '4')
go
INSERT INTO sc(sno,cno,grade)
VALUES('95001','2','100'),
('95001','3','95'),
('95001','4','90'),
('95001','6','100'),
('95002','2','98'),
('95002','3',''),
('95003','1','99'),
('95003','2','80'),
('95003','3','98'),
('95004','1','90'),
('95005','7','97'),
('95005','2','37')
go
第四步 用SQL语言ALTER语句修改表结构;
(1) STUDENT表中增加一个字段入学时间scome
ALTER TABLE Student
ADD Scome date
go
(2) 删除STUDENT表中sdept字段;
ALTER TABLE Student
DROP COLUMN Sdept
go
(3) 删除创建的SC表中cno字段和COURSE表cno字段之间的外键约束;
ALTER TABLE SC
DROP CONSTRAINT fk_Cno
go
(4) 重建(3)中删除的约束
ALTER TABLE SC
ADD CONSTRAINT fk_Cno FOREIGN KEY (Cno) REFERENCES Course(Cno)
第五步 重新定义一个简单表,然后用SQL语言DROP语句删除该表结构;
CREATE TABLE dd(dd text);
DROP TABLE dd;
第六步 用SQL语言CREATE INDEX语句定义表STUDENT的SNAME字段的降序唯一索引;
/*sql create index 定义表student的sname字段降序索引*/
CREATE INDEX ha ON Student (Sname desc);
第七步 用SQL语言DROP语句删除索引;
/* drop删除索引*/
DROP INDEX ha ON Student;
实验目的:
1.掌握SQL查询语句的一般格式
2.掌握简单数据查询操作。
3.熟练掌握各种查询条件的表示。
4.掌握排序和分组操作在SQL语句中的实现。
5.掌握集函数的使用。
实验过程:
(1)查询全体学生的学号和姓名
SELECT Sno,Sname FROM Student;
(2)查询全体学生的详细记录
SELECT * FROM Student;
(3)查询软件学院的学生姓名、年龄、系别
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sdept='IS'
(4)查询所有选修过课程的学生学号(不重复)
SELECT Sno
FROM Student
WHERE Sno IN (select Sno from SC)
(5)查询考试不及格的学生学号(不重复)
SELECT Sno
FROM Student
WHERE Sno IN (
SELECT Sno
FROM SC
WHERE Grade < 60
)
(6)查询不是软件学院、计算机系的学生性别、年龄、系别
SELECT Ssex,Sage,Sdept
FROM Student
WHERE Sdept != 'CS' AND Sdept != 'IS'
(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 YEAR(GETDATE()) - 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()) - Sage AS 出生年份
FROM Student
WHERE Sdept = 'IS'
(14)利用字符转换函数实现字符联接。
Select sname + '年龄为'+ cast(sage as char(2)) + '岁'
From student
(15)查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sage DESC
(16)查询学生总人数。
SELECT COUNT(*) AS 人数
FROM Student
(17)查询选修了课程的学生人数。
SELECT COUNT(Sno) AS 选课学生人数
FROM Student
WHERE Sno IN(
SELECT DISTINCT Sno
FROM SC
)
(18)查询选修了7号课程的学生总人数和平均成绩
SELECT COUNT(*) AS 选修7号课人数, AVG(Grade) AS 平均成绩
FROM SC
WHERE Cno = 7
(19)查询选修6号课程学生的最好成绩
SELECT MAX(Grade) AS 选修6号课最优成绩
FROM SC
WHERE Cno = 6
(20)查询每个系的系名及学生人数。
SELECT Sdept,COUNT(*)
FROM Student
GROUP BY Sdept
(21)查找每门课的选修人数及平均成绩
SELECT Cno,COUNT(*) AS 人数, AVG(Grade) AS 平均成绩
FROM SC
GROUP BY Cno
(22)查找没有先修课的课程情况
SELECT *
FROM Course
WHERE Cpno = NULL