关系数据库标准语言SQ.ppt
- 文档编号:18136172
- 上传时间:2023-08-13
- 格式:PPT
- 页数:68
- 大小:288KB
关系数据库标准语言SQ.ppt
《关系数据库标准语言SQ.ppt》由会员分享,可在线阅读,更多相关《关系数据库标准语言SQ.ppt(68页珍藏版)》请在冰点文库上搜索。
第四章关系数据库标准语言SQL,罗盛,一、SQL概述,结构化查询语言全称:
StructuredQueryLanguage内容:
数据查询、数据定义、数据操纵和数据控制特点:
简结(命令少,功能强)一体化语言(包括数据定义,查询,操纵,和控制等,可以完成数据库活动的全部工作)高度非过程化(不必告诉计算机如何去做,而是描述用户要做什么)可命令交互使用,也可嵌入程序中使用,SQL命令动词表(笔试重点),查询技巧,首先读题义,从中抽出关键字打开查询的表、先浏览,从中找线索从题目中提取所要信息,作为条件对所得的条件进行有效的组合完善查询,二、SQL中的数据查询语句,数据库中的数据很多时侯是为了查询的,因此,数据查询是数据库的核心操作。
而在SQL语言中,查询语言中有一条查询命令,即SELECT语句。
基本形式:
SELECT-FROM-WHERE1基本查询语句【格式】SELECTALL|DISTINCTFROM【功能】无条件查询【说明】ALL:
表示显示全部查询记录,包括重复记录.DISTINCT:
表示去掉结果中的重复值.,短语说明:
SELECT说明要查询的数据,一般是字段名或由字段名组成的表达式(如每个仓库的工资),字段名之间用逗号隔开.FROM说明要查询数据的来源,后跟表名(可以是一个表或多个表,表名之间用逗号隔开)WHERE说明查询条件,即元组的选择条件,可以是任意复杂的逻辑表达式(相当于第一章专门关系运算中的”选择”操作)GROUPBY对查询结果进行分组,如查询每个仓库的平均工资,如果不用此语句,则求出的平均工资为所有仓库的平均工资,短语说明,HAVINE必须跟GROUPBY连用,用来限定分组必须满足的条件,例如查询平均工资多于1230的仓库信息例:
SELECT仓库.*FROM仓库,职工;WHERE仓库.仓库号=职工.仓库号;GROUPBY仓库.仓库号HAVINGAVG(工资)=1230ORDERBY用来对查询结果进行排序.如查询仓库的所有信息,并按面积排序SELECT*FROM仓库ORDERBY面积,1、简单查询,例4.1从职工关系中检索所有工资值分析:
关系指二维表,工资是要显示的结果字段,没有条件。
方法:
把信息插入SQL语句。
结果表示:
SELECT工资FROM职工SELECTDISTINCT工资FROM职工语句说明:
SELECT:
字段名(或查询的结果)FROM:
来源于哪张表DISTINCT:
是否要去掉等值的字段(即查询结果中的重复记录)。
例4.2检索仓库关系中的所有元组SELE*FROM仓库*:
是通配符,表示仓库表中的所有字段.在联接查询里,由于查询来源是两个或多个表,这时就需要用表名来限定*,如职工.*表示职工表里的所有字段.等同于:
SELECT仓库号,城市,面积FROM仓库例4.3:
检索工资多于1230元的职工号条件:
工资多于1230等价于工资1230显示字段:
职工号来源:
职工表SELECT职工号FROM职工WHERE工资1230,例:
4.4检索哪些仓库有工资多于1210元的职工分析:
工资多于1210元等价于工资1210仓库:
是要显示的字段信息,用仓库号来表示.SELEDIST仓库号FROM职工WHERE工资1210例:
4.5找出在仓库“WH1”或“WH2”工作,并且工资少于1250元的职工号条件:
(仓库号=“WH1”OR仓库号=“WH2”)AND工资1250语句:
SELE职工号FROM职工WHERE;(仓库号=“WH1”OR仓库号=“WH2”);AND工资1250“;”:
续行符号,2、连接查询,【说明】在一个数据库中的多个表之间一般都存在着某些联系,在一个查询语句中同时涉及到两个或两个以上的表时,这种查询称之为连接查询(也称为多表查询)。
在多表之间查询必须处理表与表之间的连接关系。
SELECTALL|DISTINCTFROM,.WHERE,简单的连接查询,针对多张表,一张表的结果要依靠另一张表为条件,才能查出.把两张表联接起来,形成逻辑上的一张表.技巧:
找两张表之间的公共字段及联接条件结构:
SELEFROM表1,表2WHERE;联接条件(或者两张表的公共字段)AND;联接条件:
表名.字段名(或者表的别名.字段名),例4.6找出工资多于1230元的职工号和他们所在城市.注意:
一张表查询不能完成,结果需要两张表,职工表只有职工号,而仓库表有中只有城市.他们的公共字段为仓库号.联接条件:
职工.仓库号=仓库.仓库号(只要是联接查询,都要写联接条件,所以一般写完查询来源,就接着写联接条件,再写其他条件,写完其他条件再写联接条件也行)一般条件:
工资1230两张表:
职工,仓库显示字段:
职工号,城市语句:
SELE职工号,城市FROM职工,仓库;WHERE(职工.仓库号=仓库.仓库号)AND(工资1230),例4.7找出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市.分析条件:
面积400联接条件:
(职工.仓库号=仓库.仓库号)查询涉及表:
仓库,职工查询结果字段:
职工号,城市语句:
SELE职工号,城市FROM仓库,职工WHERE;(面积400)AND(职工.仓库号=仓库.仓库号),3、嵌套查询,外查询的条件来自内查询的结果在SQL语句中,一个SELECTFROMWHERE语句称为一个查询块。
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询或子查询。
IN:
属于关系,返回多个值NOTIN:
属于关系联接条件:
公共字段名INSELE公共字段名(相当于联接中条件:
表1.公共字段名=表2.公共字段名),例4.8哪些城市至少有一个仓库的职工工资为1250元?
SELE城市FROM仓库WHERE仓库号IN;(SELE仓库号FROM职工WHERE工资=1250)IN:
属于关系,返回多个值注意:
仓库号IN(SELE仓库号相当于连接的条件:
仓库.仓库号=职工.仓库号,例4.9查询所有职工的工资都多于1210元的仓库的信息.分析:
从题中可看出,相当于查找没有一个职工的工资少于或等于1210元的仓库信息SELE*FROM仓库WHERE仓库号NOT;IN(SELE仓库号FROM工资=1210)分析没有错,但实际结果错了。
应该为SELE*FROM仓库WHERE仓库号NOTIN;(SELE仓库号FROM工资WHERE工资=1210)AND仓库号IN(SELE仓库号FROM职工),例4.10找出和职工E4工资相同的所有职工.SELE职工号FROM职工WHERE工资=(SELE工资FROM职工WHERE职工号=“E4”)注意:
=与IN之间的关系,等号可以用IN来替换,而IN不能用=替换=:
返回的值是一个具体的值IN:
返回的是多个值,4、几个特殊运算符,BETWEENAND两者之间(包含两者在内)LIKE:
匹配或者含有!
=,:
不等于注意:
通配符(%和-):
%代表多个字符,-单代表单个字符.而在我们的第三章用*代表多个,?
代表单个,不能用(*和?
),例4.11检索出工资在1220元到1240元范围的职工信息.SELE*FROM职工WHERE工资BETWEEN1220AND1240或者SELE*FROM职工WHERE(工资=1210)AND(工资=1240)例4.12从供应商关系中检索出全部公司的信息,不工厂或其它供应商的信息.SELE*FROM供应商WHERELIKE”%公司”,例4.13找出不在北京的全部供应商信息.SELECT*FROM供应商WHERE地址!
=“北京”或者SELE*FROM供应商WHERENOT(地址=“北京”)注:
地址!
=“北京”与NOT(地址=“北京”)等价,只是表达方式不同,五、排序(重点),ORDERBYASC/DESCASC升序,如果排序字段后缺省不写,则默认按升序排序.DESC降序例4.14按职工的工资值升序检索出全部职工信息.SELE*FROM职工ORDERBY工资ASC,例4.15先按仓库号排序,再按工资排序并输出全部职工信息。
注:
这句话可这样叙述,对职工表的仓库号进行排序,如果仓库号相同再按工资排序SELE*FROM职工ORDERBY仓库号DESC,工资注:
ORDEBY不能用在子查询中,BY的后面直接跟上需要排序的字段名,如果是对两个字段进行排序,字段名之间用逗号隔开.,6、简单的计算查询,SQL不仅具有一般的检索能力,而且还有计算方式的检索用于计算检索的函数:
COUNT()-计数SUM()-求和AVG()-求平均值MAX()-求最大值MIN()-求最小值,查询产生新字段,查询中的新字段:
在查询的结果中多出一个统计或计算的字段定义格式:
SELESUM(工资)AS总工资FROM职工例:
SELECTAVG(工资)AS平均工资FROM职工例:
SELECTCOUNT(职工号)AS职工个数FROM职工,例4.16找出供应商所在地的数目SELECOUNT(DIST地址)FROM供应商注:
一般在使用COUNT()时使用DISTINCT例4.17求支付的工资总数SELESUM(工资)FROM职工例4.18求北京和上海的仓库职工的工资总和SELESUM(工资)FROM职工,仓库WHERE(城市=“北京”OR城市=“上海”)AND(职工.仓库号=仓库.仓库号)SELESUM(工资)FROM职工WHERE仓库号IN(SELE仓库号FROM仓库WHERE城市=“北京”OR城市=“上海”),例4.19求所有职工的工资都多于1210元的仓库的平均面积.SELEAVG(面积)AS平均面积FROM仓库WHERE仓库号notIN(SELE仓库号FROM职工WHERE工资=1210)and仓库号IN(SELE仓库号FROM职工)例4.20求在WH2仓库工作的职工的最高工资值.SELEMAX(工资)FROM职工WHERE仓库号=“WH2”,例:
求在广州工作的职工数SELECTCOUNT(DISTINCT职工号)FROM职工,仓库WHERE职工.仓库号=仓库.仓库号AND城市=广州“SELECTCOUNT(DISTINCT职工号)FROM职工WHERE仓库号IN(SELECT仓库FROM仓库WHERE城市=广州),7、分组与计算查询,格式:
GROUPBYHAVING什么时候使用分组:
需要统计、计算每个仓库、每个职工,每个学生等含有“每个”提示信息时用分组字段:
如每个职工就是职工号,每个学生就是学生的学号限定条件:
至少选修两门以课,至少两个职工GROUPBY一般跟在WHERE后,如果没有条件就跟在FROM之后,例4.21求每个仓库的职工的平均工资SELE仓库号,AVG(工资)FROM职工GROUPBY仓库号例4.22求至少有两个职工的每个仓库的平均工资SELE仓库号,COUNT(*),AVG(工资)FROM职工GROUPBY仓库号HAVINGCOUNT(*)=2(这里的*相当于职工号)注:
WHERE与HAVING的区别:
WHERE后的条件一般在分组之前,首先选择出满足条件的记录再分组;HAVING后的条件一般在分组之后,先分组后进一步限定分组条件,8、利用空值查询,空值:
指不确定的值判断是否为空:
ISNULL(空)ISNOTNULL例4.23找出尚未确定供应商的订购单SELE*FROM订购单WHERE供应商号ISNULLSELE*FROM订购单WHEREINSULL(供应商号)SELE*FROM订购单WHEREINSULL(供应商号)=.T.空值是一个不确定的值,不能用”=”运算符进行比较,所以不能用=NULL例4.24列出已经确定了供应商的订购单信息SELE*FROM订购单WHERE订购信息ISNOTNULLSELE*FROM订购单WHEREISNULL(订购信息),9、别名和自联接查询,别名:
别名不是必须的,但是在关系的自联接操作中,别名必不可少作用:
一般用在多表查询或多字段查询上公共的字段:
作为联接条件别名1.字段名=别名2.字段名自联接:
指同一关系中与其自身联接,例:
找出地址为北京,城市为北京的供应商名例:
根据雇员关系列出上一级经理及所领导的职工清单。
SELES.雇员姓名,“领导”,E.雇员姓名FROM雇员S,雇员EWHERES.雇员号=E.经理常量:
“领导“,10、内外层相关嵌套查询,这张表查询的结果要依靠这张表的另一个查询条件而取得,采用自我嵌套的方法来实现。
(内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果)方法:
嵌套条件为:
别名1.公共字段=别名2.公共字段员工号相同进行比较自嵌套和自联接的区别:
自联接通过公共的记录来联接,自嵌套通过公共字段来联接,例4.26列出每个职工经手的具有最高总金额的订购单信息。
SELEOUT.职工号,OUT.供应商号,OUT.订购日期,OUT.总金额FROM订购单OUTWHERE总金额=(SELEMAX(总金额)FROM订购单INNER1WHEREOUT.职工号=INNER1.职工号)SELECT*FROM订购单WWHERE总金额=(SELECTMAX(总金额)FROM订购单NWHEREW.职工号=N.职工号),11、使用量词和谓词查询,格式:
ANYISOMEIALL(子查询)ANY、SOME:
查询的结果一行为真则结果为真。
ALL:
子查询中所有行为为真查询的结果就为真NOTEXISTS:
检查子查询中是否有结果返回。
NOTEXISTS与NOTIN之间联系:
可以相互转换,WHERENOTEXISTS(SELECT*WHEREA.仓库号=B.仓库号等价于仓库号NOTIN(SELECT仓库号区别:
NOTEXISTS指是否存在一个返回结果,它本身并没有任何运算和比较NOTIN指具体的返回值,例4.27检索那些仓库中还没有职工的仓库的信息这里的查询是没有职工或不存在职工,所以可以使用谓词NOTEXISTSSELECT*FROM仓库WHERENOTEXISTS;(SELECT*FROM职工WHERE仓库号=仓库.仓库号)注意:
这里的内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOTEXISTS才有意义.所以这类查询也都是内、外层互相关嵌套查询以上的查询等价于:
SELECT*FROM仓库WHERE仓库号NOTIN;(SELECT仓库号FROM职工),例4.28检索那些仓库中至少已经有一个职工的仓库的信息SELECT*FROM仓库WHEREEXISTS;(SELECT*FROM职工WHERE仓库号=仓库.仓库号)它等价于:
SELECT*FROM仓库WHERE仓库号IN(SELECT仓库号FROM职工)注意:
NOTEXISTS只是判断子查询中是否有或没有结果返回,它本身并没有任何运算或比较.,例4.29检索有职工的工资大于等于WH1仓库中任何一名职工工资的仓库号这个查询可以使用ANY或SOME量词SELECTDISTINCT仓库号FROM职工WHERE工资=ANY(SELECT工资FROM职工WHERE仓库号=“WH1”)它等价于:
SELECTDISTINCT仓库号FROM职工WHERE工资=(SELECTMIN(工资)FROM职工WHERE仓库号=“WH1”),例4.30检索有职工的工资大于或等于WH1仓库中所有职工工资的仓库号这个查询使用ALL量词。
SELECTDISTINCT仓库号FROM职工WHERE工资=ALL(SELECT工资FROM职工WHERE仓库号=“WH1”)它等价于:
SELECTDISTINCT仓库号FROM职工WHERE工资=(SELECTMAX(工资)FROM职工WHERE仓库号=“WH1”),12、超联接查询,内联接格式:
表1INNERJOIN表2on联接条件满足条件:
两张表都有的联接记录。
左联接格式:
表1LEFTJOIN表2ON联接条件满足条件:
两张表都有的联接记录,且满足左表中(表1)的记录,右联接格式:
表1RIGHTJOIN表2ON联接条件满足条件:
两张表都有的联接记录,且满足右表中(表2)的记录全联接格式:
表1FULLJOIN表2ON联接条件满足条件:
两张表都有的联接记录,且满足左表中(表1)和右表(表2)所有的记录注:
任何一种超连接,其连接的一般条件仍然用WHERE连接,内部联接即只有满足联接条件的记录才出现在查询结果中。
例4.31SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库(INNER)JOIN职工ON仓库.仓库号=职工.仓库号等价:
SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库,职工WHERE仓库.仓库号=职工.仓库号,左联接:
即除满足联接条件的记录出现在查询结果中外,第一个表中不满足联接条件的记录也出现在查询结果中。
例4.32SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库LEFTJOIN职工ON仓库.仓库号=职工.仓库号右联接:
即除满足联接条件的记录出现在查询结果中外,第二个表中不满足联接条件的记录也出现在查询结果中。
例4.33SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库RIGHEJOIN职工ON仓库.仓库号=职工.仓库号,全联接:
即除满足联接条件的记录出现在查询结果中外,两个表中不满足联接条件的记录也出现在查询结果中。
例4.34SELECT仓库.仓库号,城市,面积,职工号,工资FROM仓库FULLJOIN职工ON仓库.仓库号=职工.仓库号注:
JION的位置和ON联接条件相反例:
SELECT仓库仓库号,城市,面积,职工号,工资FROM供应商JION订购单JION职工JION仓库ON仓库.仓库号=职工.仓库号ON订购单.职工号=职工.职工号ON供应商号.供应商号=订购单.供应商号.,13、集合的并运算,将两个SELE的查询结果合并成一个查询结果,要求:
相同的字段、值域、数据类型、取值范围例:
显示结果为北京和上的仓库信息:
SELE*FROM仓库WHERE城市=“北京”;UNION;SELE*FROM仓库WHERE城市=“上海”等价于:
SELE*FROM仓库WHERE城市=“北京”OR城市=“上海”,14、查询去向,浏览方式显示记录(一般就是浏览)只显示前几项记录TOPPERCENTTOPN:
N表示的是132767之间的整数PERCENT:
表示的是0.0199.99的实数;说明显示结果中前百分之几的记录注:
TOP短语要和ORDERBY短语同时使用例4.35显示工资最高的3位职工的信息SELECT*TOP3FROMORDERBY工资DESCE例4.36显示工资最低的那30%职工的信息SELECT*TOP3PERCENTFROM职工ORDERBY职工号,将查询结果存放到数组中INTOARRAY数组名将查询结果存放在临时文件中INTOCURSOR临时文件名将查询结果存放在永久表中INTOTABLE/DBF表名将查询结果存放在文本文件中TOFILE文本.TXT将查询结果直接输出打印机中TOPRINTER,数据操作、定义,4、3操作功能,插入数据(INSERTINTO表名VALUES())格式1:
INSERTINTO字段名1,字段名2VALUES(具体值1,具体值2)如果要向表中所有字段都插入记录,可以不指定字段名例如:
在仓库表中插入(“WH5”,“合肥”,560)INSERTINTO仓库VALUES(“WH5”,“合肥”,360)如果只在仓库号和城市字段插入记录,则要指明字段名INSERTINTO仓库(仓库号,城市)VALUES(“WH5”,“合肥”),格式2:
INSERTINTOFROMARRAY|FROMMEMVARFROMARRAY从指定的数组中插入记录,若数组中元素小于字段数,没有值的字段用逻辑假来修改FROMMEMVAR根据同名的内存变量来插入记录值,如果同名内存变量不存在,那么相应的字段为默认值或空值.,更新数据(UPDATE-SET-WHERE),格式:
UPDATESETWHERE使用WHERE时,更新满足条件的字段值,一次可更新多个字段,每个字段之间用逗号隔开,如果不指定WHERE子句,则更新全部记录.注意和REPLACE的区别REPLACE:
需打开表,一次只能更新一个字段UPDATE:
可不打开表,一次可更新多个字段,删除数据(DELETEFROM-WHERE),格式:
DELETEFROMWHERE指定WHERE子句为删除满足条件的记录,如果不指定WHERE子句,则删除所有记录(这里删除是逻辑删除,如果要物理删除还要用PACK命令),4、4定义功能,1、表的定义功能:
定义表的字段名、类型、精度、比较及参照完整性、索引等。
CREATE(新建)TABLE/DBF根据指定的文件建立一个表NAME指定一个长表名FREE建立自由表NULL允许该字段为空值NOTNULL:
该字段不为空。
CHECK指定该字段的规则ERROR出错时的提示信息DEFAULT设默认值PRIMARYKEY建主索引UNIQUE建候选索引(不是唯一索引)NOCPTRANS只对于字符型和备注型字段定义该语句,PRIMARYKEY表达式TAG索引名,UNIQUEKEY表达式TAG索引名,FOREIGNKEY字段名TAG索引名REFERENCES表名TAG索引名FROMARRAY:
根据指定数组创建表,例:
利用SQL命令CREATE建立一个自由表,表名为“生产”,其结构如下:
字段名字段类型字段宽度序号N8名称C10生产量N10CREATETABLE生产FREE(序号N(8),名称C(10),生产量N(10)CREATETABLE生产1(序号N(8)PRIMKEYCHECK序号=0ERROR“序号大于零DEFA0,名称C(10),生产量N(10),例:
用命令建立订货管理数据库CREATDATA订货管理&.新建一张仓库表CREATETABLE仓库1(仓库号C(5)PRIMARYKEY仓库号TAGZKH,城市C(10)NULLDEFA.NULL.,面积I(3)CHECK(面积0)ERROR“面积应该大于零”),&.新建一张职工表CREATABLE职工1(仓库号C(5),职工号C(5)PRIMKEY,工资ICHECK(工资=1000AND工资=5000)ERROR“工资的范围在1000-5000之间”DEFA1200,FOREIGNKEY仓库号TAG仓库号REFE仓库1),&.新建一张供应表creatable供应商1(供应商号C(5)PRIMKEY,供应商名C(20),地址C(20)&.新建一张订购单表CREATETABLE订购单1(职工号C(5),供应商号C(5),订购单号C(5)PRIMKEY
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关系 数据库 标准 语言 SQ