第3章-数据库原理(新)1_第1页
第3章-数据库原理(新)1_第2页
第3章-数据库原理(新)1_第3页
第3章-数据库原理(新)1_第4页
第3章-数据库原理(新)1_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

关系数据库标准语言SQL3.1SQL概述3.2数据定义3.3数据更新3.4查询3.5视图3.6存储过程3.7触发器3.8小结3.1SQL概述SQL:(StructuredQueryLanguage结构化查询化语言),不仅仅具有查询功能。它是一个通用的、功能极强的关系数据库操作语言。SQL的特点面向集合操作、高度非过程化集数据定义、数据查询和数据控制功能于一体统一语法结构的两种使用方式,简单易学

SQL功能主要包括三个方面:数据操纵数据定义数据控制SQL对关系数据库模式的支持SQL视图1基本表2存储文件1存储文件2基本表1基本表3基本表4视图2外模式模式内模式SQL语言支持关系数据库三级模式结构图

SQL语言支持关系数据库的三级模式结构,其中视图对应外模式,基本表对应模式,存储文件对应内模式。3.2数据定义SQL的数据定义功能:模式定义、表定义、视图和索引的定义定义模式格式:CREATESCHEMA<模式名>AUTHORIZATION<用户名>>[<表定义子句>|<视图定义子句>|<授权定义子句>]

如果没有指定<模式名>,那么<模式名>隐含为<用户名>定义模式实际上定义了一个命名空间在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。在CREATESCHEMA中可以接受CREATETABLE,CREATEVIEW和GRANT子句。定义模式[例]CREATESCHEMA

AUTHORIZATIONlyx1CREATETABLElyx1.TAB1(COL1SMALLINT,

COL2INT,

COL3CHAR(20),

COL4NUMERIC(10,3),

COL5DECIMAL(5,2));

