数据库基础与实例教程(达梦DM8) 课件 4.3数据的查询_第1页
数据库基础与实例教程(达梦DM8) 课件 4.3数据的查询_第2页
数据库基础与实例教程(达梦DM8) 课件 4.3数据的查询_第3页
数据库基础与实例教程(达梦DM8) 课件 4.3数据的查询_第4页
数据库基础与实例教程(达梦DM8) 课件 4.3数据的查询_第5页
已阅读5页,还剩51页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

数据库基础(基于达梦DM8)数据查询及管理44.3数据的查询02查询子句01单表查询03连接查询04子查询单表查询4.3.14.3.1单表查询1.简单查询

简单查询是数据查询操作中最基本的查询操作。其基本语法如下。SELECT[TOP{起始行,}结束行]<*|<列名列表>>FROM[<模式名>.]<表名><列名列表>::=[All|DISTINCT]<列名[AS别名]{,列名[AS别名]}>①<列名列表>:指定查询结果集中要包含列的名称,如果表中所有的列都包含在结果集中,可以用个“*”代替列名列表。4.3.1单表查询1.简单查询

简单查询是数据查询操作中最基本的查询操作。其基本语法如下。SELECT[TOP{起始行,}结束行]<*|<列名列表>>FROM[<模式名>.]<表名>[All|DISTINCT]<列名[AS别名]{,列名[AS别名]}>②ALL:返回所有被选择的行,包括所有重复的拷贝,缺省值为ALL;③DISTINCT:从被选择出的具有重复行的每一组中仅返回一个这些行的拷贝;④AS别名:为列表达式提供不同的名称,使之成为列的标题,列别名不会影响实际的名称,别名在该查询中被引用;4.3.1单表查询【案例4-24】使用SELECT语句查询STAFF表中前6行数据信息。SELECTTOP6*FROMSCH_FACTORY.STAFF;4.3.1单表查询【案例4-23】使用SELECT语句查询STAFF表中所有列、所行数据信息SELECT*FROMSCH_FACTORY.STAFF;4.3.1单表查询【案例4-25】使用SELECT语句查询STAFF表中的籍贯信息,命名列的别名为“职工籍贯汇总”,并去除重复的籍贯信息。SELECTDISTINCT籍贯AS职工籍贯汇总FROMSCH_FACTORY.STAFF;4.3.1单表查询2.条件查询

条件查询在简单查询的基础上添加了<WHERE子句>。“WHERE子句”内容参见4.2.3。4.3.1单表查询【案例4-26】使用SELECT语句查询STAFF表中部门号为100001的职工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE部门号=100001;4.3.1单表查询【案例4-27】使用SELECT语句查询STAFF表中年龄27岁(含)至30岁(含)之间的职工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE年龄BETWEEN27AND30;4.3.1单表查询【案例4-28】使用SELECT语句查询STAFF表中姓“徐”的职工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE姓名LIKE'徐%';查询子句4.3.24.3.2查询子句

查询语句中的子句类型有多种。如WHERE子句、FROM子句、WITH子句、ORDERBY子句、HAVING子句等。

在查询中根据需求使用各类查询子句可以对结果集进行排序、分组等操作,从而达到查询的目的。1.分组子句

分组子句基本语法如下。GROUPBY<列名>{,<列名>}

在实际应用中,用户经常需要获得按照分类进行汇总的数据。如公司导出职工名单希望按照部门进行分类汇总统计人数、工会活动希望按照年龄分类汇总统计等。GROUPBY子句是查询语句的可选项部分,用于定义分组表。

1.分组子句

在GROUPBY子句中的列名应属于FROM子句中表中的列名或列的别名;分组列的数据类型不能是多媒体数据类型;分组列不能为聚集函数表达式或者在SELECT子句中定义的别名;当分组列值包含空值时,则空值作为一个独立组;当分组列包含多个列名时,则按照GROUPBY子句中列出现的顺序进行分组。

使用分组字句要注意以下问题。

1.分组子句案例SELECT籍贯

FROMSCH_FACTORY.STAFFGROUPBY籍贯;

【案例4-35】使用GROUPBY子句,对职工表STAFF的籍贯进行分类汇总。

