数据库系统概论(第三版) 读书笔记

[b]3. 关系数据库标准语言SQL[/b]
[b]1)定义基本表[/b]
建立一个学生表Student,他由学好Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学好不能为空,值是唯一的,并且姓名取值也唯一。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20) UNIQUE,
Sage CHAR(1),
Sage INT,
Sdept CHAR(15));


[b]2)修改基本表[/b]
向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student Add Scome DATE;


将年龄的数据类型改为半字长整数
ALTER TABLE Student MODIFY Sage SMALLINT;


删除学生姓名必须取唯一值的约束
ALTER TABLE Student DROP UNIQUE(Sname);


3)删除基本表
删除Student表
DROP TABLE Student;


4)建立索引
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
用户可以在最长查询的列上建立聚簇索引以提高查询效率。显然在一个基本表上最多只能建立一个聚簇索引。建立聚簇索引后,更新索引列数据后,往往到指标中记录的物理顺序的变更,代价较大,因此对于经常更新的列不宜建立聚簇索引。
为学生-课程数据库中的Student、Course、SC三张表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX CouCno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);


5) 删除索引
DROP INDEX Stusname;


6)选择表中的若干列
查询全体学生的学号与姓名
SELECT Sno, Sname FROM Student;


查询全体学生的姓名、学号、所在系
SELECT Sname, Sno, Sdept FROM Stuendt;


查询全体学生的详细记录
SELECT * FROM Student;


查询经过计算的值
SELECT Sname, 1996-Sage FROM Student;


查询全体学生的姓名、出生年月和所有系,要求用小写字母表示所有系名。
SELECT Sname, ‘Year of Birth:’, 1996-Sage, ISLOWER(Sdept) FROM Student;


7)选择表中的若干元组
查询选修课程的学生学号
SELECT DISTINCT Sno FROM SC;


查询计算机系全体学生的名单
SELECT Sname FROM Student WHERE Sdept=’CS’;


查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname, Sage FROM Student WHERE Sage<20;


查询考试成绩有不及格的学生的学号
SELECT DISTINCE Sno FROM COURSE WHERE Grade<60;


查询年龄不在20-23岁之间的学生姓名、系别和年龄
SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;


查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname, Ssex FROM Student WHERE Sdept IN (‘IS’, ‘MA’, ‘CS’)


查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN(‘IS’, ‘MA’, ‘CS’);


查询学号为95001的学生的详细情况
SELECT * FROM WHERE Sno LIKE '95001';


查询所有姓刘的学生的姓名、学号和性别
SELECT Sname, Sno, Ssex FROM Student WHERE Sname LIKE '刘%'


查询姓“欧阳”且全名为三个汉字的学生的姓名
SELECT Sname FROM Student WHERE Sname LIKE ‘欧阳__';

一个汉字要占两个字符的位置,所以匹配串欧阳后面需要跟两个_。

查询名字中第2个字为”阳“字的学生的名字和学号
SELECT Sname, Sno FROM Student WHERE Sname LIKE '__阳%';


查询所有不姓刘的学生姓名
SELECT Sname FROM Student WHERE Sname NOT LIKE '刘%';


查询DB_Design课程的课程号和学分。
SELECT Cno, Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\'
[/code]

查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况
[code="sql"]SELECT * FROM Course WHERE Sname LIKE 'DB\_%i__' ESCAPE '\';


查询学生选修课程后没有参加考试,所以优选科技路,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno, Cno FROM SC WHERE Grade IS NULL;


查询所有有成绩的学生学号和课程号
SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;


查询计算机系年龄在20岁以下的学生姓名
SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20;


8)对查询结果排序
查询选修了3号课程的学生的学号及其成绩,查询的结果按分数的降序排列
SELECT Sno, Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;

对于空置,若按升序排,含控制的元组将最后显示。若按降序排,空值的元组将最先显示。

查询全体学生情况,查询结果按所在系的系号升序排列,同一个系中的学生按年龄降序排列
SELECT * FROM Student ORDER BY Sdept, Sage DESC;


9)使用集函数
查询学生总人数
SELECT COUNT(*) FROM Student;


查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno) FROM SC;


计算1号课程的学生平均成绩
SELECT AVG(Grade) FROM SC WHERE Cno='1';