为用户lyx1创建了一个模式lyx,并在其中定义了一个表TAB1。(注意:必须先建立一个用户lyx二、删除模式DROPSCHEMA<模式名><CASCADE|RESTRICT>CASCADE(级联)

删除模式的同时把该模式中所有的数据库对象全部撤消RESTRICT(限制)

如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。当该模式中没有任何下属的对象时才能执行。3.2.1定义语句格式定义基本表(CREATE)createtable

表名(列名数据类型[default缺省值][notnull][,列名数据类型[default缺省值][notnull]]……[,primarykey(列名[,列名]…)][,foreignkey

(列名[,列名]…)

references

表名(列名[,列名]…)] [,check(条件)]);createtableStudent(

Stu_nochar(8),

Stu_namevarchar(10)notnull,

Stu_age

tinyint,

Stu_sexchar(2),

Stu_deptvarchar(20),

CONSTRAINTpk_snoPRIMARYKEY(Stu_no))createtableCourse(

Cou_nochar(3),

Cou_namevarchar(16)notnull,

Cou_pnochar(3),

Cou_teachervarchar(10),

CONSTRAINTpk_cnoPRIMARYKEY(Cou_no))createtableSC(

Stu_nochar(8),

Cou_nochar(3),Gradedecimal(5,1),CONSTRAINTpk_scPRIMARYKEY(Stu_no,Cou_no),

foreignkey(Stu_no)referencesStudent(Stu_no),foreignkey(Cou_no)referencesCourse(Cou_no),

check((gradeisnull)or(gradebetween0and100)))三、删除基本表

DROPTABLE<表名>

基本表删除数据、表上的索引都删除表上的视图往往仍然保留,但无法引用.删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述[例]删除Student表

DROPTABLE

Student2、修改基本表ALTERTABLE<表名>[ADD<新列名><数据类型>[完整性约束]][DROP<完整性约束名>][ALTERCOLUMN<列名><数据类型>]<[例2]向Student表增加“入学时间”列,其数据类型为日期型。ALTERTABLEStudentADD

Stu_dateDATETIME不论基本表中原来是否已有数据,新增加的列一律为空值。

[例1]将年龄的数据类型改为半字长整数。

ALTERTABLEStudentALTERCOLUMN

stu_ageSMALLINT注:修改原有的列定义有可能会破坏已数据

数据更新

1插入数据2修改数据3删除数据[例1]将一个新学生记录()插入到Student表中。[例2]对每一个系,求学生的平均年龄,并把结果存入另一张表Dept_age。INSERTintoStudentVALUES(‘20028103’,‘张燕红',18,'女','信息');第一步:建表

CREATETABLEDept_age(SdeptCHAR(15),

AvgageSMALLINT)第二步:插入数据

INSERTINTODept_age(Stu_dept,Avgage)SELECTStu_dept,AVG(Stu_age)FROMStudentGROUPBYStu_dept2.修改数据语句表中的数据通常需要改变,可以使用UPDATE语句修改表中的数据。格式:UPDATEtablenameSET column=value[,column=value][WHERE condition]update语句包括三个子句:update语句指定要更新的表,set子句指定所有要改变数值的列和指定新值,where子句确定哪些行要被修改。如果省略where子句,则要对表中的每一行进行修改。【例3】将student表中学号为20026101的学生年龄修改为18。

【例4】将所有选修课程号为a01的成绩加2分,所有选修课程号为a03的成绩加3分。其余加1分。updatestudentsetstu_age=18wherestu_no='20026101';updatescsetgrade=casecou_nowhen'a01'thengrade+2when'a03'thengrade+3elsegrade+1end;思考题:请用SQL语句完成显示如下结果:selectstu_no

学号,cou_no

课程号,grade成绩,等级=casewhengrade>=90then'优秀'whengrade>=80then'良好'whengrade>=70then'中等'whengrade>=60then'及格'whengradeisnullthen'缺考'else'不及格'endfromsc

3.删除数据使用delete语句可从表中删除现有的数据。但不会释放表所占用的空间。如果用户确定要删除表的所有数据,那么使用”TRUNCATETABLE”语句速度更快。delete语句的操作可以回退,但TRUNCATETABLE语句的操作不能回退。格式:DELETEFROM<表名|VIEW>[WHERE条件];如果不用where子句,则会删除表中所有的行,使用where子句只删除满足条件的行。1.删除选修课程号为a01学生的成绩记录

deletefromscwherecou_no='a01';2.删除成绩表中所有的记录并释放表所占用的空间

truncatetableSC;begintrandeletefromscwherecou_no='a01';rollback3.2.2建立与删除索引建立索引是加快查询速度的有效手段建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引

PRIMARYKEYUNIQUE维护索引

DBMS自动完成

使用索引

DBMS自动选择是否使用索引以及使用哪些索引一、建立索引语句格式CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…)

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

[例6]为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(stu_no)CREATEUNIQUEINDEXCoucnoONCourse(Cou_no)CREATEUNIQUEINDEXSCnoONSC(stu_noASC,Cou_noDESC)唯一值索引:

对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束什么是聚簇?

为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇.聚簇索引建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中元组的物理顺序一致。在一个基本表上最多只能建立一个聚簇索引聚簇索引的用途:对于某些类型的查询,可以提高查询效率聚簇索引的适用范围:

很少对基表进行增删操作很少对其中的变长列进行修改操作聚簇的用途:

1.大大提高按聚簇属性进行查询的效率例:假设学生关系按所在系建有索引,现在要查询信息系的所有学生名单。信息系的500名学生分布在500个不同的物理块上时,至少要执行500次I/O操作。如果将同一系的学生元组集中存放,则每读一个物理块可得到多个满足查询条件的元组,从而显著地减少了访问磁盘的次数。2.节省存储空间聚簇以后,聚簇码相同的元组集中在一起了,因而聚簇码值不必在每个元组中重复存储,只要在一组中存一次就行了注意:一个基表不能建太多的索引;空值不能被索引只有唯一索引才真正提高速度,一般的索引只能提高30%左右。提高查询速度的方法还有在表上建立主键,主键与唯一索引的差别在于唯一索引可以空,主键为非空对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束。排序的字段如果通过索引去访问那将大大提高排序速度。对一些经常处理的业务表应在查询允许的情况下尽量减少索引。数据重复且分布平均的表字段尽量减少索引。假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。1.想知道在Student表上建的索引是个聚集索引还是一个非聚集索引,可用sp_helpstudent二、删除索引DROPINDEX<索引名>删除索引时,系统会从数据字典中删去有关该索引的描述。[例]删除Student表的Stusno索引。

DROPINDEXstudent.Stusno3.3查询3.3.1概述3.3.2单表查询3.3.3连接查询3.3.4嵌套查询3.3.5集合查询3.3.6小结语句格式:

SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>]…[WHERE<条件表达式>][GROUPBY<列名1>[HAVING<条件表达式>]][ORDERBY<列名2>[ASC|DESC]][COMPUTERBY]1.单表查询查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用集函数五、对查询结果分组

