第6章 数据查询_第1页
第6章 数据查询_第2页
第6章 数据查询_第3页
第6章 数据查询_第4页
第6章 数据查询_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

第6章数据查询查询语句结构6.1简单查询6.2数据汇总6.3多表查询6.4T-SQL语言使用SELECT实现数据库的查询,它既可以实现对单表的数据查询,也可以完成复杂的多表连接查询和嵌套查询,该语句使用灵活功能强大。6.1查询语句结构SELECT语句能够从数据库中检索出符合用户需求的数据,并将结果以表格的形式返回,是SQLServer中使用最频繁的语句之一。SELECT列名1[,列名2]...[INTO新表名]

FROM表名1[,表名2]...[WHERE条件][GROUPBY列名列表][HAVING条件][ORDERBY列名列表[ASC|DESC]]6.2.1SELECT子句6.2.2FROM子句6.2.3WHERE子句6.2.4ORDERBY子句6.2.5INTO子句6.2.6无Form子句的Select语句6.2简单查询 虽然SELECT语句的完整语语法比较复杂,但是大多数的查询语句都只是用到以下四个主要属性:结果集中的列或列的表达式。[select子句]用于检索数据的表格,以及表之间的关系。[from子句]为了符合查询要求,表格中的行必须满足的条件。[where子句]结果集中行的排列顺序。[orderby子句]6.2简单查询SELECT子句用于指定要返回的列,其完整的语法格式如下:6.2.1SELECT子句参数说明*通配符,返回所有的列值列名指定要返回在结果中的部分列,如果是多列用逗号分开列别名(重命名)可以为原列重命名,用以替代列的原名。表达式可以是列名、常量、函数或他们的表达式Topn[percent]指定显示结果的前n行[或n%行],行数取整Distinct去除结果中重复的列,只显示其中一个,多个空值视为相等All显示所有记录,包括重复看,All是默认值6.2.2FROM子句FROM子句是SELECT查询语句的基本组成,它可以指定要进行查询的单表或多个表。其基本语法格式为:SELECT列名

FROM{表名|视图}[,{表名|视图},……]1.查询全部列(*)【例6.1】查询BorrowList表全部借阅信息。select*fromBorrowList说明:在SELECT语句中(*)具有特殊意义。 星号表示对FROM子句中指定的所有表或视图 中的所有列的引用。2.查询部分列【例6.2】查询各种借书卡的名称、最大借阅天数、可借阅天数、可续借天数。select卡类型名称,可借阅天数, 可借阅天数,可续借天数fromCardType2.查询部分列【例6.3】查询所有图书名称和作者。select图书名称,作者fromBookInfo3.列重命名在SELECT语句中,可以为所选择的列重命名。列重命名有3种方法:格式1:列名AS新列名格式2:列名新列名格式3:新列名=列名3.列重命名【例6.4】查询所有图书的名称(重命名为BookName),作者(重命名为Author)。select图书名称asBookName,作者asAuthorfromBookInfo若新列名不是常规标识符,则需要使用分隔符。select图书名称as[BookName],作者as‘BookAuthor’fromBookInfo3.列重命名【例6.5】查询读者姓名(重命名为ReaderName)、性别(重命名为Sex)、卡类型(重命名为CardType)。select读者姓名ReaderName,性别Sex,卡类型CardTypefromReaderCard3.列重命名【例6.6】查询图书类别编号(重命名为TypeID)、类别名称(重命名为TypeName)。selectTypeID=图书类别编号,TypeName=图书类别名称fromBookType4.列的运算(表达式)【例6.7】查询所有图书的编号、名称及库存量,并将各书库存增加20后再显示。select图书编号,图书名称,库存量,补货20后的库存=库存量+20fromBookInfo4.列的运算(表达式)【例6.8】查询各种借阅卡正常借阅一本书的累计最长天数。select卡类型编号,卡类型名称,(可借阅天数+可续借天数)as累计最长天数fromCardType5.返回结果的前n行(Topn[percent]) Topn[percent]选项用于指定只从查询结果集中输出的前n(n%)行。n是大于0的整数,当使用percent时,n必须是介于0-100之间的整数。 如果查询包含ORDERBY子句,则输出由ORDERBY子句排序的前n行或n%行,如果查询没有使用ORDERBY子句,行的顺序将任意。5.返回结果的前n行(Topn[percent])【例6.9】显示图书信息中的前3行selecttop3*fromBookInfo5.返回结果的前n行(Topn[percent])【例6.10】显示图书信息中的前10%行的信息selecttop10percent*fromBookInfo6.消除重复记录(Distinct)【例6.11】查询借阅信息表中的所有借书证号,不显示重复行。selectDISTINCT借书证编号fromBorrowList6.在结果中显示常数【例6.12】查询并显示图书的信息(包括图书名称,作者,出版社)。select图书信息='<<'+图书名称+'>>,'+ 作者+','+出版社fromBookInfoWHERE子句指定查询的条件,限制返回的数据行。其语法格式如下:

