资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,第四章 关系数据库语言,SQL,4.1SQL,简介,4.2查询语句,4.3数据更新,4.4数据定义,小结,4.1,SQL,简介,SQL,是,结构化查询语言,(,Structured Query Language),的缩写,是一种面向关系数据库的国际标准语言,在当前数据库领域中应用最为广泛和成功,美国国家标准局,ANSI,在1986年将,SQL,作为关系数据库系统的标准语言,后被国际标准化组织(,ISO),采纳为国际标准。现在很多大型数据库都实现了,SQL,语言。,4.1.1 SQL,语言的发展,SQL,的发展历程主要有以下几个阶段:,(1)1974年由,Boyce,和,Chamberlin,提出,当时称为,SEQUEL(Structured English Query Language)。,(2)19751979,年,IBM,公司对,SEQUEL,进行了修改,并由,San Jose Research Laboratory,研制了著名的关系数据库管理系统原型,System R,,实现了这种语言。,(3)1981年,IBM,推出了商用关系数据库,SQL/DS,,并将其改名为,SQL,,由于它功能丰富,语言简洁,因此倍受用户及计算机工业界欢迎,被众多计算机公司和软件公司所采用。,(4)目前,SQL,语言不仅用于小型数据库如,Foxpro、Access,,而且更广泛用于各种大型数据库,如,Sysbase、SQL Server、Oracle、Informix、DB2、Ingres,等。,SQL,在发展中经历了一系列标准化过程:,(1)1982年美国国家标准局(,American National Standard Institute,,简称,ANSI),开始制订,SQL,标准。,(2)1986年10月,ANSI,的数据库委员会,X3H2,批准了,SQL,作为关系数据库语言的美国标准;同年,ANSI,公布,SQL,语言的第一个标准,SQL-86,,并于次年由国际标准化组织(,International Standardization Organization,,简称,ISO),通过,SQL-86,标准。,(3)1989年,ISO,对,SQL-86,进行补充,推出,SQL-89,标准,也称,SQL1。,(4)1992年,ISO,又推出,SQL-92,标准,亦称,SQL2。,(5)1999,年起,ANSI,陆续公布增加了面向对象功能的新标准,SQL-99(,亦称,SQL3),的12个标准文本。,4.1.2 SQL,语言的特点,(1)非过程化:,SQL,语言是非过程化语言,在,SQL,语言中,只要求用户提出,“,做什么,”,,而无需指出,“,怎样做,”,。,SQL,语句操作的过程由系统自动完成。,(2)一体化:,SQL,可以操作于不同层次模式,集数据定义语言(,DDL)、,数据操纵语言,(,DML,)、,数据控制语言(,DCL),为一体。用,SQL,语言可实现,DB,生命周期的全部活动,其中包括建立数据库、建立用户账号、定义关系模式、查询及数据维护、数据库安全控制等。,(3)两种使用方式,统一的语法结构:,两种使用方式:,自含式,语言与,嵌入式,语言,自含式方式就是,联机交互,使用方式;,嵌入式方式是指,SQL,语句,嵌入某种高级程序设计语言的程序,中,以实现数据库操作。,尽管这两种使用方式不同,但,SQL,语言的语法结构基本是一致的。,4.1.3 SQL,语言的书写准则,遵从某种准则可以提高语句的可读性,通常遵循的准则主要有:,SQL,语句对大小写不敏感,但关键字常用大写,SQL,语句可写在一行上,但为便于理解,增强条理性,常习惯于每个字句占用一行,关键字不能在行与行之间分开,很少采用缩写形式,SQL,中的数据项需同时列出时,分隔符用,“,”,;字符或字符串常量的定界符用单引号,“,”,表示,4.2 查询语句,4.2.1 基本查询,4.2.2 使用列表达式,4.2.3,WHERE,从句的进一步使用,4.2.4 数据汇总,4.2.5 连接查询,4.2.6 嵌套查询,4.2.7 联合查询,4.2.8 使用系统内置函数的查询,SQL,的核心是数据查询,。,对于数据库的查询操作是通过,SELECT,查询命令实现的,它的基本形式由,SELECTFROMWHERE,查询块组成,多个查询块可以嵌套执行。,总述,SQL,查询语句的完整语法描述如下:,SELECT,ALL|DISTINCT ,,FROM,,,WHERE,GROUP BY,HAVING,ORDER BY,ASC|DESC ;,指定要显示的属性列,指定查询对象,指定查询条件,查询结果按指定列的值分组,筛选出只有满足指定条件的组,对查询结果表按指列值的升序或降序排序,4.2.1 基本查询,最基本的查询就是从指定的表中找出符合条件的记录。这样的查询由,SELECT,和,FROM,短语构成无条件查询,或由,SELECT、FROM,和,WHERE,或其他短语构成条件查询。,(1),简单的无,条件查询,设某个数据库中有表,stu_info,,请把该表中的所有记录的所有属性查询出来:,SELECT,*,/*,表示所有字段,是通配符,FROM,stu_info,/选定数据库中的表,(2),简单的条件查询,请查找,stu_info,表中所有的女生的信息,。,SELECT,*,FROM,stu_info,WHERE,xbm=,女,/设定条件,在,SELECT,子句中可以决定哪些列出现在结果关系中,这相当于关系代数中的投影运算。,具体办法:在,SELECT,子句之后不是写,“,*,”,,而是根据需要列出在,FROM,子句中声明的诸关系的属性。,例:,SELECT,xh,xm,/,选定字段,FROM,stu_info,/,选定数据库中的表,WHERE,xbm=,女,/,设定条件,(3)查询语句中的投影操作,使用,SQL,的,SELECT,可以将查询结果排序,排序的短语是,ORDER BY,,具体格式如下:,SELECT,列名,1,,列名,2,,,FROM,表名,WHERE,条件表达式,ORDER BY,列名,1 ASC|DESC,,,列名,2ASC|DESC,按升序(,ASC),或降序(,DESC),排序,允许按一列或多列排序。,(4)设定排序条件,下面是使查询结果排序的例子:,SELECT,*,/,“,*,”,表示所有字段,FROM,stu_info,/,选定数据库中的表,WHERE,xbm=,女,/设定条件,ORDER BY,xh,/,设定排序字段,在查询过程中经常会出现一些重复记录,例如,“,SELECT bh FROM stu_info,”,。,其查询结果将会有多个重复的班级名,,,显然这种结果不能令人满意。因此需要去掉重复值,此时需要指定,DISTINCT,短语:,SELECT,DISTINCT,bh,FROM stu_info,这里短语,DISTINCT,的作用是去掉查询结果中的重复值。执行结果中班级名都不重复。,(,5,)限定重复记录,4.2.2,使用列表达式,在,SQL,中,指定列的方法我们学习了以下两种:,(,1,)指定列,(,2,)使用通配符*,第(3)种是:可用,列表达式,,来获取经过计算的查询结果。,列表达式不仅可以是,算术表达式,,还可以是,字符串常量、函数,等。,(6)计算列值,SELECT,学号,xh,年龄,YEAR(GETDATE()-YEAR(CSRQ),bh,FROM,stu_info,(7)修改查询结果的列标题,(1),SELECT YEAR(GETDATE()-YEAR(CSRQ),AS,年龄,nl,FROM,stu_info,(2),SELECT,学号=,xh,nl,FROM,stu_info,(3),SELECT,xh,学号,nl,FROM,stu_info,查询工作的关键就在通过分析怎样把实际问题中的自然语言描述转化为,1)从哪个表中查询。即:,from,子句,2)要查询哪些列。即:,select,子句,3),要查询的条件。即:,where,子句,完成查询工作的三个关键步骤,其中第3步最复杂,4.1.3 WHERE,从句的进一步使用,常用的查询条件,查询条件,谓词,比较,=!20,(,9,)确定范围,between and,和,not between and,如:查询考试成绩在,60-70,之间的学号、课程号、考试成绩:,SELECT,xh,kch,kscj,FROM,xk,WHERE,kscj,BETWEEN 60 AND 70,(,10,)确定集合,IN,和,NOT IN,例:查询复材0108,、,复材0109班的学生的信息,SELECT,xh,xm,xbm,bh,FROM,stu_info,WHERE,bh,IN,(,复材0108,复材0109),(,11,)字符匹配,NOT LIKE,和,LIKE,与,%,和,_,搭配。,%,代表任意长度的字符串,.,如,a%b:acb,addgb,等都满足匹配,_,(,下横线,),代表任意单个字符。,例:查询班级名中第1个字为“计”字的学生信息:,SELECT,*,FROM,stu_info,WHERE,bh,like,计,%,例:查询名字中第2个字为“宁”字的学生信息:,SELECT,*,FROM,stu_info,WHERE,xm,like,_,宁,%,例:查询,DB_Design,课程的课程号和学分。,SELECT ckh,kcxf,FROM GCourse,WHERE km LIKE DB,_Design,ESCAPE,例:查询以,DB_,开头,且倒数第3个字符为,i,的课程的详细情况。,SELECT *,FROM GCourse,WHERE km LIKE DB,_%i_ _,ESCAPE,当用户要查询的字符串本身就含有%或 _ 时,要使用,ESCAPE,换码字符,短语对通配符进行转义。,(12),涉及空值的查询,SELECT,*,FROM,stu_info,WHERE,bh,IS NULL,(13),多重条件查询,用逻辑运算符,and,和,or,连接,,and,的优先级高于,or,。,如:查询应什么班,姓刘的学生。,SELECT,*,FROM,stu_info,WHERE,bh like,应,%,and,姓名,like,刘%,4.2.4 数据汇总,(14)聚合函数,count(*),统计元组(记录)个数,count(distinct|all),统计一列中值的个数,sum(distinct|all),求一列值的总和,(,数值型),avg(distinct|all),求一列值的平均数,max(distinct|all),求一列值中的最大值,min(distinct|all),求一列值中的最小值,聚合函数一览表,例:查询学生总数,SELECT,count(*),FROM,stu_info,例:已知数据库表,XK,中高等数学课程的代码为090101,查询学生选修高等数学的平均成绩:,SELECT,avg(KSCJ),AS,高等数学,FROM,XK,WHERE,KCH=090101,(,15,),GROUP BY,子句,Group by,子句将查询结果表按某一列或多列值分组,值相等的分为一组。,如:在表,xk,中查询各课程编号及相应的选课人数,注:,GROUP BY,子句中不能使用聚合函数,并且必须在,GROUP BY,子句中列出,SELECT,列表中所有的非聚合项。,例:在表,stu_info,中查询每个专业的男生、女生人数,在,group by,子句后面加,WITH ROLLUP,或,WITH CUBE,如果还要显示每个专业的总人数及全体学生总人数,如何实现?,SELECT,kch,count(xh),FROM,xk,GROUP BY,kch,SELECT,zyh,xbm,count(*)as,人数,FROM,stu_info,GROUP BY,zyh,xbm,例:查询选修了3门以上课程的学生及选课数:,SELECT,XH,COUNT(*),FROM,XK,GROUP BY,XH,HAVING,(COUNT(*)3),HAVING,短语指定分组或聚合的条件。只有满足条件的分组才被选出来,,HAVING,一般与,GROUP BY,子句一起使用。,(16),HAVING,短语,SELECT,XH,COUNT(*),FROM,XK,WHERE,(XH LIKE,2001,%),GROUP BY,XH,HAVING,(COUNT(*)3),例:查询学号前四位是2001的学生的学号及选课数:,having,短语指定选择组的条件,只有满足条件的组才被选出来。一般和,group by,子句一起使用,where,子句从基本表中选择满足条件的元组,而不是指定满足条件的分组,这是二者的根本区别。,若一个查询同时涉及两个以上的表,称为连接查询。,连接查询是关系数据库中最主要的查询,按连接类型可分为:,内连接、外连接和交叉连接,。其中内连接又分:,等值连接,、非等值连接和自然连接;外连接又分:左外连接、右外连接和全外连接等。,4.2.5 连 接 查 询,连接查询中用来连接两个关系的条件称为,连接条件,或,连接谓词,,格式:,表名,1.,列名,比较运算符,表名,2.,列名,其中比较运算符主要有:,=,、,、,=,、,=,、,!=,当连接运算符为,=,时,叫,等值连接,。,使用其它运算符称为,非等值连接,。,连接谓词中的列名称为,连接字段,。,例:查询每个学生及其选课情况,SELECT,*,FROM,stu_info,xk,WHERE,stu_info.xh=xk.xh,例:查询应化041班每个学生及其选修课程的情况,SELECT,stu_info.xh,stu_info.xm,stu_info.bh,stu_info.xbm,xk.kch,xk.kscj,FROM,stu_info,xk,WHERE,stu_info.xh=xk.xh,and,stu_info.bh=,应化041,/,复合条件连接,多表查询:涉及两个表以上的查询,SELECT,xm,FROM,stu_info,xk,gcourse,WHERE,gcourse.km=,数据库原理,and,gcourse.kch,=,xk.kch,and,xk.xh,=,stu_info.xh,为了简化,表名可以取别名,且别名只在本次查询有效,增加表别名后的结果:,SELECT,xm,FROM,stu_info a,xk b,gcourse c,WHERE,c.km=,数据库原理,and,c.kch,=,b.kch,and,b.xh,=,a.xh,例如:查询选修了有机化学这门课程的学生的姓名,下面讨论另一类基于多个关系的查询,这类查询,所要求的结果出自一个关系,,,但相关的条件却涉及多个关系,。在前面的例子中,,WHERE,之后是一个相对独立的条件,这个条件或者为真、或者为假。但是,有时需要用另外的方式来表达检索要求。比如,当检索关系,X,中的记录时,它的条件依赖于相关的关系,Y,中的记录属性值,这时使用,SQL,的嵌套查询功能将非常方便。,4.2.6 嵌 套,查 询,在,SQL,语言中,一个,select-from-where,语句称为一个查询块,将一个查询块嵌套在另一个查询块的,where,子句或,having,短语的条件中的查询称为,嵌套查询,。,等价形式:,SELECT,xm,FROM,stu_info,xk,WHERE,stu_info.xh,=,xk.xh,and kch,=05,SELECT,xm,FROM,stu_info,例:在,stu_info,表中查询选修了,05,号课程的学生姓名,WHERE,xh,IN,(,SELECT xh,FROM xk,WHERE kch=05,),例:查询与刘玉涛在同一个班学习的学生的学号、姓名、班级。,SELECT,xh,xm,bh,FROM,stu_info,WHERE,bh,IN,(17),带有,in,谓词的子查询,(18),带有比较运算符的子查询,例:查询与学号是,20029001,的学生在同一个班学习的学生,按学号排序。,SELECT,xh,xm,bh,FROM,stu_info,WHERE,bh,ORDER BY,xh,(SELECT bh,FROM stu_info,WHERE xm=,刘玉涛,),=,(SELECT bh,FROM stu_info,WHERE xh=20029001,),(19),带有,any,或,all,谓词的子查询,比较子查询通常用到操作符,ALL、ANY。,其通用格式为:,ALL|ANY,例:查询其他班级中比应化041班某个学生年龄小的那些学生的姓名和年龄。,SELECT,xm,nl,FROM,stu_info,WHERE,bh,应化041,and,nl,any,(,select,nl,from,stu_info,where,bh=,应化041),(20),带有,exists,谓词的子查询,EXISTS,是测试子查询是否有数据行返回,有则返回,TRUE,,,否则返回,FALSE,。,例:查询选修了高等数学(090101)的学生姓名、性别和班级。,SELECT xm,xbm,bh,FROM stu_info,WHERE,exists,(select*,from xk,where xh,=,stu_info.xh,and kch,=090101,),例:查询没有选修高等数学(090101)的学生姓名、性别和班级。,SELECT xm,xbm,bh,FROM stu_info,WHERE,not exists,(select*from xk,where xh=stu_info.xh and kch=090101),4.2.7,联合(集合)查询,select,语句的查询结果是元组的集合,所以多个,select,语句的结果可进行集合操作。,集合操作主要包括:,并操作,UNION,、交操作,INTERSECT、,差操作,MINUS,标准,SQL,只提供,UNION,,其语法格式如下:,SELECT_1,UNION,ALL SELECT_2,如果要将查询的结果保存在当前数据库新建的表,NEWSTU,中,可以使用,INTO,子句:,SELECT*,INTO,NEWSTU FROM a,UNION ALL,SELECT*FROM b,例:查询编号为,01,的学院的学生及所有学院的本科生,SELECT*FROM stu_info WHERE xsh=01,UNION,SELECT*FROM stu_info WHERE pyccm=,本科,4.2.8 使用系统内置函数的查询,(21)数学函数,ABS(,数字型表达式)、,RAND(,整型表达式),(22)字符串处理函数,ASCII(,字符型):返回表达式最左端字符的,ASCII,值,CHAR(0-255,之间的整数):将,ASCII,转换为字符,LEFT(,字符型,整型):返回从字符串左边开始指定个数的字符,LTRIM(,字符型):删除字符串最左边的空格,并返回字符串,REPLACE(,字符型1,字符型2,字符型3):用3替换1中包含的2,并返回替换后的表达式,SUBSTRING(express,start,length):,返回,express,中指定的部分数据,STR(float_exp,length,decimal):,将数字数据转换为字符数据,(23)系统函数,getdate(),:,返回当前的系统日期和时间,year()、month()、day(),:,分别返回指定日期的年、月、日,cast(,表达式,AS,数据类型):将表达式的值转换为数据类型参数所指定的类型。,case,函数:一种是简单的,CASE,函数,另一种是搜索型的,CASE,函数。,简单,CASE,语法格式:,CASE,输入表达式,WHEN,比较表达式,THEN,结果表达式,ELSE,表达式,END,搜索,CASE,语法格式:,CASE,WHEN,条件1,THEN,表达式1,WHEN,条件2,THEN,表达式2,ELSE,表达式,END,例,:,在,STU_INFO,中查询03学院学生的学号、姓名、性别,并将性别分别转换成,“,男生,”,、,“,女生,”,。,SELECT XH,XM,XBM,XBM=,CASE,男,WHEN XBM THEN,男生,ELSE,女生,END,FROM STU_INFO,WHERE XSH=03,例:查询成绩表,CS,中选修了,“,数据库技术及应用,”,课程的学生的学号、姓名、5分制成绩,SELECT,学号,姓名,5分制成绩,=,CASE,WHEN,成绩=60,AND,成绩=70,AND,成绩=80,AND,成绩=90,THEN,优秀,END,FROM CS,4.3,数据更新,4.3.1 插入数据,4.3.2,修改数据,4.3.3 删除数据,4.2.1,插入数据,语句格式,INSERT,INTO (,,),VALUES(,,),功能 将新元组插入指定表中。,(1)插入单个元组,例:,INSERT INTO,stu_info(xh,xm,xbm),VALUES,(2005090209,王东方,男),如果基本表只有上述三个属性,则该句等价于:,INSERT INTO,stu_info,VALUES,(2005090209,王东方,男),(2)插入子查询结果,例:在,STU_INFO,表中查询出应化041班的学生情况并存放在,YINGHUA,表中。,INSERT INTO,yinghua,SELECT xh,xm,xbm,csrq,FROM stu_info,WHERE bh=,应化041,语句格式,INSERT,INTO (,,),子查询,功能:将子查询结果插入指定表中,用以插入批量记录,4.3.2 修改数据,语句格式,UPDATE,SET=,,,=,WHERE,功能,修改指定表中满足,WHERE,子句条件的元组,(3)修改一个元组的值,UPDATE,stu_info,SET,bh=,材,0169,WHERE,xh=2005090209,注意:,对批量数据的修改,,,一定把将要修改的记录先查询出来,确认无误后再修改。,(4)修改多个元组的值,UPDATE,gcourse,SET,kcxf=2,(5)带子查询的修改语句,将选修了高数的学生的成绩加10分,UPDATE,xk,SET,kscj=kscj,+10,WHERE,kch,=,(,select kch from gcourse where km=,高等数学,),4.3.3 删除数据,语法格式,DELETE,FROM ,WHERE,功能,删除指定表中满足,WHERE,子句条件的,元组,WHERE,子句,指定要删除的元组,缺省表示要删除表中的所有元组,(6)删除一个元组的值,DELETE FROM,stu_info,WHERE,xh=2006050010,(7)删除多个元组的值,DELETE FROM,stu_info,WHERE,bh=,应0203,删除表中所有数据,DELETE FROM,stu_info,(8)带子查询的删除语句,将信息学院学生的成绩全部删除,DELETE FROM,xk,WHERE,12=,(,SELECT,xsh,FROM,stu_info,WHERE,stu_info.xh=xk.xh),注意:,在日常工作中,操作删除语句,一定要先查询要删除的数据,确认无误后再删除。,SELECT*,FROM xk,WHERE 12=,(select xsh from stu_info,where stu_info.xh=xk.xh),4.4,数据定义,4.4.1,定义基本表,4.4.2,修改基本表,4.4.3,删除基本表,4.4.4,视图,4.4.5,索引,4.4 数据定义,SQL,的数据定义语句,操作对象,操作方式,创建,删除,修改,表,create table,drop table,alter table,视图,create view,drop view,索引,create index,drop index,4.4.1 定义基本表,语句格式:,CREATE TABLE,(,,,,,),:所要定义的基本表的名字,:组成该表的各个属性(列),:涉及相应属性列的完整性约束条件,:涉及一个或多个属性列的完整性约束条件,例,:,建立一个学生表,Student,,它由学号,Sno、,姓名,Sname、,性别,Ssex、,年龄,Sage、,所在系,Sdept,五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。,CREATE TABLE Student,(,Sno VARCHAR(5)NOT NULL UNIQUE,,Sname VARCHAR(20)UNIQUE,,Ssex VARCHAR(1),,Sage INT,,Sdept VARCHAR(15),),Sno,Sname,Ssex,Sage,Sdept,字符型,长度为5不能为空值取值唯一,字符型,长度为20,字符型,长度为1,整数,字符型,长度为15,常用完整性约束,主码约束:,PRIMARY KEY,唯一性约束:,UNIQUE,非空值约束:,NOT NULL,默认值约束:,DEFAULT,检查约束:,CHECK,参照完整性约束:,FOREIGN KEY,REFERENCE,例:建立一个,“,学生选课,”,表,SC,,它由学号,Sno、,课程号,Cno,,修课成绩,Grade,组成,其中(,Sno,Cno),为主码。,CREATE TABLE SC,(,Sno VARCHAR(5),Cno VARCHAR(3),Grade int,Primary key(Sno,Cno),),例:创建表,n_jobs,CREATE TABLE n_jobs,(,job_id smallint IDENTITY(1,1)PRIMARY KEY CLUSTERED,job_desc varchar(50)NOT NULL DEFAULT(,新部门),min_lvl tinyint NOT NULL CHECK(min_lvl=12),max_lvl tinyint NOT NULL CHECK(max_lvl=250),),例:使用表达式(最低分+最高分)/2)生成中等分计算列。,CREATE TABLE,得分,(,最低分,int,最高分,int,中等分,AS,(,最低分+最高分)/2,),4.4.2 修改基本表,语法格式:,ALTER TABLE,ALTER COLUMN ,ADD 完整性约束 ,DROP ,:要修改的基本表,ALTER COLUMN,子句,:要更改的列,要更改的列不能是数据类型为,text,image,ntext,或,timestamp,等列,ADD,子句,:增加新列和新的完整性约束条件,DROP,子句,:删除指定的完整性约束条件或列名,1、添加列,例:向学生表中添加入学时间列,其数据类型为日期型,ALTER TABLE,stu_info,ADD,rxsj,DATETIME,可能破坏已有数据,2、,修改列,例:将教师表的,xb,列改为,smallint,数据类型,ALTER TABLE,gtech,ALTER COLUMN,xb smallint,3、删除列或约束,例:将数据库表,gtech,中的,xb,列删除,ALTER TABLE,gtech,DROP COLUMN,xb,例:删除学生姓名必须取唯一值的约束,ALTER TABLE,stu_info,DROP UNIQUE,(xm),4.4.3 删除基本表,语法格式:,DROP TABLE,基本表定义一旦删除,表中的数据、表上的索引和视图都将自动被删除,删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述。,例:删除,EDU_D,库中的表,stu_info,DROP TABLE,stu_info,4.4.4 视图,视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。,视图是从一个或多个基本表(或视图)导出的表,是个虚表。,数据库,只存放视图的定义,,不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以,视图的数据跟随基本表的数据而变化。,视图一旦被定义,就可以被查询、删除,修改及再定义一个新的视图等。,视图包含一系列带有名称的列和行数据。这些数据来自定义视图的查询所引用的基表中,并且在引用视图时,动态,生成。,1、定义视图,(1)用企业管理器建立视图,请同学们上机自己学习建立视图的方法。,(2)用,SQL,语句建立视图,CREATE VIEW,视图名,AS,WITH CHECK OPTION,其中,WITH CHECK OPTION,表示对视图进行,UPDATE、INSERT,和,DELETE,操作时要保证更新、插入或删除的行满足视图定义中的条件表达式,A、,选择列定义视图,可定义一个视图,该视图由表的部分列组成。下例中,视图,MyView1,包含了,employees,表中的三个列。,CREATE VIEW,MyView1,AS,SELECT lname,fname,FROM employee,定义了视图后,可以和表一样,使用,SELECT,语句访问它。,例如:,SELECT*FROM MyView1,B、,基于列的表达式定义视图,在定义视图时,除了使用基础表的列外,还可使用基本表的列的表达式,生成自己的列。,下例中,视图,MyView2,的第四列即由表达式计算而来。,CREATE VIEW,MyView2(xh,xm,xbm,nl),AS,SELECT xh,xm,,,xbm,,year(getdate()-year(csrq),FROM stu_info,C、,选择行定义视图,可定义一个视图,该视图由表的部分行组成。,下例中,视图,MyView3,只包含,employee,表中姓名包含,sh,的行。,CREATE VIEW,MyView3,AS,SELECT *,FROM employee,WHERE fname LIKE%sh%,D、,选择行和列,可定义一个视图,该视图由表的部分行和列联合组成。,下例中,视图,MyView4,只包括三列,CREATE VIEW,MyView4,AS,SELECT lname,fname,pub_id,FROM employee,WHERE fname LIKE%sh%,E、,基于多个表定义视图,CREAT VIEW,查询学生选课情况,AS,SELECT stu_info.xh,stu_info.xm,gcourse.km,FROM stu_info,gcourse,xk,WHERE stu_info.xh,=,xk.xh,and xk.kch,=,gcourse.kch,2、更新视图,更新视图是指通过视图来插入(,INSERT)、,删除(,DELETE)、,修改(,UPDATE),数据。由于视图是不实际存储数据的虚表,因此,对视图的更新最终要转换为对基本表的更新。,例、在,stu_info,表创建信息学院学生的视图:,CREATE VIEW,is_stu,AS,SELECT*FROM stu_info WHERE xsh=03,例:现将视图,is_stu,中学号为1998031001的学生的学院代号改为“12”:,UPDATE is_stu SET xsh=,12,WHERE xh=1998031001,WITH CHECK OPTION,会使记录从视图中消失,要注意这种问题,例:将,is_stu,中学号为1998031001的学生姓名改为“陈明亮”:,UPDATE is_stu SET xm=,陈明亮,WHERE xh=1998031001,AND xsh=03,3、管理和删除视图,(1)用企业管理器管理、删除视图。,上机实验,。,(2)用,SQL,语言删除视图,DROP VIEW,例:删除上例中建立的视图,is_stu,DROP VIEW is_stu,4、视图的作用,实现集中多表查询条件,提供了一个简单有效的安全机制,便于数据安全保护,便于用户重新组织数据,便于数据的交换操作,4.4.5 索引,索引是数据库中的一个列表,该列表包含了某个数据表中的一列或几列值的集合,以及这些值的记录在数据表中存储位置的物理地址。,索引类似于目录,,通过使用索引,在数据库中获取数据的时候,就可以不用扫描数据库中的所有数据记录,这样能够提高系统获取数据的性能。,建立索引是,加快查询速度,的有效手段,但索引的建立要占用额外的存储空间,也要更新,建立索引的一般准则:,(1)经常被查询的列。例如经常在,WHERE,子句中出现的列。,(2)ORDER BY,子句中使用的列。,(3)作为主键或外键的列。,(4)列的值是惟一的列。,(5)两个或多个列经常同时出现在,WHERE,子句或连接条件中。,下列情况一般不适合建立索引:,在查询中很少被引用的列。,包含太多重复值的列。例如,stu_info,表中的,XB,列,只有,“,男,”,、,“,女,”,两个值,在此建立索引显然是无意义的。,1、建立索引,自动创建,在创建表时,如果创建了主键(,Primary Key),或唯一约束(,UNIQUE),,系统会自动创建一个唯一索引。,(2)用企业管理器创建,上机练习。,(3)用,SQL,语句创建,语句格式,CREATE,UNIQUE CLUSTER,INDEX,ON,(,);,用,指定要建索引的基本表名字,索引可以建立在该表的一列或多列上,各列名之间用逗号分隔,用,指定索引值的排列次序,,升序:,ASC,,降序:,DESC。,缺省值:,ASC,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);,唯一值索引,对于已含重复值的属性列不能建,UNIQUE,索引,对某个列建立,UNIQUE,索引后,插入新记录时,DBMS,会自动检查新记录在该列上是否取了重复值。这相当于增加了一个,UNIQUE,约束,聚簇索引,建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致,例:,CREATE,CLUSTER,INDEX Stu_sname,ON Student(Sname);,在,Student,表的,Sname,列上建立一个聚簇索引,而且,Student,表中的记录将按照,Sname,值的升序存放,2、修改和删除索引,(1)使用企业管理器,上机练习。,(2)使用,SQL,语句删除索引,DROP INDEX|,删除索引时,系统会从数据字典中删去有关该索引的描述。,例:删除,Student,表的,Stu_sname,索引。,DROP INDEX,Student.,Stu_sname,小结,SQL,查询语句是本章学习的重点和基础,要能够熟练掌握并运用,SQL,语句,
展开阅读全文