查询选修1号课程的学生最高分数
SELECT MAX(Grade) FROM SC WHERE Cno='1';


10)对查询结果分组
求各个课程号及相应的选课人数
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;


查询选修了3门以上课程的学生学号
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3;

WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

11)等值或非等值连接查询
查询每个学生及其选修课程的情况
SELECT Student.* SC.* FROM Student, SC WHERE Student.Sno=SC.Sno;


使用自然连接
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade FROM Student, SC WHERE Student.Sno=SC.Sno;


12)自身连接
查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno, SECOND.Cpno FROM Course FIRST, Course SECOND WHERE FIRST.Cpno=SECOND.Cno;


13)外连接
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade FROM Student, SC WHERE Student.Sno=SC.Sno(*);

外连接的表示方法为,在连接谓词的某一边加上*(有的数据库系统中用+)。
如果外连接符出现在连接条件的右边,成为右外连接。如果外连接符出现在连接条件的左边,成为左外连接。

14)复合条件连接
查询选修2号课程且成绩在90分以上的所有学生。
SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno=’2’ AND SC.Grade>90;


查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno, Sname, Cname, Grade FROM Student, SC, Course WHERE Student.Sno=SC.Sno and SC.Cno=Course.Cno;


15)嵌套查询
查询与“刘晨”自同一个系学习的学生。
SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname=’刘晨’);
SELECT S1.Sno, S1.Sname, S1.Sdept FROM Student S1, Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=’刘晨’;


查询选修了课程名为“信息系统”的学生学号和姓名。
SELECT Sno, Sname FROM Student, SC, Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=’信息系统’;
SELECT Sno, Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Cousre WHERE Cname=’信息系统’));


查询其他系中比信息系某一学生年龄小的学生姓名和年龄
SELECT Sname, Sage FROM Student WHERE Sage


查询其他系中比信息系所有学生年龄都小的学生姓名及年龄
SELECT Sname, Sage FROM Student WHERE Sage


16)集合查询
查询计算机科学系的学生及年龄不大于19岁的学生
SELECT * FROM Student WHERE Sdept=’CS’ UNION SELECT * FROM Student WHERE Sage<=19;


查询选修了课程1或者选修了课程2的学生
SELECT Sno FROM SC WHERE Cno=’1’ UNION SELECT Sno FROM SC WHERE Cno=’2’;


查询计算机科学系的学生与年龄不大于19岁地学生的交集
SELECT * FROM Student WHERE Sdept=’CS’ AND Sage<=19;


查询选修课程1的学生集合与选修课程2的学生集合的交集
SELECT Sno FROM SC WHERE Cno=’1’ AND Sno IN (SELECT Sno FROM SC WHERE Cno=’2’);


查询计算机科学系的学生与年龄不大于19岁的学生的差集
SELECT * FROM Student WHERE Sdept=’CS’ AND Sage>19;


17) 插入数据
将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
INSERT INTO Student VALUES(‘95020’, ‘陈冬’, ‘男’, ‘IS’, 18);


插入一条选课记录(’95020’, ‘1’)
INSERT INTO SC(Sno, Cno) VALUES(‘95020’, ‘1’);


对每一个系,求学生的平均年龄,并把结果存入数据库
INSERT INTO Deptage(Sdept, Avgage) SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept;


18)修改数据
将学生95001的年龄改为22岁
UPDATE Student SET Sage=22 WHERE Sno=’95001’;


将所有学生的年龄增加1岁
UPDATE Student SET Sage=Sage+1;


将计算机科学系全体学生的成绩值为零
UPDAET SC SET Grage=0 WHERE ‘CS’=(SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno);


19)删除数据
删除学号为95019的学生记录
DELETE FROM Student WHERE Sno=’95019’;


删除所有的学生选课记录
DELETE FROM SC;

删除计算机科学系所有学生的选课记录
DELETE FROM SC WHERE ‘SC’=(SELECT Ddept FROM Student WHERE Student.Sno=SC.Sno);


20)建立视图
建立信息系学生的视图
CREATE VIEW IS_STUDENT AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept=’IS’;

建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系学生
CREATE VIEW IS_STUDENT AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept=’IS’ WITH CHECK OPTION;