此处很明显“籍贯”包含在结果集中,故可以“籍贯”列对结果集进行分组。1.分组子句案例SELECT年龄,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY年龄;

【案例4-36】使用GROUPBY子句,对职工表STAFF按照年龄进行人数统计。

此处以“年龄”列进行分类,使用count(*)对分类进行计数。1.分组子句案例SELECT部门号,籍贯,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY部门号,籍贯;

【案例4-37】使用GROUPBY子句,对职工表STAFF按照部门及籍贯进行人数统计。通过该统计能够统计出每个部门各籍贯所在地的人数。

此处以“部门号”和“籍贯”列进行分类,即相同“部门号”和“籍贯”的员工会被分为一类;再使用count(*)对分类进行计数。2.HAVING子句

HAVING子句是SELECT语句的可选项部分,定义了一个成组表,其中只含有搜索条件表达式为真(TRUE)的那些组。HAVING子句与组的关系正如WHERE子句与表中行的关系。WHERE子句用于选择表中满足条件的行,而HAVING子句用于选择满足条件的组。

HAVING子句且通常跟随一个GROUPBY子句。HAVING子句语法如下。HAVING<表达式>2.HAVING子句案例SELECT年龄,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY年龄HAVINGCOUNT(*)<2;

【案例4-38】使用HAVING子句统计出STAFF表中同一年龄的职工数量小于2的年龄和数量。

此处选择满足统计条件“count(*)<2”的组的结果集。3.排序子句ORDERBY<<排序项>{,<排序项>}>

排序子句可以选择性地出现在查询语句中。排序子句在最终结果上进行排序,一般放在查询语句的最后部。排序子句规定了当行由查询返回时应具有的顺序,其语法如下。

3.排序子句ORDERBY<<排序项>{,<排序项>}>

语法中的相关参数如下。①<排序项>:<<列名>|<第几列>>[ASC|DESC]。可以指定多个排序项,按照顺序决定排序的层次。②<列名>:可以是任何在查询清单中的列的名称,但不支持多媒体数据类型(如IMAGE、TEXT、BLOB和CLOB)。③<第几列>:第几列为数字,按照结果集中的第几列进行排序。④ASC:结果按照升序排序,为默认排序方式,可省略。⑤DESC:结果按照降序排序。

3.排序子句案例SELECT*FROMSCH_FACTORY.STAFFORDERBY年龄;

【案例4-39】使用ORDERBY子句,查询STAFF表中所有职工的信息,并按年龄进行升序排序。

此处没有显式地定义升序“ASC”,因为默认排序方式为升序排序。3.排序子句案例SELECT职工号,姓名,籍贯FROM

SCH_FACTORY.STAFFORDERBY3;

【案例4-40】使用ORDERBY子句,查询STAFF表中职工号、姓名、籍贯,并按第3列(此处为“籍贯”)进行升序排序。此处ORDERBY3是按照“职工号,姓名,籍贯”三列中的第三列,即“籍贯”进行排序。3.排序子句案例SELECT*FROMSCH_FACTORY.STAFFORDERBY部门号,年龄DESC;

【案例4-41】使用ORDERBY子句,查询STAFF表中所有职工的信息,并按部门号升序、年龄进行降序排序。此处先按照“部门号”升序(默认升序)排序,然后按照“年龄”降序排序。连接查询4.3.34.3.3连接查询

在开始连接查询的操作之前可以进行回顾连接的关系代数运算的内容。

在具体的实现中,连接查询就是把两个或者多个表的行通过不同的连接方式,按照给定的条件连接生成新的结果集,从中查询数据。

1.交叉连接查询

交叉连接查询的基本语法如下(当连接的两个或者多个表中用重复的列名,需要通过添加表名为“表名.列名”来进行区分)。SELECT<*|[<表名.|别名.>]列名{,[<表名.|别名.>]列名}>FROM表名[别名]CROSSJOIN表名[别名]{,CROSSJOIN表名[别名]}[WHERE子句]

交叉连接查询又称笛卡尔积查询。在实际数据库管理工作中一般不会使用交叉连接查询,因对于函数较多的表进行交叉连接会产生很大的结果集,造成数据库资源极大占用。1.交叉连接查询案例SELECT职工号,STAFF.部门号,DEPT.部门名FROMSCH_FACTORY.STAFFCROSSJOINSCH_FACTORY.DEPT;