WHERE指定条件6.2.3WHERE子句过滤的类型与相应搜索条件过滤类型搜索条件比较运算符=、>、<、>=、<=、<>、!>、!<、!=逻辑运算符NOT、AND、OR字符串比较LIKE、NOTLIKE值的范围BETWEEN、NOTBETWEEN列的范围IN、NOTIN未知值ISNULL、ISNOTNULL1.like匹配符:_是单个字符匹配符,只能匹配一个字符%是字符匹配符,可匹配任意长度的字符串。[]匹配符可以指定匹配的范围,如[abcdef],表示在a~f范围中匹配一个字符;也可以用[^]表示不属于这个范围的匹配,如[^abc]表示除了abc之外的任一个字符都匹配1.like匹配符:【例6.13】查询姓“王”的读者信息,用的LIKE匹配模式。SELECT*FROMReaderCardWHERE读者姓名LIKE'王%'1.like匹配符:【例6.14】运行下面的代码,比较查询条件的差别。--最后一位是6或5SELECT*FROMReaderCardWHERE借书证编号LIKE'%[65]'--最后两位是65SELECT*FROMReaderCardWHERE借书证编号LIKE'%[6][5]'2.Between关键字

Between……and表示的是一个范围的查询,并包括两个边界。

【例6.15】查询借阅时间在'2012-5-1'到'2012-10-1'之间的借阅信息SELECT*FROMBorrowListWHERE借阅时间BETWEEN'2012-5-1'AND'2012-10-1'3.isnull&isnotnull 判断字段是否为null。【例6.16】查询借阅信息表中实际归还时间为null的记录(未归还的书籍)。select*fromBorrowListwhere实际归还时间isnull4.In(NotIn)用in字句判断元素是否在集合中。【例6.17】查询读者借书卡的状态为'已挂失'、'正常'的信息。select*fromReaderCardwhere状态in('已挂失','正常')

ORDERBY子句用于按查询结果中的一列或多列对查询结果进行排序。其语法格式如下:

ORDERBY列名列表

[ASC|DESC]6.2.4ORDERBY子句OrderBy【例6.18】查询所有的借书证信息,并按照借书证编号从小到大排序。select*fromReaderCardorderby借书证编号OrderBy【例6.19】查询所有的借阅信息,按照借书证编号从小到大排序,借书证编号相同的按照借阅时间从大到小排序。select*fromBorrowListorderby借书证编号,借阅时间DESCINTO子句用于把查询结果存放到一个新建立的表中,新表的列由SELECT子句中指定的列构成,其语法格式如下:

SELECT列名[INTO新表名]FROM表名6.2.5INTO子句6.2.5INTO子句【例6.20】查询2012-9-1之后的借阅信息,并将结果保存到新表‘借阅表20120901’。select*into借阅表20120901fromBorrowListwhere借阅时间>'2012-9-1'6.2.5INTO子句练习:复制一张表BookInfo,并将新表保存为BookInfo1。SELECT*INTOBookInfo1FROMBookInfo6.2.6无FORM子句的SELECT语句

不带FROM子句的SELECT语句是对系统变量或常量的操作,不属于从数据库的表格中进行数据检索的范畴,此时SELECT只做显示之用,不做检索之用。【例6.21】不带FROM子句的SELECT语句举例。SELECT1+2SELECT@@VERSION6.3数据汇总6.3.1聚合函数6.3.2GROUPBY子句6.3.3HAVING子句聚合函数的功能是对整个表或表中的列组进行汇总、计算、求平均值或总和。6.3.1聚合函数SUM():求总和AVG():求平均值MIN():求最小值MAX():求最大值COUNT(*):计算行数目6.3.1聚合函数其语法如下:Select标题=统计函数名(列名)from表名6.3.1聚合函数【例6.22】查询‘正常’状态的借书卡个数。select正常卡数=count(*)fromReaderCardwhere状态='正常'6.3.1聚合函数【例6.23】查询所有读者借阅天数最大值、借阅天数最小值、借阅天数平均值。SELECT