WITH CHECK OPTION表示对视图进行UPDATE,INSERT, DELETE操作时要保持更新、插入或删除的行满足视图定义中的谓词(即子查询中的条件表达式)。
由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,DBMS会自动加上Sdept=’IS’的条件

建立信息系选修了1号课程的学生的视图
CREATE VIEW IS_S1(Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student, SC WHERE Sdept=’IS’ AND Student.Sno AND SC.Sno=’1’;


建立信息系选修了1号课程且成绩在90分以上的学生的视图
CREATE VIEW IS_S2 AS SELECT Sno, Sname, Grade FROM IS_S1 WHERE Grade>=90;
定义一个反映学生出生年份的视图
CREATE VIEW BT_S(Sno, Sname, Sbirth) AS SELECT Sno, Sname, 1996-Sage FROM Student;


将学生的学号及他的平均成绩定义为一个视图
CRDATE VIEW S_G(Sno, Gavg) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;


将Student表中所有女生记录定义为一个视图
CREATE VIEW F_Student(Stdnum, name Sex, age,dept) AS SELECT * FROM Student WHERE Ssex=’女’;


21)删除视图
删除视图IS_S1
DROP VIEW IS_S1;


22)查询视图
在信息系学生的视图中找出年龄小于20岁地学生
SELECT Sno, Sage FROM IS_Student WHERE Sage<20;


查询信息系选修了1号课程的学生
SELECT Sno, Sname FROM IS_Student, SC WHERE IS_Student.Sno=SC.Sno AND SC.Cno=’1’;


在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩
SELECT * FROM S_G WHERE Gavg>=90;


23)更新视图
为防止用户通过视图对数据进行增加、删除、修改时,有意无意的对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增删该数据时,DBMS会检查视图定义的条件,若不满足条件,则拒绝执行该操作。

将信息系学生视图IS_Student中学号为95002的学生姓名改为“刘辰”
UPDAET IS_Student SET Sname=’刘辰’ WHERE Sno=’95002’;


向信息系学生视图IS_S中插入一个新的学生记录,其中学号为95029,姓名为赵新,年龄为20岁
INSERT INTO IS_Student VALUES(‘95029’, ‘赵新’, 20);


删除计算机系学生视图CS_S中学号为95029的记录
DELETE FROM IS_Student WHERE Sno=’95029’;


视图的作用
1. 视图能够简化用户的操作
2. 试图使用户能以多种角度对待同一数据
3. 试图对重构数据库提供了一定程度的逻辑独立性
4. 试图能够对机密数据提供安全保护

24)授权
如果制定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予其他的用户。如果没有指定WITH GRANT OPTION子句,这获得某种权限的用户只能使用该权限,但不能传播该权限。

把查询Student表的权限授给用户U1
GRANT SELECT ON TABLE Student TO U1;


把对Student表和Course表的全部操作权限授予用户U2和U3
GRANT ALL PRIVILEGES ON TABLE Student, Course TO U2, U3;


把对表SC的查询权限授予所有用户
GRANT SELECT ON TABLE SC TO PUBLIC;


把查询Student表和修改学生学号的权限给用户U4
GRANT UPDATE(Sno), SELECT ON TABLE Student TO U4;


把对表SC的INSERT权限授予U5用户,并允许将此权限在授予其他用户
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;


DBA把在数据库S_C中建立表的权限授予U8
GRANT CREATTABLE ON DATABASE S_C TO U8;


把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno) ON TABLE Student FROM U4;


收回所有用户对表SC的查询权限
REVOKE SELECT ON TABLE SC FROM PUBLIC


把用户U5对SC表的INSERT权限收回
REVOKE INSERT ON TABLE SC FROM U5;


5. 关系数据理论
1NF –> 2NF –> 3NF -> BCNF -> 4NF
消除非主属性对码的部分函数依赖(1NF->2NF)
消除非主属性对吗的传递函数依赖(2NF->3NF)
消除非主属性对码地部分和传递函数依赖(3NF->BCNF)
消除非平凡且非函数依赖的多值依赖(BCNF->4NF)

6. 数据库恢复技术
事物具有是个特性:原子性、一致性、隔离性、持续性

你可能感兴趣的:(数据库)