【案例4-42】交叉连接查询职工表和部门表,选取职工号、职工表的部门号、部门名的信息。

此处将STAFF表与DEPT表进行交叉连接,然后选择职工号、STAFF表中的部门号、DEPT表中的部门名。2.自然连接查询

把两张连接表中的同名列作为连接条件,进行等值连接,这样的连接称为自然连接。自然连接的连接表中必须存在同名列,如果连接表中没有同名列,或者同名列类型不匹配则报错。如果有多个同名列则会产生多个等值连接条件。

自然连接的基本语法如下。SELECT<*|[<表名.|别名.>]列名{,[<表名.|别名.>]列名}>FROM表名[别名]NATURALJOIN表名[别名]{,NATURALJOIN表名[别名]}[WHERE子句]2.自然连接案例SELECT*FROMSCH_FACTORY.MANAGERNATURALJOINSCH_FACTORY.STAFFNATURALJOINSCH_FACTORY.DEPT;

【案例4-43】查询“经理表”自然连接“职工表”再自然连接“部门表”的所有数据的结果。

此处“经理表”与“职工表”自然连接,“职工表”与“部门表”自然连接。

3.内连接查询

根据连接条件对表内一个或多个共享列值进行比较,结果集仅包含满足全部连接条件的记录,这样的连接称为内连接。

内连接的基本语法为。SELECT<*|[<表名.|别名.>]列名{,[<表名.|别名.>]列名}>FROM表名[别名][INNER]JOIN表名[别名]ON<连接条件>{,[INNER]JOIN表名[别名]}[WHERE子句]3.内连接查询

内连接分等值连接和非等值连接。等值连接使用“=”运算符设置<连接条件>的连接;非等值连接则使用“<、>、<=、>=、<>”等运算符设置<连接条件>的连接。在实际运用中,常使用等值连接。

内连接的基本语法为。SELECT<*|[<表名.|别名.>]列名{,[<表名.|别名.>]列名}>FROM表名[别名][INNER]JOIN表名[别名]ON<连接条件>{,[INNER]JOIN表名[别名]}[WHERE子句]3.内连接查询SELECT职工号,姓名,D.部门号,部门名FROMSCH_FACTORY.STAFFSINNERJOINSCH_FACTORY.DEPTDONS.部门号=D.部门号;

【案例4-44】通过职工表中的部门号等值连接部门表中的部门号,查询“职工表”内连接“部门表”的职工号、姓名、部门号、部门名列的结果集。

此处通过STAFF表的“部门号”和DEPT表的”部门号”进行等值连接。4.外连接查询

外连接对结果集进行了扩展,会返回一张表的所有记录,对于另一张表无法匹配的字段用NULL填充返回。DM数据库支持三种方式的外连接:左外连接、右外连接、全外连接。外连接中位于左侧的表,称为左表;位于右侧的表,称为右表。

外连接的基本语法如下。SELECT<*|[<表名.|别名.>]列名{,[<表名.|别名.>]列名}>FROM表名[别名]<LEFT|RIGHT|FULL>[OUTER]JOIN表名[别名]{,<LEFT|RIGHT|FULL>[OUTER]JOIN表名[别名]}[WHERE子句]4.外连接查询SELECTS.职工号,S.姓名,P.项目号,P.项目名,P.项目开始时间,SP.加入时间FROMSCH_FACTORY.STAFFSLEFTJOINSCH_FACTORY.STAFF_PROJECTSPONS.职工号=SP.职工号LEFTJOINSCH_FACTORY.PROJECTPONSP.项目号=P.项目号;

【案例4-45】分别用左外连接、右外连接、全外连接来连接职工表STAFF、职工参与项目表STAFF_PROJECT和项目表PROJECT。结果集显示职工号、姓名、项目号、项目名、项目开始时间、(职工)加入时间。1)左外连接4.外连接查询SELECTS.职工号,S.姓名,P.项目号,P.项目名,P.项目开始时间,SP.加入时间FROMSCH_FACTORY.STAFFSRIGHTJOINSCH_FACTORY.STAFF_PROJECTSPONS.职工号=SP.职工号RIGHTJOINSCH_FACTORY.PROJECTPONSP.项目号=P.项目号;

