您的位置:首页 > 数据库

SQL语言的基本操作学习(二)

2017-01-21 17:38 155 查看
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 语言