地理空间数据库:关系数据库的创建、查询及其相关基本操作
实验1:关系数据库的创建、查询及其相关基本操作
利用PostgreSQL数据库实现对关系数据库的相关操作,包括数据库创建、关系表创建和查询等基本操作,为后续空间数据库实习打下坚实基础。
实验1.1 数据库定义
(1)实验目的
理解和掌握数据库DDL语言,能够熟练地使用SQL
DDL语句创建、修改和删除数据库、模式、索引和基本表。
(2)实验内容和要求
理解和掌握SQL
DDL语句的语法,特别是各种参数的具体含义和使用方法;使用SQL语句创建、修改和删除数据库、模式、索引和基本表。掌握SQL语句常见语法错误的调试方法。
(3)实验重点和难点
实验重点:创建数据库、基本表。
实验难点:创建基本表时,为不同的列选择合适的数据类型,正确创建表级和列级完整性约束,如列值是否允许为空、主码和外码等。注意:数据完整性约束,可以在创建基本表时定义,也可以先创建表然后定义完整性约束;由于完整性约束的限制,被引用的表要先创建。
(4)实验任务
现有“学生课程”数据库,包括三个表:
Student 表,由学号Sno,姓名 Sname(不为空,唯一), 性别Ssex(默认男), 年龄Sage,
所在系Sdept等属性组成;其中Sno为主码;
Course表,由课程号Cno,课程名Cname(不为空),先修课号Cpno,学分Ccredit等属性组成;其中Cno为主码;
SG表,由学号Sno,课程号Cno,成绩Grade组成;其中(Sno,Cno)为候选码;
假如该数据库属于用户HBSF;
基于上述信息,采用SQL语句实现以下要求,并通过SQL server
2008软件检查语句执行结果:
- 创建学生课程数据库,数据库名称为“S-T”;
3、为“S-T”数据库创建Student、Course以及SG表,需满足上述相关表描述条件;
4、向学生表Student添加“入学日期Scome”属性,类型为DATE;
5、删除Student表Scome列;
6、将课程表Course的学分属性类型改为INT型;
7、在Student表的学号属性上建立降序索引,索引名为IndexSno;在Course上建立课程号升序唯一索引,索引名自定义;
8、删除7中建立的索引;
实验1.2 数据基本查询
(1)实验目的
掌握SQL程序设计基本规范,熟练运用SQL语言实现数据基本查询,包括单表查询、分组统计查询和连接查询。
(2)实验内容和要求
针对S-T数据库设计各种单表查询SQL语句、分组统计查询语句;设计单个表针对自身的连接查询,设计多个表的连接查询。理解和掌握SQL查询语句各个子句的特点和作用,按照SQL程序设计规范写出具体的SQL查询语句,并调试通过。
说明:简单地说,SQL程序设计规范包含SQL关键字大写、表名、属性名、存储过程名等标示符大小写混合、SQL程序书写缩进排列等编程规范。
(3)实验重点和难点
实验重点:分组统计查询、单表自身连接查询、多表连接查询。
实验难点:区分元组过滤条件和分组过滤条件;确定连接属性,正确设计连接条件。
(4)实验任务
1、查询全体学生的学号和姓名;查询全体学生所有信息;管理系全体学生信息;
2、查询全体学生的姓名, 出生年份,和所在系, 并用小写字母表示所有系名;
3、给上例的结果集指定列名(查询结果显示列名称依次为:“姓名”、“出生年份”、“所属系”),提升查询结果的辨识度;
4、查询选修了3号课程的学生学号及成绩,查询结果按分数降序排列;
5、查询学习1号课程的学生最高分、平均分;
6、查询选修了课程的学生的学号(查询结果不重复显示学号);
7、查询与“李洋”在同一个系学习的学生姓名(用链接查询);
8、查询年龄在20岁以下的学生的姓名及其年龄;查询考试成绩有不及格的学生的学号;
9、查询所有不姓刘的学生姓名;查询DB_Design课程的课程号和学分;
10、查询年龄在20-30岁之间(包括20岁和30岁)的学生的姓名、所在系;
11、查询 IS,CS,MA系的所有学生的姓名和性别;
13、查询没有先行课的课程的课程号和课程名;
14、查询全体学生的情况,查询结果按所在系号升序排列,
同一系中的学生按年龄降序排列;
15、列出所有学生的基本情况和选课情况, 若没有选课,则只列出基本情况信息;
16、查询学生总人数;
17、查询所有课程的总学分数和平均学分数,以及最高学分和最低学分;
18、查询信息系“IS”学生“数据结构”课程的平均成绩;
19、查询每个学生的课程成绩最高的成绩信息;
20、查询各系的学生的人数并按人数从多到少排序;
*21、查询各系的男女生学生总数, 并按系别,升序排列, 女生排在前;
22、查询选修了3门课程以上的学生的学号;
23、查询每个学生所选课程的平均成绩, 最高分, 最低分,和选课门数;
24、查询至少选修了2门课程的学生的平均成绩;
25、查询平均分超过80分的学生的学号和平均分;
实验1.3 数据高级查询
(1)实验目的
掌握SQL嵌套查询和集合查询等各种高级查询的设计方法等。
(2)实验内容和要求
针对S-T数据库,正确分析用户查询要求,设计各种嵌套查询和集合查询。
(3)实验重点和难点
实验重点:嵌套查询。
实验难点:相关子查询、多层EXIST嵌套查询。
(4)实验任务(用嵌套查询实现)
1、查询所有选修了1号课程的学生姓名;
2、求成绩低于该门课程平均成绩的学生的成绩信息;
3、查询没有选修了1号课程的学生姓名;
4、查询与其他所有学生年龄均不同的学生学号、姓名和年龄;
5、求没有人选修的课程号和课程名;
6、查询学习1号课程的学生最高分、平均分(用EXISTS表示);
7、查询没有选修1号课程的学生姓名(用EXISTS表示)。
8、查询选修了全部课程的学生姓名;
9、查询至少选修了学生95002选修的全部课程的学生的学号;
实验1.4 数据更新
(1)实验目的
熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作。
(2)实验内容和要求
针对TPC-H数据库设计单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERT、UPDATE和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。
(3)实验重点和难点
实验重点:插入、修改和删除数据的SQL。
实验难点:与嵌套SQL子查询相结合的插入、修改和删除数据的SQL语句;利用一个表的数据来插入、修改和删除另外一个表的数据。
(4)实验任务
1、向Student表中插入一条记录(‘200501’,‘李勇’);
2、向Student表中插入记录(‘200502’,‘男’)和(‘200503’,‘女’);
3、将数据表student中学号为200215121的记录的性别及所在系的字段值改为(女,IS);
4、将数据表SC中所有记录的成绩的字段值增加10%;
5、将数据表Student中姓名中姓“王”的记录年龄增加1;
6、将选修课程号为1的记录的成绩字段值增加10 ,其他记录的成绩字段值增加5;
实验2:安全性语言
安全性实验包含两个实验项目,其中1个为必修,1个为选修。自主存取控制实验为设计型实验项目,审计实验为验证型实验项目。
实验2.1 自主存取控制实验
(1)实验目的
掌握自主存取控制权限的定义和维护方法。
(2)实验内容和要求
定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。
(3)实验重点和难点
实验重点:定义角色,分配权限和回收权限。
实验难点:实现权限的再分配和回收。
(4)实验任务
1、理解SQL server 2008
服务器登录名、角色、数据库用户、角色、模式(也称架构)的关系;
2、为S-T数据库新建学生用户“StudentUser”;
Step 1: 超级管理员登陆服务器;
Step 2: 资源管理器中找到“安全性 -> 登录名”,右键“登录名”选择“新建登录名”;
Step 3: 设置登录名为“StudentUser”,验证方式选择“SQL Server
身份验证”,密码初始:123456,将默认强制密码过期去除;
Step 4:
设置该登录名的归属“服务器角色”、映射S-T数据库、SQL登陆选项,分别如下图:
3、思考登录名StudentUser对S-T数据库有何操作权限?用户StudentUser对S-T数据库有何操作权限?用StudentUser登陆并验证。
Step 1: 右键已登陆服务器名称,选择“断开连接”;
Step 2:连接服务器,选择“SQL
Server身份验证”,登陆名为经上述步骤新建的StudentUser登录名,密码为:123456;
Step 3: 新建查询语句,并输入 use
[S-T],通过SQL选择当前用户要操作的数据库,并点击执行;
Step
4:验证当前登陆用户,对S-T数据的操作权限,如下图为验证在Student表上的查询权限,执行后,数据库直接拒绝该查询语句;原因:该用户对S-T数据库无查询权限;
请同学们验证该用户在S-T数据库的Student、Course、SC表的查询、更新、删除、创建权限;【要求:将相关步骤和结果截图】
4、定义权限:给StudentUser用户授予S-T数据库相关操作权限;如授予StudentUser用户对Student表的查询权限;
【方法一:SQL Server 对话框方式】
Step 1: 退出StudentUser用户登录,采用管理员身份登录;
Step 2: 找到S-T数据库StudentUser,右键选择“属性”;
Step 3: 按如下1-8顺序操作,实现对Student表的查询授权;
6、用SQL语句建立计算机系学生的视图CS_Student,并给该视图的查询、更新权限授权给StudentUser用户;
(2)查询授权
实验3:完整性语言
完整性语言实验包含1个验证型实验项目。
(1)实验目的
掌握实体完整性、参照完整性以及自定义完整性的定义和维护方法。
(2)实验内容和要求
定义实体完整性、参照完整性以及具体应用语义,如NULL/NOT
NULL、DEFAULT,UNIQUE、CHECK等,删除实体完整性、参照完整性以及具体应用语义。能够写出两种方式定义完整性的SQL语句:创建表时定义完整性、创建表后定义完整性。设计SQL语句验证完整性约束是否起作用。
(3)实验重点和难点
实验重点:创建表时定义实体、参照、自定义完整性。
实验难点:有多个候选码时实体完整性的定义、参照完整性的违约处理定义。
(4)实验准备
请执行以下SQL语句。
create database "S-T";
(5)实验任务
一、创建表时定义实体、参照完整性以及自定义完整性(可用CONSTRAINT语句)。
(1)为数据库“S-T”创建关系Student(Sno,Sname,Ssex,Sage,Sdept),其中Sno为主键,要求Sno取1000~5000之间值,Sname非空,Sage小于30,Ssex只能是‘男’或‘女’。
(2)为数据库“S-T”创建关系Course(Cno,Cname,Cpno,Ccredit),其中Cno为主键,Cname唯一。
(3)为数据库“S-T”创建关系SC(Sno,Cno,Grade),其中(Sno,Cno)为外码,参照Student和Course表。
第一个实验已完成以上操作。
二、删除实体、参照完整性以及自定义完整性;
利用SQL语句删除任务1创建的Student表、Course表以及SC表上的各列属性上约束条件;
(1)删除关系Student(Sno,Sname,Ssex,Sage,Sdept)中的约束;
(2)删除关系Course(Cno,Cname,Cpno,Ccredit)中的约束;
(3)删除关系SC(Sno,Cno,Grade)中的约束;
三、创建表后定义实体、参照完整性以及自定义完整性(可用CONSTRAINT语句);
(1)增加Student表Sno主键约束,约束名P1;
(2)增加Student表Sname唯一性约束,约束名C2;
(3)修改表Student中的C1约束,要求学号改为在10000~999999之间;修改Student表中C4约束,要求年龄由小于30改为小于40。
(4)增加Course表Cno主键约束,约束名P2;
(5)增加Course表Cname唯一性约束,约束名C5;
(6)增加SC表(Sno,Cno)外码约束P3、P4,参照Student和Course表;
实验5 数据库设计
Step5:数据实施
1、通过SQL server设计工具实现数据库结构的设计。
步骤1:选择“数据库”,右键“新建数据库”;
步骤2:在新建数据库页面,设置数据库相关物理参数,比如数据库大小、增长方式、存储路径等;
步骤3:新建表,根据Step3设计的数据库关系表,完成数据库关系表的创建。表创建过程如下:
SQL代码
CREATE DATABASE [S-T];
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2)default '男',
Sage SMALLINT,
Sdept CHAR(20)
)
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40)NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
)
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno)
)
ALTER TABLE Student
ADD S_entrance DATE;
ALTER TABLE Student
DROP COLUMN Scome;
ALTER TABLE Course
ALTER COLUMN Ccredit INT;
CREATE UNIQUE INDEX IndexSno ON Student(Sno DESC);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
DROP INDEX IndexSno ON Student;
DROP INDEX Coucno ON Course;
SELECT Sno,Sname
FROM Student;
SELECT *
FROM Student;
SELECT *
FROM Student
WHERE Sdept IN('MA');
SELECT Sname,2019-Sage,Sdept,LOWER(Sdept)
FROM Student;
SELECT Sname 姓名,2019-Sage 出生年份,LOWER(Sdept) 所属系
FROM Student;
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
SELECT MAX(Grade),AVG(Grade)
FROM SC
WHERE Cno='1';
SELECT Sno
FROM SC;
SELECT S1.Sno
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept AND S2.Sname='李洋'
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
SELECT Sname
FROM Student
WHERE Sname NOT LIKE '刘%'
SELECT Cno,Ccredit
FROM Course
WHERE Cname='DB_Design'
SELECT Sname,Ssex,Sdept
FROM Student
WHERE Sage BETWEEN 20 AND 30;
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('IS','CS','MA');
SELECT Cno,Cname
FROM Course
WHERE Cpno=''
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
SELECT COUNT(*)
FROM Student
SELECT SUM(Ccredit),AVG(Ccredit),MAX(Ccredit),MIN(Ccredit)
FROM Course;
SELECT AVG(Grade)
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno AND Sdept='IS' AND Cname='数据结构';
SELECT *
FROM SC A
WHERE Grade=
(SELECT MAX(Grade)
FROM SC
WHERE Sno=A.Sno
);
SELECT Sdept,COUNT(*)
FROM Student
GROUP BY Sdept
ORDER BY COUNT(*) DESC;
SELECT Sdept,Ssex,COUNT(*)
FROM Student
GROUP BY Sdept,Ssex
ORDER BY Sdept,Ssex DESC;
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT SC.Sno
FROM SC
GROUP BY SC.Sno
HAVING COUNT(*)>3);
SELECT Sno,AVG(Grade),MAX(Grade),MIN(Grade),COUNT(*)
FROM SC
GROUP BY Sno
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING COUNT(*)>=2
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=80
SELECT Sname FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno='1')
SELECT *
FROM Grade A
WHERE Grade<
(SELECT AVG(Grade)
FROM SC
WHERE Cno=A.Cno)
SELECT Sname FROM Student
WHERE Sno NOT IN
(SELECT Sno
FROM SC
WHERE Cno='1')
SELECT Sno,Sname,Sage
FROM Student A
WHERE NOT EXISTS
(SELECT *
FROM
STUDENT B
WHERE A.Sage=B.Sage AND A.sno<>B.sno)
SELECT Cno,Cname
FROM Course C
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SC.Cno=C.Cno)
SELECT MAX(Grade),AVG(Grade)
From SC
Where EXISTS
(SELECT*
From SC
Where Cno='1')
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno=Course.Cno));
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno='95002'and
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
DROP CONSTRAINT C3;
ALTER TABLE Student
DROP CONSTRAINT C4;
ALTER TABLE Student
DROP CONSTRAINT StudentKey;
ALTER TABLE Course
DROP CONSTRAINT CourseKey;
ALTER TABLE SC
DROP CONSTRAINT PK__SC__E6000253412EB0B6;
ALTER TABLE SC
DROP CONSTRAINT FK__SC__Cno__440B1D61;
ALTER TABLE SC
DROP CONSTRAINT FK__SC__Sno__4316F928;
ALTER TABLE Student
ADD CONSTRAINT P1 PRIMARY KEY(Sno);
ALTER TABLE Student
ADD CONSTRAINT C2 UNIQUE(Sno);
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK(Sno BETWEEN 10000 AND 999999);
ALTER TABLE Student
DROP CONSTRAINT C4;
ALTER TABLE Student
ADD CONSTRAINT C4 CHECK(Sage<40);
ALTER TABLE Course
ADD CONSTRAINT P2 PRIMARY KEY(Cno);
ALTER TABLE Course
ADD CONSTRAINT C5 UNIQUE(Cname);
ALTER TABLE SC
Add CONSTRAINT P3 FOREIGN KEY(Sno)REFERENCES STUDENT(SNO);
ALTER TABLE SC
Add CONSTRAINT P4 FOREIGN KEY(Cno)REFERENCES COURSE(CNO);
GISer, a novice who is learning hard
博客内容遵循 署名-非商业性使用-相同方式共享 4.0
国际 ( CC 4.0 BY-SA )
协议
本文永久链接是:
https://blog.manchan.top/post/di-li-kong-jian-shu-ju-ku-yi/