借阅天数最大值=MAX(可借阅天数+可续借天数),借阅天数最小值=MIN(可借阅天数+可续借天数),借阅天数平均值=AVG(可借阅天数+可续借天数)FROMCardTypeGROUPBY子句用来对查询结果进行分组,即按照分组表达式将数据值相同的分为一组,并且对每一个组进行聚合函数计算。 换句话说,它产生每一组的总体信息。如:卡类型Student的分为一组。注意:GroupBy往往和聚合函数一起使用

6.3.2使用GROUPBY子句【例6.23】查询不同类型的读者人数。6.3.2使用GROUPBY子句SELECT卡类型,COUNT(*)AS人数FROMReaderCardGROUPBY卡类型【例6.23】查询不同书籍被借出的数量,并按照数量从大到小排序。6.3.2使用GROUPBY子句SELECT图书编号,COUNT(*)AS借出数量FROMBorrowListGROUPBY图书编号OrderByCOUNT(*)DESC GROUPBY子句后面分组表达式往往是某个字段,这个分组字段通常会出现在SELECT后面,作为一个输出显示的列; 另一个输出显示的列即为聚合函数,表示按分组字段进行分组后,对同一个组的数据进行聚合运算,如计算每组的行数或每组中指定一列的总和、最大值、最小值、平均值等。6.3.2使用GROUPBY子句【例6.23】查询不同类别图书的库存量,并按照数量从大到小排序。6.3.2使用GROUPBY子句SELECT图书类别编号,Sum(库存量)as库存FROMBookInfogroupby图书类别编号OrderBySum(库存量)DESCHAVING子句用来指定分组或集合的搜索条件,通常和GROUPBY子句一起使用,其行为与WHERE子句相似,只是WHERE子句作用于表和视图,HAVING子句作用于分组。6.3.3HAVING子句HAVING和WHERE的区别:(1)WHERE用在groupby之前;having用在groupby之后(2)Having的条件中可以含有聚合函数,Where不可以。【例6.24】修改例6.23,查询图书类别编号为’B’的书籍库存量。6.3.3HAVING子句SELECT图书类别编号,sum(库存量)as库存FROMBookInfogroupby图书类别编号Having图书类别编号='B'【例6.25】修改例6.23,查询库存量小余50的图书类别。6.3.3HAVING子句SELECT图书类别编号,sum(库存量)as库存FROMBookInfogroupby图书类别编号Havingsum(库存量)<50温故知新1.查询语句的基本结构? Select列名1,列名2,…… From表名温故知新2.查询全部列:如:显示【职工表】的全部信息。 Select* From职工表温故知新3.查询同时为列重命名 如:查询【职工表】的职工编号,并重命名为EmpNo显示 Select职工编号asEmpNo From职工表①EmpNo=职工编号②职工编号EmpNo温故知新4.列的运算如:查询[工资表]的职工编号、实际工资(注:实际工资由基本工资和补贴组成)Select职工编号,实际工资=基本工资+补贴From工资表温故知新5.查询结果排序 如:查询[职工表]的信息,并按职工编号从小到大排序显示 Select* From职工表 OrderBy职工编号①OrderBy语句放到最后②从大到小排:字段后加descOrderBy职工编号desc温故知新6.条件查询(Where子句) 如:查询[职工表]中姓“王”的所有职工信息并按职工编号排序 Select* From职工表 Where姓名like‘王%’ OrderBy职工编号①Like匹配符%:匹配任意长度的字符_:匹配单个字符[]:匹配指定范围的单个字符温故知新7.将查询结果添加到新表(into子句) 如:查询[职工表]中所有男员工信息,并将结果存入[男职工表]Select*into男职工表From职工表Where性别=‘男’into子句:①必须放到select和from子句之间;②结果在新表中查看温故知新8.聚合函数 如:查询[职工表]中男、女职工人数

