1索引的创建和撤销
在SQL86和SQL89标准中,基本表没有关键码的概念,用索引机制弥补.索引属于物理存储的路径概念,而不是逻辑的概念.在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混杂在一起了.因此在SQL2中引入了主键概念,用户在创建基本表时用主键字句直接定义主键.但至今大多书关系DBMS仍使用索引机制,有索引创建和撤销语句,其功能仅限于查询时起作用.因此这里仍加以介绍.
(1)索引的创建
创建索引可用"CREATE INDEX”语句实现.其句法如下:
CREATE [UNIQUE] INDEX <索引名> ON <基本表名> (<列名序列>)
[例如]如果创建学生基本表S时,未使用主键子句,那么可以用建索引的方法来起到主键的作用:
CREATE UNIQUE INDEX S#_INDEX ON S(S#)
此处关键字UNIQUE表示每个索引值对应唯一的数据记录.
SQL中的索引是非显式索引,也就是在索引创建以后,用户在索引撤销前不会再用到该索引建的名,但是索引在用户查询时会自动起作用.一个索引键也可以对应多个列.索引排列时可以升序,也可以降序,升序排列用ASC表示,降序排列用DESC表示,默认时表示升序排列.譬如,可以对基本表SC中的(S#,C#)建立索引:
CREATE UNIQUE INDEX SC_INDEX ON SC (S# ASC,C# DESC).
2 ,索引的撤销
当索引不需要时,可以用"DROP INDEX”语句撤销,其句法如下:
DROP INDEX <索引名>
[例] 撤销索引S#_INDEX和SC_INDEX,可用了下列语句:
DROP INDEX S#_INDEX,SC_INDEX
(2)SELECT语句使用时有三种写法:连接查询,嵌套查询和带存在量词的嵌套查询.
[例]对于教学数据库中的四个关系:
教师关系 T(T#, TNAME,TITLE)
课程关系 C (C#, CNAME,T#)
学生关系 S(S#,SNAME,AGE,SEX)
选课关系 SC (S#,C#,SCORE)
用户有一个查询语句:检索学习课程号为C2课程的学生学号与姓名.这个查询要从基本表S和SC中检索数据,因此可以有下面三种写法.
第一种写法(连接查询):
SELECT S.S#, SNAME
FROM S SC
WHERE S.S#=SC.S# AND C#=’C2’;
这个语句执行时,要先对FROM后的基本表S和SC做笛卡尔积操作,然后再做等值连接(S.S#=SC.S#),选择(C#=’C2’)和投影等操作.由于S#在S和SC中都出现,因此引用时需备注上基本表名,如S.S#,SC.S#等
第二种写法(嵌套查询):
SELECT S#, SNAME
FROM S
WHERE S# IN (SELECT S# FROM SC WHERE C#=’C2’);
这里外层WHERE子句中嵌有一个SELECT语句,SQL允许多层嵌套.这里嵌套的子查询在外层查询处理之前执行.即先在基本表SC中求出选修课程C2的S#值,然后再在表S中据S#值求出SNAME值.
由此可见,查询涉及多个基本表时用嵌套结构逐次求解层次分明,具有结构程序涉及特点.并且嵌套查询的执行效率也比连接查询的笛卡尔积效率高.在嵌套查询中,IN是常用到的谓词,其结构为"元组IN(集合)",表示元组在集合内.在上述查询中,S时基本表名,但应看成时元组变量,取自于基本表S中的元组.而列名S#,C#等应看成是元组分量.从这里可以看出,SQL语句有元组演算特点.这个查询的嵌套写法还可以有另外一种:
SELECT S# , SNAME
FROM S
WHERE ‘C2’ IN (SELECT C# FROM SC WHERE S#=S.S#);
此处内层查询称为"相关子查询",子查询中查询条件依赖于外层查询中的某个值,所以子查询的处理不只一次,要反复求值,以供外层查询使用.
第三种写法(使用存在量词的嵌套查询):
SELECT S#, SNAME
FROM S
WHERE EXISTS (SELECT * FROM SC WHERE SC.S#=S.S# AND C#=’C2’);
此处"SELECT *” 表示从表中取出所有列.谓词EXISTS表示存在量词E,其语义是内层查询的结果应该为非空(即至少存在一个元组).
[例]对于教学数据库中的四个基本表T,C,S,SC,下面用SELECT语句表达以下各种查询语句.
(1)检索学习课程号为C2的学生学号与成绩.
SELECT S# , SCORE
FROM SC
WHERE C#=’C2’;
(2) 检索至少选修LIU老师所传授课程中一门课程的学生学号与姓名.
SELECT S.S#, SNAME
FROM S,SC, C, T
WHERE S.S#=SC.S# AND SC.C#=C.C#
AND C.T#=T.T# AND TNAME=’LIU’;
在WHERE子句的条件表达式F中可使用下列运算符:
算术比较运算符:<,<=,>,>=,=,<>或!=. 逻辑运算符: AND,OR,NOT
集合成员资格运算符:IN,NOT IN
谓词:EXISTS(存在量词),ALL,SOME,UNIQUE
聚合函数:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(计数)
F中运算对象还可以是另一个SELECT语句,即SELECT语句可以嵌套
另外,SELECT语句的查询结果之间还可以进行集合的并,交,差操作,其运算符时:集合运算符:UNION(并),INTERSECT(交),EXCEPT(差)
由于WHERE子句中条件表达式可以很复杂,因此SELECT句型能表达的语义远比演变前的关系代数表达式复杂得多,SELECT语句能表达所有的关系代数表达式.....
SQL语言的基本操作学习(二)
最新推荐文章于 2020-12-05 04:48:52 发布