王珊的第五版数据库系统概论--第三章总结概述

第三章 关系数据库标准语言SQL

王珊的第五版数据库系统概论--第三章总结概述_第1张图片

王珊的第五版数据库系统概论--第三章总结概述_第2张图片

基本表:本身独立存在的表,SQL中一个关系就对应一个基本表,一个(或多个)基本表对应一个存储文件,一个表可以带若干索引。

存储文件:逻辑结构组成了关系数据库的内模式,物理结构对用户是隐蔽的。

视图:从一个或几个基本表导出的表,数据库中只存放视图的定义而不存放视图对应的数据,视图是一个虚表,用户可以在视图上再定义视图。

模式:CREATE SCHEMA AUTHORIZATION WANG;
该语句没有指定<模式名>,<模式名>隐含为<用户名>

1.模式

在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。

DROP SCHEMA <模式名>
CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
仅当该模式中没有任何下属的对象时才能执行。

2.修改基本表

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

例如增加约束条件:ALTER TABLE Course ADD UNIQUE(Cname);

3.索引

建立索引的目的:加快查询速度

CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引????????????

修改索引:ALTER INDEX <旧索引名> RENAME TO <新索引名>

删除索引:DROP INDEX <索引名>;

4.视图

视图的特点:
1.虚表,是从一个或几个基本表(或视图)导出的表
2.只存放视图的定义,不存放视图对应的数据
3.基表中的数据发生变化,从视图中查询出的数据也随之改变

视图的作用:

1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
6.适当的利用视图可以更清晰的表达查询

语法:CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];

WITH CHECK OPTION:对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现。

DROP VIEW <视图名>[CASCADE];

**视图的更新会直接修改创建视图的基本表。**更新方法按照普通表的更新删除即可。

5.表查询–关注容易忽视的点

5.1 GROUP BY

GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。HAVING短语:只有满足指定条件的组才予以输出

GROUP BY子句分组: 细化聚集函数的作用对象,如果未对查询结果分组,聚集函数将作用于整个查询结果,对查询结果分组后,聚集函数将分别作用于每个组,按指定的一列或多列值分组,值相等的为一组 。HAVING中可以使用的聚集函数包括COUNT(),SUM(),AVG(),MAX(),MIN()等。但是WHERE子句中是不能用聚集函数作为条件表达式

SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;

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

5.2 LIKE ESCAPE

LIKE ‘’ ESCAPE ‘’. 后面的ESCAPE表示使用换码字符将通配符转义为普通字符。若like的值中含有,使用escape表示这个\只是转义字符,并不是真正需要查找字符串的值。

查询DB_Desi课程的课程号和学分。
SELECT CnoCcredit FROM Course WHERE Cname LIKE ‘DB_Desi’ ESCAPE '\ ’ ;

5.3 ANY/ALL谓词查询

使用ANY或ALL谓词时必须同时使用比较运算
语义为:
> ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
= ANY 大于等于子查询结果中的某个值
= ALL 大于等于子查询结果中的所有值

例如:SELECT Sname,Sage FROM Student
WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= ’ CS ') AND Sdept <> ‘CS ’ ; /*父查询块中的条件 */

​ SELECT Sname,Sage FROM Student
​ WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept= ’ CS ') AND Sdept <> ’ CS ’;

5.4 EXISTS存在谓词

查询没有选修1号课程的学生姓名。
SELECT Sname FROM Student
WHERE NOT EXISTS
(SELECT * FROM SC WHERE Sno = Student.Sno AND Cno=‘1’);

用EXISTS/NOT EXISTS实现全称量词 (任意x)P ≡ - (存在 x(- P)) 翻译:任意P=不存在非P.

SELECT Sname FROM Student
WHERE NOT EXISTS
(SELECT * FROM Course
WHERE NOT EXISTS
(SELECT * FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno)
);

用EXISTS/NOT EXISTS实现逻辑蕴涵(难点)p ->q ≡ - p∨q

5.5 集合查询

集合操作的种类:并操作UNION;交操作INTERSECT;差操作EXCEPT

UNION:将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组

例如:

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

2.查询既选修了课程1又选修了课程2的学生。
SELECT Sno FROM SC WHERE Cno=’ 1 ’
INTERSECT SELECT Sno FROM SC WHERE Cno='2 ';

3.查询计算机科学系的学生与年龄不大于19岁的学生的差集。

SELECT * FROM Student WHERE Sdept=‘CS’
EXCEPT SELECT * FROM Student WHERE Sage <=19; 这条语句等于如下语句:SELECT * FROM Student WHERE Sdept= ‘CS’ AND Sage>19;

5.6 插入

INTO子句
子查询 SELECT子句目标列必须与INTO子句匹配 值的个数 值的类型

例如:INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;

5.7 空值

用IS NULL或者IS NOT NULL来判断。

有三种情况字段不能取空值。属性定义(或者域定义)中
1.有NOT NULL约束条件的不能取空值
2.加了UNIQUE限制的属性不能取空值
3.码属性不能取空值

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