Select性别,count(*)as人数From职工表GroupBy性别分组查询:①分组字段;②聚合函数6.4多表查询6.4.1联接类型6.4.2内联接查询6.4.3联合查询6.4.4子查询将来自多个表的数据提出并生成单一的结果集的过程称为联接查询。联接查询包括多种类型:内联接外联接左外联接右外联接完全外联接交叉联接6.4.1联接简介联接类型:6.4.2

内联接查询企业案例:(南海科技数据库)企业案例:(南海科技数据库)【1】查询每个部门的部门名称,管理员编号,姓名及性别;两张表中都只有所需要的部分字段,所以必须联接两张表,查询数据。【1】查询每个部门的部门名称,管理员编号,姓名及性别;select部门名称,管理员编号,姓名,性别fromtbl部门表a,tbl员工表bwherea.管理员编号=b.员工编号select部门名称,管理员编号,姓名,性别fromtbl部门表a,tbl员工表bwherea.管理员编号=b.员工编号【2】查询[tbl请假表]中审批人编号及其姓名

两个表的关联字段是什么?1.用哪个字段关联?select审批人编号,姓名fromtbl请假表t,tbl员工表ewheret.审批人编号=e.员工编号select审批人编号,姓名fromtbl请假表t,tbl员工表ewheret.员工编号=e.员工编号当出现多个关联字段时,选用查询显示的列2.如何删除重复的行?select审批人编号,姓名fromtbl请假表t,tbl员工表ewheret.审批人编号=e.员工编号select

distinct审批人编号,姓名fromtbl请假表t,tbl员工表ewheret.审批人编号=e.员工编号【3】查询每个员工的基本信息(员工编号、姓名、性别)和在“2005-11-15”发放的实际工资selecte.员工编号,姓名,性别,

实际工资=(基本工资+加班工资

-缺勤扣除工资+奖金)fromtbl工资表ass,tbl员工表asewheres.员工编号=e.员工编号

and发放时间='2005-11-15'①列的表达式,等号右边只能出现原有字段名;②where中多个条件用and连接③关联字段必加前缀6.4.2

内联接查询【例6.29】查询所有图书的图书编号,图书名称,出版社,图书类别名称。6.4.2

内联接查询SELECT图书编号,图书名称, 出版社,图书类别名称FROMBookInfo,BookTypeWhereBookInfo.图书类别编号 =BookType.图书类别编号SELECT图书编号,图书名称, 出版社,图书类别名称FROMBookInfoi,BookTypet

Wherei.图书类别编号=t.图书类别编号【例6.30】查询读者的姓名,性别,卡类型名称,可借阅数量。6.4.2

内联接查询SELECT读者姓名,性别, 卡类型名称,可借阅数量FROMReaderCard,CardTypeWhereReaderCard.卡类型=CardType.卡类型编号【例6.31】三表联合查询。查询所有存在借阅信息的读者姓名、图书名称和借阅时间。6.4.2

内联接查询【例6.31】三表联合查询:查询所有借阅信息的读者姓名、图书名称和借阅时间。6.4.2

内联接查询SELECT读者姓名,图书名称,借阅时间FROMReaderCard,BorrowList,BookInfoWHEREReaderCard.借书证编号=BorrowList.借书证编号ANDBorrowList.图书编号=BookInfo.图书编号6.4.3联合查询 联合查询用于合并多个相似的查询结果集。即将多个SELECT语句返回的结果通过UNION操作符组合到一个结果集中。【6.32】联合查询作者和读者姓名,并重命名为姓名。SELECT作者AS姓名FROMBookInfoUNIONSELECT读者姓名FROMReaderCard6.4.4子查询 子查询又称嵌套查询,是在一条SELECT查询语句的WHERE条件子句中,又嵌套有另一个SELECT查询语句。创建子查询可用三种语法来实现: (1)WHERE表达式比较运算符[ANY|ALL|SOME](sqlstatement)(2)WHERE表达式[NOT]IN(sqlstatement)(3)WHERE[NOT]EXISTS(sqlstatement)6.4.4子查询【6.33】查询所有借过书的读者信息。SELECT*FROMReaderCardwhere借书证编号in(SELECT借书证编号 FROMBorrowList)6.4.4子查询【6.34】查询‘计算机应用基础’被借阅的次数。SELECTcount(

温馨提示

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

评论

0/150

提交评论