SelectingAllColumns

DEPTNODNAMELOC------------------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTONSELECT*FROM dept;

UsingArithmeticOperators

SELECTename,sal,sal+300FROM emp;ENAMESALSAL+300----------------------------KING50005300BLAKE28503150CLARK24502750JONES29753275MARTIN12501550ALLEN16001900...14rowsselected.

OperatorPrecedence

SELECTename,sal,12*sal+100FROMemp;ENAMESAL12*SAL+100-----------------------------KING500060100BLAKE285034300CLARK245029500JONES297535800MARTIN125015100ALLEN160019300...14rowsselected..查询经过计算的值

SELECT子句的<目标列表达式>为表达式算术表达式字符串常量函数列别名

[例5]查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECTstu_name,getdate()-stu_age,LOWER(stu_dept)FROMStudent;[例6]查询选修了课程的学生学号(消除取值重复的行)SELECTDISTINCT

stu_noFROMSC;[例7]使用列别名改变查询结果的列标题SELECT

stu_no

as

学号,stu_nameas

姓名FROMStudent;[例8]限制结果集返回行数SELECTTOP5stu_no

as

学号,stu_nameas

姓名FROMStudent;错datepart(yy,getdate())-stu_agea)数学函数:ABS(X),SQRT(X),EXP(X),RAND([SEED]),LOG(X)selectsqrt(144)b)字符串函数:+,ASCII(ch),CHAR(x),SPACE(n),UPPER(ch),LOWER(ch),LEFT(n),LEN(n),REPLACE(exp1,exp2,exp3)-用第3个表达式替代第一个表达式中出现的所有第二给定的表达式。

c)日期和时间函数:

GETDATE()--可以获得当前的日期和时间

CONVERT()-得到不同格式的日期和时间DATEPART()-得到日期和时间的一部分DATEDIFF()-返回两个日期所差的天数或月数或年数。DATEADD()-在向给定日期加上一段时间的基础上,返回新的日期值。d)聚合函数:AVG(),MAX(),MIN(),SUM(),COUNT()[例9]用“CS”替换学生表中专业字段中的“计算机”。

UPDATESTUDENTSETstu_dept=replace(stu_dept,,’计算机‘,’CS’)函数GETDATE()可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。[例10],假设有一个表用来保存站点上的活动日志。每当有一个访问者访问到的站点时,就在表中添加一条新记录,记下访问者的名字,活动,和进行访问的时间。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,CREATETABLEsite_log(usernameVARCHAR(40),

useractivityVARCHAR(100),

entrydate

DATETIMEDEFAULTGETDATE())要得到不同格式的日期和时间,使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒:SELECTCONVERT(VARCHAR(30),GETDATE(),9)注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间:101720046:54:24:397PM(1row(s)affected)表1日期和时间的类型类型值标准输出

0Defaultmon

dd

yyyy

hh:miAM1USAmm/dd/yy2ANSIyy.mm.dd

9Default+millisecondsmon

dd

yyyy

hh:mi:ss:mmmAM10USAmm-dd-yy11JAPANyy/mm/dd

13Europeyyyyhh:mi:ss:mmm(24h)只想得到日期和时间的一部分,而不是完整的日期和时间。例如,假设想列出的站点目录中每个站点被查询的月份。可以使用函数DATEPART():