【案例4-45】分别用左外连接、右外连接、全外连接来连接职工表STAFF、职工参与项目表STAFF_PROJECT和项目表PROJECT。结果集显示职工号、姓名、项目号、项目名、项目开始时间、(职工)加入时间。2)右外连接4.外连接查询SELECTS.职工号,S.姓名,P.项目号,P.项目名,P.项目开始时间,SP.加入时间FROMSCH_FACTORY.STAFFSFULLJOINSCH_FACTORY.STAFF_PROJECTSPONS.职工号=SP.职工号FULLJOINSCH_FACTORY.PROJECTPONSP.项目号=P.项目号;

【案例4-45】分别用左外连接、右外连接、全外连接来连接职工表STAFF、职工参与项目表STAFF_PROJECT和项目表PROJECT。结果集显示职工号、姓名、项目号、项目名、项目开始时间、(职工)加入时间。3)全外连接子查询4.3.44.3.4子查询

子查询指的是一个查询语句中包含另一个查询语句,外层的查询语句就称为外部查询,内层的查询语句称为内部查询或子查询。

在DM_SQL中,一个SELECT-FROM-WHERE语句称为一个查询块。如果在一个查询块中嵌套一个或多个查询块,这种查询称为子查询。4.3.4子查询

子查询会返回一个值(标量子查询,即只返回一行一列)或一个表(表子查询,即返回多行多列)。它通常采用“(查询语句)”的形式嵌套在表达式中。

通常子查询出现在外部查询的WHERE子句中,并与比较运算符、列表运算符IN、存在运算符EXISTS等一起构成查询条件,完成查询操作。4.3.4子查询

<查询表达式>一般就是SELECT查询语句,但需要注意以下几点问题。在子查询中不得有ORDERBY子句;子查询不能包含在聚集函数中;在子查询中允许嵌套子查询。

子查询语法如下。<子查询>::=(<查询表达式>)1.比较运算符子查询

标量子查询是一个普通SELECT查询,它只应该返回一行一列记录。标量子查询可以配合比较运算符与外部查询的列进行比较。比较结果为真的行添加入结果集,否则不加入结果集。1.比较运算符子查询案例SELECTAVG(年龄)FROMSCH_FACTORY.STAFF;

【案例4-46】使用子查询找出STAFF表中小于平均年龄职工的所有信息。

此处首先考虑计算出STAFF表中所有职工的评价年龄。1.比较运算符子查询案例SELECT*FROMSCH_FACTORY.STAFFWHERE年龄<(SELECTAVG(年龄)FROMSCH_FACTORY.STAFF);

【案例4-46】使用子查询找出STAFF表中小于平均年龄职工的所有信息。

再将平均年龄的结果作为子查询放入上一层查询中,以年龄小于平均年龄作为条件查询所有满足条件的职工信息。2.关键字IN子查询

如果子查询返回的是单列多个值的情况,可以将结果集作为一个集合,使用IN运算符来对外部查询的列值进行判断。比较结果为真的行添加入结果集,否则不加入结果集。可以使用NOTIN获得与IN相反的结果集。

2.关键字IN子查询案例SELECT部门号FROMSCH_FACTORY.DEPTWHERELEN(部门名)>3;

【案例4-47】使用子查询查找出部门名大于3个字符的职工的所有信息。

首先查出部门大于3个字符的部门号。

此处使用内置函数LEN(char),可以得到给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。2.关键字IN子查询案例SELECT*FROMSCH_FACTORY.STAFFWHERE部门号IN(SELECT部门号FROMSCH_FACTORY.DEPTWHERELEN(部门名)>3);

【案例4-47】使用子查询查找出部门名大于3个字符的职工的所有信息。

字符数大于3的部门名所筛选的结果集是一个1列2行的结果集。将该语句作为子句,结合IN运算符,放入一个包含判断部门号WHERE子句的职工表外部查询中。3.EXISTS关键字子查询

EXISTS判断是对子查询返回结果是否为非空集合的判别操作。若表子查询返

温馨提示

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

评论

0/150

提交评论