第五章关系数据库标准语言SQL5.1SQL概述SQL是结构化查询语言STRCTUREQUERYLANGURAGE1.简介SQL--StructuredQueryLanguage(结构化查询语言)SQL语言已经成为关系数据库通用的查询语言,几乎所有的关系数据库系统都支持它。SQL语言功能:数据定义、数据控制、数据操纵和数据查询功能,其中最重要的是数据查询功能。数据库的所有操作都可以通过SQL语言来完成表5-1SQL命令动词SQL功能命令动词数据查询SELECT数据定义CREATE,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE2.特点两种使用方式:既可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式使用。高度非过程化:只需要描述清楚用户要“做什么”,SQL语言就可以将要求交给系统,自动完成全部工作。语言简洁,易学易用。5.2查询功能1.SQL的核心是查询。SQL的查询命令也称为SELECT命令,它的基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。2.SELECT命令的语法格式(P77)(1)其中主要短语的含义如下:SELECT:说明要显示查询的数据字段FROM:说明要查询的数据来自哪个或哪些表WHERE:说明查询条件,即选择元组的条件JOIN:指定多个表之间的联接GROUPBY:对查询结果进行分组,可以利用它进行分组汇总HAVING:必须跟随GROUPBY,它用来限定分组必须满足的条件ORDERBY:对查询结果进行排序注意:只有SELECT和FROM是命令的必需部分(2)查询例子(以下查询例子都是采用bookinfo,readerinfo,borrowreturninfo,bookcategory数据表)p79—p805.2.1简单查询简单查询是从一个表中查询某些列的信息。由SELECT和FROM短语构成的无条件查询基于单个表或由SELECT、FROM和WHERE短语构成的条件查询[例子5.1]在readerinfo表中查询所有读者信息。其中“*”是通配符,表示所有属性,即字段。[练习5.1]在bookinfo表中查询所有图书信息。[例子5.2]在readerinfo表中查询读者所在院系。[练习5.2]在bookinfo表中查询所有出版社信息。[例子5.3]在readerinfo表中查询读者所在院系,并去掉重复值。[练习5.3]在bookinfo表中查询所有出版社信息,并去掉重复值。[例子5.4]在readerinfo表中查询所有读者的姓名、性别和年龄。[练习5.4]在bookinfo表中查询所有图书名称,作者和出版年限。用browse命令能实现吗?创建查询?5.2.2条件查询可以在指定的表中查询满足WHERE条件子句的记录。基本格式:SELECT字段名表FROM表名WHERE条件[例子5.5]在bookinfo表中查询30元以上的图书编号、名称、作者、出版社和定价。[练习5.5]在readerinfo表中查询性别是男读者的信息。[例子5.6]在bookinfo表中查询外文出版社的30元以上的图书的名称、作者和定价。[练习5.6]在readerinfo表中查询性别是男并且是信工学院的读者的信息。[例子5.7]在bookinfo表中查询20元到30元之间的图书的名称、作者和定价。查询的条件等价于:(成绩=90)AND(成绩=100)[练习5.7]在bookinfo表中查询4元到20元之间的图书的名称、作者和定价。[例子5.8]在readerinfo表中查询姓“于”的读者信息。说明:这里的LIKE是字符串匹配运算符通配符“%”表示0个或多个不确定的字符通配符“_”表示一个不确定的字符[练习5.8]在readerinfo表中查询姓“李”的读者信息。[例子5.9]在readerinfo表中查询“人文学院”和“外国语学院”的读者信息。说明:IN相当于集合运算符∈IN的用法。格式为:IN(值列表)[练习5.9]在bookinfo表中查询“人民教育出版社”和“科普出版社”的图书信息。[例子5.10]在borrowreturninfo表中查询尚未归还的图书编号。空值就是缺值或没有确定值,不能把它理解为任何意义的数据。在数据库中可能会遇到尚未存储数据的字段,这时的空值与空字符串、数值0等具有不同的含义。注意:查询空值时要使用ISNULL,而“=NULL”是无效的,因为空值不是一个确定的值,所以不能用“=”这样的运算符进行比较。5.2.3联接查询联接查询是将两个或多个表的记录通过公用字段联接起来进行查询。联接运算是关系数据库中重要的操作。说明:如果FROM之后有两个关系(表),那么这两个关系之间必有一种联系,否则无法构成检索表达式。(1)内部联接查询实现两个表内部联接的方式有两种方法一:使用where短语方法二:使用join短语[例子5.11]根据bookinfo表和bookcategory表查询图书的编号、名称和图书的类别名称信息。Select列名表;from表名1,表名2;where表名1.关联字段=表名2.关联字段Select列名表;from表名1innerjoin表名2;on表名1.关联字段=表名2.关联字段[例子5.12]根据readerinfo表和borrowreturninfo表查询借过书的读者编号和姓名。[例子5.13]根据readerinfo表、borrowreturninfo表和bookinfo表查询读者借书情况(包括读者编号、姓名、图书编号和名称)(2)外部联接查询SQL还支持新的联接运算符—超联结运算符。即首先保证一个表中满足条件的元组都在结果表中,然后将满足联接条件的元组与另一个表的元组进行联接,不满足联接条件的则应将来自另一个表的属性值置为空值。基本格式:超联接有3种:1.左联接:含义是在结果表中包含第一个表中满足条件的所有元组;如果有满足联接条件的元组,则在第二个表返回相应的值,否则第二个表返回值为空值。即除满足联接条件的记录出现在查询结果外,第一个表中不满足联接条件的记录也出现在查询结果中。2.右联接:含义是在结果表中包含第二个表中满足条件的所有元组;如果有满足联接条件的元组,则在第一个表返回相应的值,否则第一个表返回值为空值。Select列名表from表名1;left|righe|fulljoin表名2;on表名1.关联字段=表名2.关联字段即除满足联接条件的记录出现在查询结果外,第二个表中不满足联接条件的记录也出现在查询结果中。3.全联接:从相关的两个表中选取所有记录,按联接条件联接成新的记录作为查询结果输出,若表1或表2中不存在相关记录,则输出时相应字段的值为.null.。即除满足联接条件的记录出现在查询结果外,两个表中不满足联接条件的记录也出现在查询结果中。说明:INNERJOIN等价于JOIN,是普通联接LEFTJOIN为左联接。RIGHTJOIN为右联接。FULLJOIN为全联接即两个表中的记录不管是否满足联接条件将都在目标表或查询结果中出现,不满足联接条件的记录对应部分NULL。说明:从以上格式可以看出,它的联接条件在ON短语中给出,而不在WHERE短语中,联接类型在FROM短语中给出。[例子5.14]根据readerinfo表和borrowreturninfo表左联接查询读者编号、姓名和图书编号。和例5.12进行比较。[例子5.15]根据borrowreturninf表和bookinfo表右联接查询读者编号、图书编号和名称。[例子5.16]根据readerinfo表、borrowreturninfo表和bookinfo表全联接查询读者借书情况(读者编号、姓名和图书编号和名称)。(3)别名与自联接查询1.SQL可以将同一个关系与其自身进行联接,这种联接称为自联接。2.实现自联接的前提是:该关系中的两个属性具有相同的值域。3.在实现自联接操作时,必须为表起别名。定义别名的格式为:关系名.别名[例子5.17]根据borrowreturninfo表查询借过编号为“0100006”和“0300006”的两本图书的读者编号。思考:能用查询设计器设计这个联接查询吗?能browse命令!5.2.4嵌套查询在进行条件查询时,如果条件值是直接给出的,那么用一般的条件查询就可以,但有时条件的值并没有明确给出,而需要进一步查询才可得到,这时就可用sql提供的嵌套查询,嵌套查询是指在select命令语句中包含另一个select命令语句,基本形式如下:Select表1列名表from表名1where表1的关联字段比较运算符(selec表2列名表from表名2where表2的查询条件)1、一般的嵌套查询嵌套查询:嵌套查询是一类基于多个关系的查询最终的结果出自一个关系但相关的条件却涉及多个关系[例5.18]根据表bookinfo查询与《水的好处》同一类别的图书名称。[练习5.181]根据表bookinfo查询与《数学趣谈》同一类别的图书名称。[练习5.182]根据表readerinfo查询与于丹同一院系的读者姓名。[例5.19]根据readerinfo表和borrowreturninfo表查询借过书的读者编号和姓名。注:由于内层查询会得到多个结果,所以外层的条件中,比较运算符不能用“=”只能用“in”思考:能用查询设计器设计这个嵌套查询吗?能browse命令!2、内外层互相关的嵌套查询(了解)〓*〓*〓*〓*〓*〓5.2.5排序在select命令中,使用orderby短语可以使查询结果按指定要求排序。说明:1.ASC是指按升序排序;DESC是指按降序排序。2.ORDERBY允许按一列或多列排序。3.只能对最终的查询结果排序,不能对中间结果进行排序。4.当ASC和DESC都省略时,系统默认为按升序排序。注意:HAVING子句总是跟在GROUPBY子句之后,不可以单独使用。HAVING子句与WHERE子句不矛盾,在查询中先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。讨论:嵌套查询:都是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。内、外层互相关的查询:内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果基本格式:Select列名表from表名[where条件]orderby排序项[asc|desc]注:1排序项可以是字段名、由as子句命名的列标题和列序号2不能依据备注型字段和通用型字段进行排序3如果有多个排序项,之间用逗号分隔。[例子5.21]根据readerinfo表中查询所有读者的姓名、性别和年龄,并按年龄由小到大排序。[例子5.22]在bookinfo表中,先按出版日期降序显示,出版日期相同的再按定价升序显示图书的信息。[例子5.23]在bookinfo表中,查询价格最高的三本图书的信息。Top选项一定于orderby短语配套使用。5.2.6统计和分组统计Select命令语句不仅可以实现对表中数据的查询操作,还可以对数据计算之后输出,对于计算功能,除了使用一般的表达式外,sql提供了一些专门的函数,用于实现对整个表进行统计或分组统计的功能Sum()求总和Avg()求平均值Max()求最大值Min()求最小值Count()统计记录个数1、简单统计简单统计一般是对表中某个字段的数据进行统计基本格式:select列名表from表名[where条件][例子5.24]在bookinfo表中,查询出版社的数目。[练习5.24]在readerinfo表中,查询读者所在院系的数目。[例子5.25]在bookinfo表中,查询“01”类图书的平均价格。[练习5.25]在bookinfo表中,查询“02”类图书的平均价格。2、分组统计基本格式Select列名表from表名[