SELECTsite_nameas‘站点名’,DATEPART(mm,site_entrydate)as‘月份’

FROMsite_directory函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。函数DATEPART()的返回值是一个整数。可以用这个函数抽取日期的各个不同部分,如表2所示。要以更易读的格式得到部分的日期和时间,可以使用函数DATENAME(),函数DATENAME()和函数DATEPART()接收同样的参数。但是,它的返回值是一个字符串,而不是一个整数。表2日期的各部分及其简写日期部分简写值yearyy1753--9999quarterqq1--4monthmm1--12dayofyeardy1--366daydd1--31weekwk1--53weekdaydw1--7(Sunday--Saturday)hourhh0--23minutemi0--59secondss0--59milisecondms0--999条件查询常用的查询条件不小于不大于[例11]查询所有年龄在20岁以下的学生姓名及其年龄。[例12]查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。[例13]查询信息系和计算机系学生的姓名和性别。[例14]查询既不是信息系,也不是计算机系的学生的姓名和性别。

1.SELECTStu_name,Stu_age

FROMStudentWHEREStu_age<20

或SELECTStu_name,Stu_age

FROMStudentWHERENOTStu_age>=203.SELECTStu_name,Stu_sexFROMStudentWHEREStu_dept

IN(‘计算机’,‘信息')4.SELECTStu_name,Stu_sexFROMStudentWHEREStu_dept

NOTIN(‘计算机’,‘信息')SELECTStu_name,Stu_dept,Stu_ageFROMStudentWHEREStu_ageBETWEEN20AND23字符串匹配

[NOT]LIKE‘<匹配串>’[ESCAPE‘<换码字符>’]通配符%(百分号)代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。_(下横线)代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。[]指定范围内的任意单个字符。例:LIKE‘[ck]%’[^]不在指定范围内的任意单个字符。当用户要查询的字符串本身就含有通配符时,要使用ESCAPE'<换码字符>'短语对通配符进行转义。<匹配串>:指定匹配模板,匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,可以用=运算符取代LIKE谓词,用!=或<>运算符取代NOTLIKE谓词[例15]查询学号为20026101的学生的详细情况[例16]查询所有姓刘学生的姓名、学号和性别[例17]查询姓“王”且全名为二个汉字的学生的姓名。[例18]查询名字中第2个字为“明”字的学生的姓名和学号[例19]查询所有不姓刘的学生姓名。[例20]查询DB_Design课程的课程号。

SELECT*FROMStudentWHEREStu_no

LIKE‘20026101'SELECTStu_name,Stu_no,Stu_sexFROMStudentWHEREStu_name

LIKE‘刘%’SELECTStu_nameFROMStudentWHEREStu_name

LIKE‘王__'SELECTStu_name,Stu_noFROMStudentWHEREStu_name

LIKE‘_明%'SELECTStu_name,Stu_no,Stu_sexFROMStudentWHEREStu_name

NOTLIKE'刘%'SELECTCou_noFROMCourseWHERECou_name

LIKE'DB\_Design'ESCAPE‘\'

涉及空值的查询使用谓词ISNULL或ISNOTNULL“ISNULL”不能用“=NULL”代替[例21]某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

SELECTstu_no,noFROMSCWHEREgradeISNULL对查询结果排序 使用ORDERBY子句:可以按一个或多个属性列排序.升序:ASC;降序:DESC;缺省值为升序[例22]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

SELECT*FROMStudent

ORDERBYstu_dept,stu_ageDESC作业:1将学生表按专业名排序,并汇总各专业人数和平均年龄。COMPUTEBY子句使您得以用同一SELECT语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。COMPUTE子句需要下列信息:可选的BY关键字,该关键字可按对一列计算指定的行聚合。行聚合函数名称;例如,SUM、AVG、MIN、MAX或COUNT。

select*fromstudentorderbystu_deptcomputeavg(stu_age),count(stu_dept),作业1:将学生表按专业名排序,并汇总各专业人数和平均年龄。select*fromstudentorderbystu_deptcomputeavg(stu_age),count(stu_dept)bystu_dept对查询结果分组[例23]查询各个课程号与相应的选课人数SELECTCno,COUNT(Sno)AS人数FROMSCGROUPBYCno;

sc

3

5

6

cno

sno------------------1980119902198032981229823298052980629807398213982239834398563986739834

CNO人数

----------------

132536作业2:在学生表上产生一个结果集,包括每个专业的男生人数,女生人数,总人数及学生人数。GROUPBY[字段名][WITH{CUBE|ROLLUP}]用ROLLUP汇总数据CUBE生成的结果集显示了所选列中值的所有组合的聚合。

ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合。

selects.stu_deptas专业名,s.stu_sexas性别,count(*)as人数

fromstudentsgroupbys.stu_dept,s.stu_sexwithrollup作业2:在学生表上产生一个结果集,包括每个专业的男生人数,女生人数,总人数及学生人数。在学生表上产生一个结果集,包括每个专业的男生人数,女生人数,总人数及男生总数、女生总数、学生总数。

selects.stu_deptas专业名,s.stu_sexas性别,count(*)as人数

fromstudentsgroupbys.stu_dept,s.stu_sexwithcube使用HAVING短语筛选最终输出结果

[例24]查询选修了3门以上课程的学生学号。

SELECTSnoFROMscGROUPBYSnoHAVINGcount(*)>3;

Sno------------------98019805[例25]

查找计算机专业平均成绩在85分以上的学生的学号和平均成绩。selectstu_no

学号,avg(grade)平均成绩

fromscwherestu_noIN(selectstu_nofromstudentwherestu_dept='计算机')groupbystu_nohavingavg(grade)>85;3.3查询3.3.1概述3.3.2单表查询3.3.3连接查询3.3.4嵌套查询3.3.5集合查询

连接查询比较连接查询自身连接复合条件连接连接查询中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:

[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>

其中比较运算符主要有:=、>、<、>=、<=、!=。当连接运算为=时,称为等值连接。使用其他运算符称为非等值连接。

连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。比较连接查询[例26]

SELECTStudent.*,Sc.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;SC表Student表查询结果自身连接[例27]查询每一门课的间接先修课(即先修课的先修课)课程”表即Course关系中,只有每门课的直接先修课信息,而没有先修课的先修课,要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程,这相当于将Course表与其自身连接后,取第一个副本的课程号与第二个副本的先修课号做为目标列中的属性T1表(Course表)T2表(Course表)结果为:SELECTT1.Cno,T2.CpnoFROMCourseT1,CourseT2WHERET1.Cpno=T2.Cno复合条件连接例29:查询选修a01号课程且成绩在90分以上的所有学生的学号及姓名。例30:查询所有学生的学号、姓名及所学的课程名及成绩。SELECTS.Stu_no

学号,S.Stu_name

姓名

FROMStudentS,SCWHERES.Stu_no=SC.Stu_no

ANDSC.Cou_no='a01'ANDSC.Grade>90selects.stu_no,s.stu_name,c.cou_name,sc.gradefromstudents,course

c,scwheres.stu_no=sc.stu_noandc.cou_no=sc.cou_no嵌套查询在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。例如:SELECTSname(外层查询/父查询)FROMStudentWHERESno

IN

(SELECTSno(内层查询/子查询) FROMSC WHERECno=‘2’)不相关子查询:子查询的查询条件不依赖于父查询相关子查询:子查询的查询条件依赖于父查询不相关子查询是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。[例]查询选修了课程名为“信息系统”的学生学号和姓名

SELECTSno,Sname

③最后在Student关系中

FROMStudent取出Sno和SnameWHERESnoIN(SELECTSno

②然后在SC关系中找出选

FROMSC修了3号课程的学生学号

WHERECnoIN(SELECTCno

①首先在Course关系中找出“信

FROMCourse息系统”的课程号,结果为3号

WHERECname=‘信息系统’));带有ANY或ALL谓词的子查询谓词语义ANY:任意一个值ALL:所有值>ANY 大于子查询结果中的某个值>ALL 大于子查询结果中的所有值<ANY 小于子查询结果中的某个值>ALL 小于子查询结果中的所有值[例31]查询其他系中比计算机系任意一个(其中某一个)学生年龄小的学生姓名和年龄

SELECTStu_name,Stu_ageFROMStudent

WHEREStu_age<ANY(SELECTStu_ageFROMStudentWHEREStu_dept='计算机')ANDstu_dept<>'计算机'/*注意这是父查询块中的条件*/结果

Sname Sage

王敏18执行过程1.DBMS执行此查询时,首先处理查询,找出IS系中所有学生的年龄,构成一个集合(19,18).2.处理父查询,找所有不是IS系且年龄小于19或18的学生.WHEREStu_age<(SELECTMAX(Stu_age)FROMStudentWHEREStu_dept='计算机')作业:1.检索平均成绩最高的学生学号。外连接(OuterJoin)外连接与普通连接的区别:

普通连接操作只输出满足连接条件的元组外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。左外连接(LEFTJOIN)右外连接(RIGHTJOIN)完全外连接(FULLJOIN)SELECTStudent.*,SC.*FROMStudentLEFTJOINSCONStudent.stu_no=SC.stu_no[例32]查询每个学生及其选修课程的情况包括没有选修课程的学生.带有EXISTS谓词的子查询1.EXISTS谓词存在量词

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则返回真值若内层查询结果为空,则返回假值由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义2.NOTEXISTS谓词[例33]查询没有选修a01号课程的学生姓名。

SELECTStu_nameFROMStudentWHERENOTEXISTS(SELECT*FROMSC

WHERE

Stu_no=Student.Stu_no

AND

Cou_no='a01')相关子查询首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。5.用EXISTS/NOTEXISTS实现全称量词(难点)SQL语言中没有全称量词

(Forall),可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:(

x)P≡

(

x(

P))[例34]查询选修了全部课程的学生姓名。(即不存在这样的课程,这门课该学生没有学过。(书P111)

7)πname(S|×|(πSNO,CNO(SC)÷πcno(C)))SELECTStu_nameFROMStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHEREStu_no=Student.Stu_noANDCou_no=S1.Cou_no))

[例35]查询至少选修了学生20028101选修的全部课程的学生号码。解题思路:用逻辑蕴函表达:查询学号为20028101的学生,对所有的课程y,只要20028101学生选修了课程y,则x也选修了y。形式化表示:用P表示谓词“学生20028101选修了课程y”用q表示谓词“学生x选修了课程y”

则上述查询为:(

y)p

q等价变换:(

x)P≡

(

x(

P))

(y)p

q≡

(

y(

(p

q))≡

(

y(

(

p∨q)≡

y(p∧

q)变换后语义:不存在这样的课程y,学生20028101选修了y,而学生x没有选。用NOTEXISTS谓词表示:

SELECTDISTINCTStu_no

学号

FROMSCXWHERENOTEXISTS(SELECT*FROMSCYWHEREY.Stu_no='20028101'ANDNOTEXISTS(SELECT*FROMSCZWHEREZ.Stu_no=X.Stu_noANDZ.Cou_no=Y.Cou_no))andStu_no!='20028101'视图视图作用建立视图删除视图查询视图更新视图视图的作用:视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。视图是从一个或多个基本表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可从另一个视图产生。视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反,基表数据的改变也会自动反映在由基表产生的视图中。由逻辑上的原因,有些视图可以修改对应的基表,有些则不能(仅查询)。建立视图一、视图的定义

格式:CREATEVIEW<视图名>[<列名1>[,…]AS<子查询>[WITHCHECKOPTION]不允许使用含有:SELECTINTO、COMPUTE或COMPUTERBY子句、ORDERBY子句在视图增删除时,检查视图定义条件,若不满足,则拒绝执行。1.对用户经常要用到的学号、姓名、课程名、成绩等数据建立视图。createviewstu_viewasselects.stu_no,s.stu_name,c.cou_name,sc.gradefromstudents,sc,coursecwheres.stu_no=sc.stu_noandsc.cou_no=c.cou_no2.用户经常要查询每个学生选修课(成绩非空)的门数和平均分,可以定义视图createviewgrade_view(s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论