【文档说明】数据库标准语言sql课件.ppt,共(100)页,716.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92421.html
以下为本文档部分文字说明:
1SQL语言的特点SQL语言的组成SQL的数据定义语句的使用SQL的数据查询语句的使用SQL的数据操纵语句的使用SQL的数据控制语句的使用本章要点:2SQL的工作原理SQL请求数据数据库DB数据库管理系统DB
MS当用户去要检索数据库的数据时通过SQL发出申请,DBMS对请求进行处理,将结果返回用户。3SQL的特点通用性强:集数据定义/数据操纵/数据控制功能于一体两种使用方式(统一的语法结构)方式一、独立的用于联机交互使用方式;方式二、嵌入到高级语言使用。面向集
合(表):改变以往操作方式(记录操作),建立表间(集合)的数据操作。易学易用:语法非常接近自然语言(英语)便于学习理解4SQL支持三级模式视图:是一个虚表。数据库中仅存视图定义,不存对应的数据。基
本表:独立存在的表。在SQL中一个关系对应一个表,每个基表对应一个存储文件,一个表可带若干索引。存储文件:逻辑结构组成数据库的内模式。存储文件+索引=内模式5外模式模式内模式Storefile1Storefile2Storefile3Storefile4Base
table1Basetable2Basetable3Basetable4View1View2SQL用户SQL支持关系数据库三级模式视图基本表存储文件6数据查询语言(DQL):querySELECT数据定义语言(DDL):definitionCREATE;DROP;ALTER数据操作语言(DM
L):manipulationINSERT;UPDATE;DELETE数据控制语言(DCL):controlGRANT;REVOKESQL的基本功能7SQL语言的语句表语言命令实现的功能DDLCREATE创建表DROP删除表ALTER修改表结构DQLSELECT查询数据库中满足指定条件
的记录DMLINSERT向表中插入记录UPDATE修改表中记录的数据DELETE删除表中符合条件的记录DCLGRANT给用户授权REVOKE收回用户的权限8数据定义功能CREATE;DROP;ALTER操作对象操作方式创建删除修改表CREAT
ETABLEDROPTABLEALTERTABLE视图CREATEVIEWDROPVIEW索引CREATEINDEXDROPINDEX用户创建或重新构建数据库的语言9基本表定义:CREATETABLE<表名>(<列名><数据类型>[<列级完整性约束>],<列名
><数据类型>[<列级完整性约束>],……,[<表级完整性约束>])[<其它参数>]Ÿ<表名>给出要创建的基本表的名称;Ÿ<列名>给出列名或字段名;Ÿ<数据类型>Ÿ<列级完整性约束>Ÿ<表级完整性约束>Ÿ<其它参
数>10数据类型11列级完整性约束用于定义列或字段一级的完整性约束,一般包括:NOTNULL和NULL约束PRIMARYKEY约束UNIQUE约束FOREIGNKEY约束DEFAULT定义CHEC
K约束12表级完整性约束用于定义表一级的完整性约束,一般包括:PRIMARYKEY约束(复合属性构成的主关键字说明)FOREIGNKEY约束(外部关键字及参照关系说明)CHECK约束(同时涉及到多个属性的域完整性约束)13其它参数不是SQL的标准选项,一般用于与物理存储
有关的说明,不同的数据库管理系统定义的方式肯定不同,另外该项参数一般也不是必需的。14建立表的例子物资订购管理数据库的扩展Bachman图1:n1:n1:n15仓库仓库号城市面积订购单职工号供应商号订购单号订购日期完成日期供应商供应商号供应商
名地址FK__订购单__供应商号__0BC6C43E职工仓库号职工号工资FK__职工__仓库号__014935CBFK__订购单__职工号__0AD2A005物资订购管理数据库在SQL中的实现1617例:建立仓库表CREATETABLE仓库(仓库号CHAR(5)PRIMARYKEY,城市CHAR
(10),面积INTCHECK(面积>0))18例:建立职工表CREATETABLE职工(仓库号CHAR(5)FOREIGNKEYREFERENCES仓库,职工号CHAR(5)PRIMARYKEY,工资INTCHECK(工资>=1000AND工资<=5000
)DEFAULT1200)19例:建立供应商表CREATETABLE供应商(供应商号CHAR(5)PRIMARYKEY,供应商名CHAR(20),地址CHAR(20))20例:建立订购单表CREATETABLE订购单(职工号CHAR(5)NOTNULLFOREIGNKEYRE
FERENCES职工,供应商号CHAR(5)NULLFOREIGNKEYREFERENCES供应商,订购单号CHAR(5)PRIMARYKEY,订购日期DATETIMEDEFAULTgetdate())21表级约束的例子假设职工关系的主关键字是(仓库号,职工号),则相应的命令如下:CREATETA
BLE职工(仓库号CHAR(5)FOREIGNKEYREFERENCES仓库,职工号CHAR(5),工资INTCHECK(工资>=1000AND工资<=5000)DEFAULT1200,PRIMARYKEY(仓库号,职工号)
)创建表23修改表结构命令ALTERTABLE<表名>ADD<列名><数据类型>[<列级完整性约束>]DROP<完整性约束名>|DROPCOLUMN<列名>|ALTERCOLUMN<列名><数据类型>[<列级完整性约束>]24增加新的属性(字
段)•往订购单关系中增加一个新属性“完成日期”ALTERTABLE订购单ADD完成日期DATETIMENULL25修改属性的定义•将订购单关系的完成日期属性的数据类型修改为SMALLDATETIMEALTERTABLE订购单ALTERCOLUMN完成
日期SMALLDATETIMENULL26删除完整性约束•建立的列级或表级完整性约束可以删除,但是前提是在定义完整性约束时必须给出约束名称,否则不能删除。设有:CREATETABLE职工(仓库号CHAR(5)FOREIGNKEYREFERENCES仓库,职工号CHAR(5)PRIMA
RYKEY,工资INTCONSTRAINTsalaryCHECK(工资>=1000AND工资<=5000)DEFAULT1200)则可以:ALTERTABLE职工DROPCONSTRAINTsalary27删除属性删除订购单关系中的“完成日期”属性:ALT
ERTABLE订购单DROPCOLUMN完成日期注意:有些系统的ALTERTABLE命令不允许删除属性,如果必须要删除属性,一般步骤是:先将旧表中的数据备份,然后删除旧表、并建立新表,最后将原来的数据恢复到新表中。28删除表命令格式:DROPTABLE<表名>例:DRO
PTABLE订购单29索引定义的命令格式CREATE[UNIQUE][CLUSTERED]INDEX<索引名>ON<表名>(<列名>[ASC|DESC][,<列名>[ASC|DESC]…])•普通索引•唯一(UNI
QUE)索引•聚集(CLUSTERED)索引30普通索引•如果没有指定UNIQUE或CLUSTERED等将建立普通索引。在单个字段上建立普通索引:CREATEINDEXsup_idxON订购单(供应商号)在多个字段上建立普通索引:CREATEINDEXsup_emp_idxON订购单(供应商号,职
工号DESC)31唯一索引通过指定UNIQUE则为表创建唯一索引(不允许存在索引值相同的两个元组)。在CREATETABLE命令中的UNIQUE约束将隐式创建唯一索引。在仓库关系的城市属性上建立一个唯一索引:CREATEUNIQUEINDEXcity_idxON
仓库(城市)32聚集索引通过指定CLUSTERED建立聚集索引。在CREATETABLE命令中的PRIMARYKEY约束将隐式创建聚集索引。一个表只允许建立一个聚集索引。如果在创建表时已经指定了主关键字,则不可以再创建聚集索引。33使用索引的原则:•不应该在一个表上建
立太多的索引(一般不超过两到三个),索引能改善查询效果,但也耗费了磁盘空间,降低了更新操作的性能,因为系统必须花时间来维护这些索引。•除了为数据的完整性而建立的唯一索引外,建议在表较大时再建立普通索引
,表中的数据越多,索引的优越性才越明显。34索引的删除命令格式:DROPINDEX<索引名>例:DROPINDEXcity_idxON仓库35数据操作功能插入功能:INSERT更新功能:UPDATE删除功能:DELETE36插入操作INSERT插入一个元组INSERTINTO<表名
>[(<列名>[,<列名>…])]VALUES(<表达式>[,<表达式>……])插入一个查询结果INSERTINTO<表名>[(<列名>[,<列名>…])]<SELECT查询>37插入操作举例插入一个完整的元组INSERTINTO仓库VALUES('WH5','沈阳',50
0)插入一个不完整的元组INSERTINTO仓库(仓库号,面积)VALUES('WH6',500)插入一个查询结果INSERTINTO订购单备份SELECT*FROM订购单先创建新表举例仓库表:INSERTINTO仓库VALUES('WH1','北京','370');INSERTIN
TO仓库VALUES('WH2','上海','500');INSERTINTO仓库VALUES('WH3','广州','200');INSERTINTO仓库VALUES('WH4','武汉','400'
);职工表:INSERTINTO职工VALUES('WH2','E1','1220');INSERTINTO职工VALUES('WH1','E3','1210');INSERTINTO职工VALUES('WH2','E4','1250');INSERTINTO职工VALUES('WH3',
'E6','1230');INSERTINTO职工VALUES('WH1','E7','1250');39更新操作UPDATE命令格式:UPDATE<表名>SET<列名>=<表达式>[,<列名>=<表达式>…][[FROM<表名>]WHERE<逻辑表达式>]UPD
ATE更新满足“逻辑表达式”条件的记录;一次可以更新多个属性的值;更新的条件可以与其他的表相关(使用FROM指定);如果没有指定更新条件则更新表中的全部记录。40更新操作举例给所有职工增加一倍的工资UPDATE职工SET工资=工资*2
给WH1仓库的职工提高10%的工资UPDATE职工SET工资=工资*2WHERE仓库号='WH1'给“上海”仓库的职工的工资提高到三倍UPDATE职工SET工资=工资*3FROM仓库WHERE仓库.仓库号=职工.仓库号AND城
市=„上海'41删除操作DELETEDELETEFROM<表名>[[FROM<表名>]WHERE<逻辑表达式>]DELETE命令从指定的表中删除满足“逻辑表达式”条件的元组;如果没有指定删除条件则删除表中的全部元组,所以在使用该命令时要格外小心;删除的条件可
以与其他的表相关(使用可选的FROM指定);DELETE命令只删除元组,它不删除表或表结构。42删除操作举例删除仓库关系中仓库号值是WH5的元组DELETEFROM仓库WHERE仓库号='WH5'删除所在城市
是上海的仓库的所有职工元组DELETEFROM职工FROM仓库WHERE仓库.仓库号=职工.仓库号AND城市='上海'43SQL的数据查询功能基本格式:SELECT……FROM……WHERE……44SQL查询SELECT[ALL|DIS
TINCT]{*|<目标列表达式>,…,<目标列表达式>}FROM<表名或视图名>[,<表名视图名>…][WHERE<条件表达式>][GROUPBY<列名>[,<列名>…][HAVING<表达式>]][
ORDERBY<列名>[ASC|DESC][,<列名>[ASC|DESC]..][COMPUTE…]45说明:要查询的数据,ALL说明不去掉重复元组,DISTINCT说明要去掉重复元组,<目标列表达式>一般是表中的列名,如果要查询表
中的所有列可以使用“*”表示SELECT[ALL|DISTINCT]{*|<目标列表达式>,…,<目标列表达式>}46FROM<表名或视图名>[,<表名或视图名>…]说明要查询的数据来自哪个(些)表(或视图),可以基于单个表或多个表进行查询47[WHERE<条件表达
式>]说明查询条件,即选择元组的条件,可以用于查询条件的运算符也非常丰富,下表列出了常用的运算符48GROUPBY<列名>[,<列名>…][HAVING<表达式>]GROUPBY短语用于对查询结果进行分组,可以利用它进行分组汇总;HAVING短语必须跟随GRO
UPBY使用,它用来限定分组必须满足的条件。49ORDERBY<列名>[ASC|DESC][,<列名>ASC|DESC]…用来对查询的结果进行排序。50[COMPUTE…]SQLServer支持的短语,可以进行带明细的分组汇总。51查询的分类简单查
询排序连接查询嵌套查询分组及计算查询52例:从职工关系中检索所有工资值解1:SELECT工资FROM职工结果1是:12201210125012301250解2:SELECTDISTINCT工资FROM职
工结果2是:1220121012501230简单查询53检索仓库关系中的所有元组SELECT*FROM仓库SELECT仓库号,城市,面积FROM仓库54检索工资多于1230元的职工号SELECT职工号FROM职工
WHERE工资>1230结果是:E4E755检索哪些仓库有工资多于1210元的职工SELECTDISTINCT仓库号FROM职工WHERE工资>1210结果是:WH2WH3WH156给出在仓库WH1或WH2工作,并且工资少于1250元的职工号SELECT
职工号FROM职工WHERE工资<1250AND(仓库号='WH1'OR仓库号='WH2')结果是:E1E357检索出工资在1220元到1240元范围内的职工信息SELECT*FROM职工WHERE工资BETWEEN1
220AND1240结果是:WH2E11220WH3E61230表达式“工资BETWEEN1220AND1240“等价于(工资>=1220)AND(工资<=1240)58从供应商关系中检索出全部公司的信息SELECT*FROM供应商WHERE供应商名LIKE'%公
司'结果是:S4华通电子公司北京这里的LIKE是字符串匹配运算符,通配符“%”表示0个或多个字符,另外还有一个通配符“_”(下划线)表示一个字符。59找出不在北京的全部供应商信息SELECT*FROM供应商WHERE地址!='北京'或SELECT*FROM供应商WHERENO
T(地址='北京')结果是:S3振华电子厂西安S6607厂郑州NOT的应用范围很广,比如,可以有NOTIN、NOTBETWEEN等。60找出尚未确定供应商的订购单SELECT*FROM订购单WHERE供应商号ISNULL结果是:
E6NULLOR77NULLE1NULLOR80NULLE3NULLOR90NULL注意:查询空值时要使用ISNULL,而=NULL是无效的,因为空值不是一个确定的值,所以不能用“=”这样的运算符进行比较。61列出已经确定了供应商的订购单信息SELECT*FROM订购单WHERE供
应商号ISNOTNULL结果是:E3S3OR912002-07-1300:00:00.000E7S4OR762002-05-2500:00:00.000E3S4OR792002-06-1300:00:00.00
0E1S4OR732002-07-2800:00:00.000E3S7OR672002-06-2300:00:00.00062排序ORDERBY<列名>[ASC|DESC][,<列名>[ASC|DESC]..可以对查询的结果进行排序,可以是升序或降序,可以
按多列排序。按职工的工资值升序检索出全部职工信息先按仓库号排序,再按工资排序并输出全部职工信息63按职工的工资值升序检索出全部职工信息SELECT*FROM职工ORDERBY工资结果是:WH1E31210WH2E11220WH3E61230WH2E41250WH1E7
125064先按仓库号排序再按工资排序SELECT*FROM职工ORDERBY仓库号,工资结果是:WH1E31210WH1E71250WH2E11220WH2E41250WH3E6123065连接查询当查询的结果出自多个表时,需要通过表之间的连接操
作来完成。一般连接外连接66一般连接(自然连接)常规的两个表或多个表之间的连接。找出工资多于1230元的职工号和他们所在的城市找出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市67找出工资多于1230元的职工号和他们所在的城市SELECT职工号,城市
FROM职工,仓库WHERE(工资>1230)AND(职工.仓库号=仓库.仓库号)SELECT职工号,城市FROM职工JOIN仓库ON职工.仓库号=仓库.仓库号WHERE工资>1230结果是:E4上海E7北京68找出工作在面积大于40
0的仓库的职工号以及这些职工工作所在的城市SELECT职工号,城市FROM仓库,职工WHERE(面积>400)AND(职工.仓库号=仓库.仓库号)SELECT职工号,城市FROM职工JOIN仓库ON职工.仓库号=仓库.仓库号WHERE面积>400结果是:E1上海E4上海69
外连接外连接与前面所介绍的等值连接和自然连接不同。原来的连接是只有满足连接条件,相应的结果才会出现在结果表中;而外连接可以使不满足连接条件的元组也出现在结果表中。按连接方式外连接又可以分为左连接(LEFT)、右连接(
RIGHT)和全连接(FULL)三种。70外连接(OUTER)运算的一般格式左连接在结果表中包含第一个表中满足条件的所有记录;如果是在连接条件上匹配的元组,则第二个表返回相应值,否则第二个表返回空值。右连接在结果表中包含第二个表中满足条件的所有记录;
如果是在连接条件上匹配的元组,则第一个表返回相应值,否则第一个表返回空值。全连接在结果表中包含两个表中满足条件的所有记录;如果是在连接条件上匹配的元组,则另一个表返回相应值,否则另一个表返回空值。SE
LECT<属性或表达式列表>FROM<表名>LEFT|RIGHT|FULL[OUTER]JOIN<表名>ON<连接条件>[WHERE<限定条件>]71举例:等值或自然连接SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库J
OIN职工ON仓库.仓库号=职工.仓库号结果是:WH2上海500E11220WH1北京370E31210WH2上海500E41250WH3广州200E61230WH1北京370E7125072例:仓库、职工左连接LEFTJOIN
SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库LEFTJOIN职工ON仓库.仓库号=职工.仓库号结果是:WH1北京370E31210WH1北京370E71250WH2上海500E11220WH2上海500E41250WH3广州200E61230WH4武汉400NULLNULL
右连接RIGHTJOIN?73嵌套查询普通嵌套查询使用量词的嵌套查询使用EXISTS的嵌套查询74普通嵌套查询当检索关系X中的元组时,它的条件依赖于相关的关系Y中的元组的属性值,这时使用普通的嵌套查询将非常方便。哪些城市至少有
一个仓库的职工的工资为1250元?找出和职工E4工资相同的所有职工。75哪些城市至少有一个仓库的职工的工资为1250元?SELECT城市FROM仓库WHERE仓库号IN(SELECT仓库号FROM职工WHERE工资=1250)结果是:北京上海
76找出和职工E4工资相同的所有职工。SELECT职工号FROM职工WHERE工资=(SELECT工资FROM职工WHERE职工号=“E4”)结果是:E4E777使用量词的嵌套查询在嵌套查询中可以使用ANY、S
OME、ALL等量词,它们的形式是:<表达式><比较运算符>[ANY|ALL|SOME](子查询)其中ANY和SOME是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果就为真;而ALL则要求子查询中的所有行都使结果为真
时,结果才为真。78检索有职工的工资大于或等于WH1仓库中任何一名职工的仓库号SELECTDISTINCT仓库号FROM职工WHERE工资>=ANY(SELECT工资FROM职工WHERE仓库号='WH1')SEL
ECTDISTINCT仓库号FROM职工WHERE工资>=(SELECTMIN(工资)FROM职工WHERE仓库号='WH1')等价于:结果是:WH1WH2WH379检索有职工的工资大于或等于WH1仓库中所有职工的工资的仓库号SELECTDISTINCT仓库号FROM职工WHERE
工资>=ALL(SELECT工资FROM职工WHERE仓库号='WH1')SELECTDISTINCT仓库号FROM职工WHERE工资>=(SELECTMAX(工资)FROM职工WHERE仓库号='WH1')等价于:结果是:WH1WH280使用E
XISTS的嵌套查询在嵌套查询中还可以使用[NOT]EXISTS,具体形式是:[NOT]EXISTS(子查询)EXISTS或NOTEXISTS是用来检查在子查询中是否有结果返回(即存在元组或不存在元组)。81检索哪些仓库中还没有职工的仓库的信息。SELECT*FROM仓库WHE
RENOTEXISTS(SELECT*FROM职工WHERE仓库号=仓库.仓库号)SELECT*FROM仓库WHERE仓库号NOTIN(SELECT仓库号FROM职工)等价于结果是:WH4武汉40082检索那些仓库中至少已经有一个职工的仓库的信息SELECT*FROM仓
库WHEREEXISTS(SELECT*FROM职工WHERE仓库号=仓库.仓库号)等价于SELECT*FROM仓库WHERE仓库号IN(SELECT仓库号FROM职工)结果是:WH1北京370WH2上海500WH3广州20083
注意:[NOT]EXISTS只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较。[NOT]EXISTS实际是一种内、外层互相关的嵌套查询,只有在内层引用了外层的值,这种查询才有意义。84分组及计算查询SQL语言不仅可
以从数据库中查询原始信息,而且还可以直接对查询结果进行计算和汇总。SQL语言支持分组的计算和汇总。用于计算检索的函数主要有:COUNT——计数SUM——求和AVG——计算平均值MAX——求最大值MIN——求最小值85找出供应商所在地的数目SELEC
TCOUNT(DISTINCT地址)FROM供应商结果为386求支付的工资总数SELECTSUM(工资)FROM职工结果是:6160SELECTSUM(工资)AS工资总和FROM职工结果是:工资总和616087求在“上海”仓库工作的职工的最高工资值SELECTMAX(工
资)FROM职工WHERE仓库号IN(SELECT仓库号FROM仓库WHERE城市=„上海’)结果是:125088求每个仓库的职工的平均工资SELECT仓库号,AVG(工资)平均工资FROM职工GROUPBY仓库号结果是:WH11230WH21235WH3123089求至少有两个职工的每个
仓库的平均工资SELECT仓库号,COUNT(*)职工人数,AVG(工资)平均工资FROM职工GROUPBY仓库号HAVINGCOUNT(*)>=2结果是:WH121230WH221235COMPUTE子句GROUPBY子句能完成汇总,但是却不能显示
细节。利用COMPUTE子句,汇总结果是附加在细节之后显示的,这样用户既能看到细节,又能看到汇总行。COMPUTE子句的格式COMPUTE<函数名>(<列名>)[,<函数名>(<列名>)…][BY<列名>[,<列名>…]]这里<函数名>只能是
用于SELECT计算查询的函数SUM、AVG、MIN、MAX和COUNT等。COMPUTE子句中的BY子句是用来说明分组的,如果在COMPUTE子句中不使用BY子句,则是对整个表进行汇总。这里使用BY子句,也必须使用ORDERBY子句,BY子句指出的列必须和ORDERB
Y子句指出的列顺序相同,但BY子句的列数可以少于ORDERBY子句的列数。列出职工全部记录并计算各仓库的平均工资和工资小计,最后给出全体职工的平均工资和工资总和SELECT仓库号,职工号,工资FROM职工ORDERBY仓库号C
OMPUTEAVG(工资),SUM(工资)BY仓库号COMPUTEAVG(工资),SUM(工资)结果是:WH1E31210WH1E71250Avgsum12302460WH2E11220WH2E41250Avgs
um12352470WH3E61230Avgsum12301230Avgsum12326160列出职工全部记录并计算全体职工的平均工资和工资总和SELECT仓库号,职工号,工资FROM职工COMPUTEAVG(工资),SUM(工资)结果是:WH2E1
1220WH1E31210WH2E41250WH3E61230WH1E71250Avgsum1232616094视图仓库号城市面积仓库号职工号工资仓库号城市职工号工资仓库号面积基本表视图95定义视图的命令视图是
根据对基本表的查询定义的,其命令格式如下:CREATEVIEW<视图名>AS<SELECT-查询块>从单个表派生出的视图从多个表派生出的视图96从单个表派生出的视图CREATEVIEWe_wASSELECT职工号,仓库号FROM职工CREATEVIEW
v_bjASSELECT仓库号,面积FROM仓库基于视图进行查询:SELECT*FROMe_w97从多个表派生出的视图CREATEVIEWv_empASSELECT职工号,工资,城市FROM职工,仓库WHERE职工.仓库
号=仓库.仓库号;职工号工资城市E11220上海E31210北京E41250上海E61230广州E71250北京对用户就好象一个表:98定义视图的例子:CREATEVIEWv_sal(职工号,月工资,年工资)ASSELECT职工号,工资,工
资*12FROM职工查询视图v_sal:SELECT*FROMv_sal结果:E1122014640E3121014520E4125015000E6123014760E712501500099视图的删除命令格式是:DROPVIEW<视图名>100几
点注意在执行插入、更新和删除操作时可能会受到关系完整性的约束,这种约束可以保证数据库中的数据是正确的。虽然视图可以像基本表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定限制。因为视图是由基本表导出的,对视图的任何操作最后都落实在基本表上,这些操作不能违背定
义在表上的完整性约束。