【文档说明】关系数据库标准语言SQL2课件.ppt,共(44)页,379.549 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92366.html
以下为本文档部分文字说明:
第六章关系数据库标准语言SQL6.1SQL语言的概述SQL是结构化查询语言,它包括:查询数据定义数据操纵数据控制SQL已经成为关系数据库的标准数据语言,掌握SQL语法可以很方便地对数据进行管理。SQL查询的特点:1)一体化语言。SQL提供的功能可以实现数据
库生命周期中的全部活动,包括:定义数据库和表的结构对表中的数据的录入、修改、删除、查询和维护数据库重构、数据库安全性控制2)高度非过程化。3)语言简洁。4)统一的语法结构对待不同的工作方式。命令窗口
以人机交互方式使用,程序设计中以程序方式使用。6.3SQL的查询功能常用的命令格式SELECT[DISTINCT][TOP<数值表达式]][PERCENT][字段名]FROM<表名>INTOTBALE<表名>WHERE<表达式1>[AND<
表达式2>……]GROUPBY<分组字段名>[HAVING<分组条件>ORDERBY<排序字段名>[DESC][ASC]…(ZW12.3)说明:基本子句:SELECT-FROM-WHERE操作子句:ORDER、
GROUP等子句SELECT子句:指定查询结果中的数据。FROM子句:指定查询的表。WHERE子句:指定查询的条件。6.3.1基本查询所谓基本查询:指无条件查询。由SELECT、FROM构成无条件查询.1、检索所有值
。例:显示职工表中的所有信息供应商表.dbf职工表.dbfSELE*FROM职工“*”是通配符,表示所有属性,即字段。这里的命令等同于:SELECT职工号,仓库号,工资FROM职工表2、去掉重复值的检索使用DISTINCT短语:去掉重值.例1
:显示职工表中的所有工资信息,要求不显示重复值。SELEDISTINCT工资FROM职工表例2:列出所有学生表中学生的姓名与年龄。使用SELE姓名,YEAR(DATE())-YEAR(出生日期)AS年龄fromstudent注:AS(列名)用于指定输出时使用的列标题,可以不同于字段名。6.3.2带
条件的查询1、使用WHERE短语的简单查询•查询基于单个表,可有简单的查询条件•由SELECT、FROM和WHERE短语构成条件查询。例1:查询职工表中所有仓库号为“WH1”的信息。SELE*FROM职工表WHERE仓库号=“WH1”例2:给出在仓库“WH1”或“WH2”
工作,并且工资少于1250元的职工号。SELECT职工号FROM职工表WHERE工资<1250AND;(仓库号=“WH1”OR仓库号=“WH2”)“;”,表示续行号.小结:上面的例子在FROM之后只指定了一个关系。12.12、使用WHERE短语的简单联接查询联接查询是基于多个关系的查
询,查询所要求的结果出自多个关系。在语句中要指定联接的条件,即多个关系的相同属性:表1.字段名=表2.字段名例3:找出工资多于1230元的职工号和他们所在的城市。SELE职工号,城市FROM职工表,仓库
表;WHERE(工资>1230)AND(职工表.仓库号=仓库表.仓库号)例4:找出工作在面积大于400的仓库的职工号以及这些职工工作所在的城市。SELECT职工号,城市FROM职工表,仓库表WHERE
;面积>400AND(职工表.仓库号=仓库表.仓库号)注意:1、这里的“职工.仓库号=仓库.仓库号”是联接条件。2、当FROM之后的多个关系中含有相同的属性时,这时必须用关系前缀“.”直接指明属性所属的关系。6.3.3、嵌套查询嵌套查询:指在SELE-FROM-WH
ERE查询块内部再嵌入另一个查询块,称为子查询。嵌套查询的运算:先计算子查询,然后将子查询的结果传给外层查询使用。查询所要求的结果:出自一个关系,但相关的条件却涉及多个关系。常用内层与外层嵌套的语句有:IN语句、ALL语句、ANY语句IN语句:IN(属于)或NOTIN(不
属于)即查询字段所需的值属于子查询中的结果。用法:<字段>IN(<子查询>)比如:查询职工E3所在仓库的城市.分析:此查询确定的内容:涉及两个表,即职工表和仓库表子查询为:在职工表中找出职工E3所在的仓库号(内层查询)查询的
条件为:职工号=“E3”查询的结果为:仓库号.wh1命令:SELE仓库号FROM职工表WHERE职工号=“E3”外层查询:在仓库表中找出仓库号属于子查询仓库号所对的城市。内外层的所属关系:仓库号IN命令:SELE城市FROM仓库
表WHERE仓库号IN此查询的完整的命令:SELE城市FROM仓库表WHERE仓库号IN;(SELE仓库号FROM职工表WHERE职工号=“E3”)例4:哪些城市至少一个仓库的职工工资为1250元?分析:此题为先在内查询中找出工资为1250元的仓库号,然后在
以此结果到仓库表中找出对应的城市。内层查询:查询的结果为:职工表中的仓库号查询的条件为:工资=1250(WH1、WH2)命令:SELE仓库号FROM职工表WHERE工资=1250外层查询:查询的结果为:仓库表的城市查询的条件为:仓库号属于内层查询的
所给的仓库号命令:SELE城市FROM仓库表WHERE仓库号IN此查询的完整的命令:SELECT城市FROM仓库表WHERE仓库号IN;(SELE仓库号FROM职工表WHERE工资=1250)(北京、
上海)ALL语句:功能:满足子查询结果的所有值用法:<字段><比较符>ALL(<子查询>)>ALL的语义为:大于子查询结果中的所有值(最高值).例5:检索有职工的工资大于或等于WH1仓库中所有职工工资的仓库号。分析:查询涉及的表只有职工表.内层查询:从职工表中查询出仓库号为
WH1的所有工资查询的信息:工资,数据出于职工表.查询的条件:仓库号为WH1命令:SELE工资FROM职工表WHERE仓库号=“WH1”(1210、1250)外层查询:查询出高于内层查询所提供的工资的所有仓库号,用量词ALL
,且写为:工资>=ALL同时要去掉重复的仓库号.命令:SELEDISTINCT仓库号FROM职工WHERE工资>=ALL此查询的完整命令:SELEDISTINCT仓库号FROMf:\vfp讲义\职工表;WHERE工资>=ALL;(SELE工资FRO
Mf:\vfp讲义\职工WHERE仓库号=”WH1”)注:这里只取工资大于或等于1250的仓库号ANY语句功能:满足子查询结果的任何一个值用法:<字段><比较符>ANY(<子查询>)>ANY的语义为:大于子查询结果中的某个值(最低值).例:检索所有
职工的工资大于或等于WH1仓库中任何一名职工工资的仓库号分析:查询涉及的表为职工表查询的信息:职工表中仓库号内层查询:从职工表中找出仓库号为WH1的职工工资外层查询:找出大于或等于WH1中任何一工资值的仓库号即工资>=ANYSE
LEDISTINCT仓库号FROM职工表WHERE工资>=ANY;(SELE工资FROM职工表WHERE仓库号=”WH1”)6.3.4查询结果处理1、排序输出(ORDERBY)使用ORDERBY短语,升序用ASC(可省略)、降序用DESC例:按职工的工资值升序检索出
全部职工信息.SELE*FROM职工表ORDERBY工资如果降序,则加上DESCSELE*FROM职工表ORDERBY工资DESC2、分组与计算查询使用GROUPBY<分组字段名>HAVING<分组条件>Having是分组条件,一般放在GROUPBY之后。GROUPBY子句
:将查询结果按一列或多列值分组,列值相等的为一组.HAVING短语:按一定条件对分组后的数据进行筛选.例1:求每个仓库的职工的平均工资.(按仓库分组)SELE仓库号,AVG(工资)FROM职工表GROUPBY仓库号例2:求至少有两个职工的每个仓库的平均工资SELE仓库号,AVG(工资)AS平均工
资FROM职工表GROUPBY仓库号HAVINGCOUNT(*)>=2注意:限制条件时一般用HAVINGCOUNT(*)>=N表示.(12.8)3、重定向输出INTO或TO子句,表示查询结果可以重定输出方向.1)使用短
语INTODBF/TABLE存入永久表.例:将查询到的每个仓库的职工的平均工资存放到表BB中SELE仓库号,AVG(工资)AS“平均工资”FROM职工表GROUPBY仓库号HAVINGCOUNT(*)>=2;INTOTABLEBB2)使用短语
INTOCURSOR存入临时表.例:将查询到的职工存放在临时表DBF文件TMP中SELE*FROM职工表INTOCURSORTMP3)使用短语TOFILE<文件名>存入文本文件SELE*FROM职工表TOFILEZKB6.3.5显示部分结果1、只显示前几项记录使用TOP短语
格式:TOP<数值>例:显示工资最高的三位职工的信息SELE*TOP3FROM职工表ORDERBY工资DESC注意:显示前几个数,应按要显示的字段排序。2、显示工资最低的那30%职工的信息使用PERCENT短语格式:TOP<数值>PERCENTSELE
*TOP30PERCENTFROM职工表ORDERBY工资复习上节课内容:1基本查询:SELE<查询的字段>FROM<表名>2带条件查询:SELE<查询的字段>FROM<表名>WHERE<条件>3连接查询:SELE<查询的字段>FRO
M<表名>;WHERE<条件>AND表1.字段名=表2.字段名4嵌套查询:所属值的查询:WHERE<字段名>INALL语句:满足子查询的所有值的查询ANY语句:满足子查询的任何一个值的查询5排序查询:ORDERBY<字段名>[DESC][
ASC]6分组查询:GROUPBY<字段名>HAVING<分组条件>7前几名的查询:TOP<数值>后带ORDERBY子句进行排序8显示百分的查询:PERCENT<数值><百分比符号>9查询的去向:存于表中:INTOTABLE/DBF<表名>存于临时表中:INTOCURSOR<
表名>存于文本文件:TOFILE<文件名>下面介绍利用SQL对表中数据进行运算的操作.6.3.6几个特殊运算符特殊运算符:BETWEEN…AND….表示值在什么范围。LIKE表示字符串相匹配,后面使用如下通
配符:“*“或“%“表示0个或多个字符,“?”表示任何一个字符。使用BETWEEN…AND….例1:检索出工资在1220元到1240元范围内的职工信息.SELECT*FROM职工表WHERE工资BETWEEN;1220AND1240例2:找出工资不在1220元和1240元之间的全部职工信息,用
命令:SELECT*FROM职工表WHERE工资NOTBETWEEN1220AND1240使用LIKE例3:从供应商关系中检索出全部公司的信息,不要工厂或其他供应商的信息。分析:这是一个检索全部公司的查询,应使用LIKE运算符。SELECT*FROM供应商表WHERE供应商
名LIKE“%公司”利用空值查询空值是指不确定的值,SQL支持空值。不确定:用ISNULL(空值),而不能用=NULL。确定值:用ISNOTNULL(不空值)。例1:找出尚未确定供应商的订购单。SELE*FROM订购单表WHER
E供应商号ISNULL例2:列出已经确定了供应商的订购单信息。SELE*FROM订购单表WHERE供应商号ISNOTNULL6.3.7简单的计算查询常用的短语有:COUNT-----计数SUM-------求和AVG-----计算平均值MAX-----求最大值MIN--
---求最小值1)计数:使用COUNT()(1)统计职工表中所有仓库号的数目SELECOUNT(DIST仓库号)AS“仓库数”FROM职工表(2)统计职工表中所有人数SELECOUNT(*)AS“所有人数”FROM职工表2)求和:使用SU
M()例:求支付的工资总数SELESUM(工资)AS“工资总额”FROM职工表3)计算平均值:使用AVG()例:求所有仓库的平均面积.SELEAVG(面积)AS“平均面积”FROM仓库表4)求最大值:使用MAX()例:求在WH2仓库工作的职工的最高工资值SELEMAX(工资)AS“最大工
资”FROM职工表WHERE;仓库号=”WH2”5)求最小值:使用MIN()例:求在WH2仓库工作的职工的最低工资值SELEMIN(工资)FROM职工表WHERE仓库号=”WH2”6.3数据定义•建立(C
REATE)数据对象•修改(ALTER)数据对象•删除(DROP)数据对象6.2.1建立表结构命令格式:Creatable/dbf<表名1>[free](<字段名><类型>(<宽度>[,<小数位数>]))[null/notnull]check[<条件表达式>[erro
r<出错显示信息>]][default<表达式>][primarykey/unique][references<表名2>[tag<标识>]例题1:建立一个自由表:人事档案(编号,姓名,性别,基本工资,出生年月),其中允许出生年月为空
值.Creatable人事档案free(学号C(7),姓名C(8),性别C(2),基本工资N(7,2),出生年月DNULL)例题2:建立父表:学生表.包括字段有:学号(C,5),姓名C(8),入学成绩N(5,1).其中学号为主关键字,成绩字段有效性规则为:入学成绩>0,其出错信息为“成绩
应该大于0”OPENDATA学生管理CREADBF学生表(学号C(7)PRIMARYKEY,姓名C(8);入学成绩N(5,1)CHECK(入学成绩>0)ERROR“成绩应该大于0”)例题3:建立一个候选表:CREATABL选课(学号C(5),课程号C(5),;成绩ICHE
CK(成绩>=0AND成绩<=100);ERROR“成绩值的范围0—100!”DEFAULT60,;FORIGNKEY学号TAG学号REFERENCES学生)6.2.2删除表命令格式:DROPTABLE<表名>功能:直接从磁盘上删除所指定的表文件.说明
:如果是数据库表,删除时数据库应处于打开状态.6.2.3修改表结构1修改字段:Altertable<表名>alter<字段名><字段类型>[<字段宽度>]如:Altertable仓库表alter仓库号C(7)2、添加字段:Altertable<表名>add<字段名><字段类型
>[<字段宽度>]如:Altertable职工表alter联系方式C(12)3、修改字段、有效性规则及默认值。Altertable<表名>alter<字段名>;[setdefault<表达式>][setcheck<表达式>[err
or<出错显示信息>]如:Altertable学生表alter入学成绩setdefault0setcheck入学成绩>400;error“入学成绩在400以上”4、删除字段、有效性规则、默认值、主索引、候选索引Altertable<表名>alter<字段名>[d
ropcheck][dropdefault][dropprimarykey][dropforeignkey][dropcolumn]如:删除字段Altertable学生表dropcolumn入学成绩删除有效性Altertabl
e学生表alter入学成绩dropcheck6.4数据操纵分为三部分:插入(INSERT)删除(DELETE)更新(UPDATE)6.4.1插入记录:INSERTINTO<表名>[<字段名表>]VALUES[<表达式表>]如:INSERTINTO学生表VALUES(“
20002”,”李鹏“,450)6.4.2删除记录DELEFROM<表名>[WHERE<条件>]删除学生表中入学成绩在450以上的记录DELEFROM学生表WHER入学成绩>4506.4.3更新记录UPDA<表名>SET<字段名>=<表达式>[WHERE<条件>]将入学成绩在450以
下的记录加上20分UPDA学生表SET入学成绩=入学成绩+20WHERE入学成绩<450小结(12.10)SQL的核心SELECT语句比VFP命令更加强大功能.掌握该语句的要点是理解各子句的含义和使用规则.如FROM、W
HERE、GROUPBY、HAVING、ORDERBY等各自的含义和使用特点。连接查询是经常用到的SELECT形式,它可以从多个相互关联的表中查询感趣的数据。等值连接可以用等号(=)表示。涉及两个表的嵌套查询即外层表查询的条件需要内层表查询提供值时,需要认真阅读例题,理解其逻辑关系。SE
LE查询结果的去向可能有多种,在设计查询程序(表单)时多使用INTOCUSOR<临时表>短语,作为”表格”数据源.如存入到表中,一般用INTODBF/TABLE.SQL定义和操作语句可以嵌入在程序中直接定义、修改表的结构和插入、更新记录,不必进行交互操作,给编写程序带来很大灵活性。尤
其INSET、UPDATE和DELETE三条语句因比VFP的命令更简洁和方便在程序设计广泛使用。作业:P11421列出在北京的供应商的名称。SELE供应商名FROM供应商表WHERE地址=“北京”2列出
发给供应商S6的订购单号sele订购单号FROM订购单表WHERE供应商号="S6"3列出职工E6发给供应商S6的订购单信息。SELE订购单号FROM订购单表WHERE职工号=“E6”AND供应商号=“S6“或SELE订购单号FROM订购单表W
HERE职工号IN(SELE职工号FROM订购单表WHERE供应商号=“S6”4列出向供应商S3发过订购单的职工的职工号和仓库号sele职工号,仓库号FROM职工表WHERE职工号IN(SELE职工号FROM订购单表WHERE供应
商号="S3")5、列出和职工E1、E3都有联系的北京的供应商信息。SELE*FROM供应商表WHERE地址="北京"AND供应商号IN(SELE供应商号FROM订购单表WHERE职工号="E1"OR职工号="E3")6、
列出与工资在1220元以下的职工没有联系的供应商的名称。SELE供应商表.供应商名,供应商表.供应商号,订购单表.职工号FROM供应商表,订购单表WHERE供应商表.供应商号=订购单表.供应商号AND订购单表.职工号NOTIN;(SE
LE职工号FROM职工表WHERE工资<1220)7、列出向供应商S4发出订购单的仓库所在的城市SELE仓库表.城市,职工表.职工号,订购单表.订购单号FROM仓库表,职工表,订购单表WHERE订购单表.职工号=职工表.职工号AND职工表
.仓库号=仓库表.仓库号AND订购单表.供应商号="S4"8、列出在上海工作并且向供应商S6发出了订购单的职工号。SELE订购单表.订购单号,职工表.职工号,仓库表.城市FROM订购单表,职工表,仓库表WHERE仓库表.城市="上海"A
ND仓库表.仓库号=职工表.仓库号AND职工表.职工号=订购单表.职工号9、列出由工资多于1230元的职工向北京的供应商发出的订购单号。SELE订购单表.订购单号FROM订购单表WHERE供应商号IN(SELE供
应商号FROM供应商表WHERE地址="北京")AND职工号IN(SELE职工号FROM职工表WHERE工资>1230)10、列出仓库的个数。SELECOUNT(*)FROM仓库表11、列出有最大面积的仓库信息SELEMAX(面积
)AS最大面积,仓库号,城市FROM仓库表12、列出所有仓库的平均面积SELE仓库号,AVG(面积)AS平均面积FROM仓库表GROUPBY仓库号13、列出每个仓库中工资多于1220元的职工个数SELE仓库号,COUNT(*)AS仓库人数FROM职工表WHE
RE工资>1220GROUPBY仓库号