基本表:本身独立存在的表,SQL中一个关系就对应一个基本表,一个(或多个)基本表对应一个存储文件,一个表可以带若干索引。
存储文件:逻辑结构组成了关系数据库的内模式,物理结构对用户是隐蔽的。
视图:从一个或几个基本表导出的表,数据库中只存放视图的定义而不存放视图对应的数据,视图是一个虚表,用户可以在视图上再定义视图。
模式:CREATE SCHEMA AUTHORIZATION WANG;
该语句没有指定<模式名>,<模式名>隐含为<用户名>
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
DROP SCHEMA <模式名>
CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
仅当该模式中没有任何下属的对象时才能执行。
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
例如增加约束条件:ALTER TABLE Course ADD UNIQUE(Cname);
建立索引的目的:加快查询速度
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引????????????
修改索引:ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引:DROP INDEX <索引名>;
视图的特点:
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];
**视图的更新会直接修改创建视图的基本表。**更新方法按照普通表的更新删除即可。
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短语作用于组,从中选择满足条件的组。
LIKE ‘’ ESCAPE ‘’. 后面的ESCAPE表示使用换码字符将通配符转义为普通字符。若like的值中含有,使用escape表示这个\只是转义字符,并不是真正需要查找字符串的值。
查询DB_Desi课程的课程号和学分。
SELECT CnoCcredit FROM Course WHERE Cname LIKE ‘DB_Desi’ ESCAPE '\ ’ ;
使用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 ’;
查询没有选修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;
INTO子句
子查询 SELECT子句目标列必须与INTO子句匹配 值的个数 值的类型
例如:INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;
用IS NULL或者IS NOT NULL来判断。
有三种情况字段不能取空值。属性定义(或者域定义)中
1.有NOT NULL约束条件的不能取空值
2.加了UNIQUE限制的属性不能取空值
3.码属性不能取空值