《第8章数据库查询》由会员分享,可在线阅读,更多相关《第8章数据库查询(100页珍藏版)》请在金锄头文库上搜索。
1、第8章数据库查询第8章 数据库查询o所谓查询,就是对数据库内的数据进行检索、创建、修改或删除的特定请求。数据库接受用T-SQL语言编写的查询。使用查询可以按照不同的方式查看、更改和分析数据。查询设计是数据库应用程序开发的重要组成部分,因为在设计数据库并用数据进行填充后,需要通过查询来使用数据。o本章主要介绍数据库的基本查询,包括简单查询、分组查询、数据汇总、子查询、连接查询等内容。8.1SELECT查询语法o在SQLServer中,可以通过SELECT语句来实现数据查询,即从数据库表中检索所需要的数据。查询可以包含要返回的列、要选择的行、放置行的顺序和如何将信息分组的规范。oSELECT语句的
2、语法格式如下:oSELECTselect_listINTOnew_table_nameoFROMtable_list|view_listoWHEREsearch_conditionsoGROUPBYgroup_by_listoHAVINGsearch_conditionsoORDERBYorder_listASC|DESC8.2 简单查询o简单查询包括投影查询、选择查询及聚合函数简单计算查询。o8.2.1投影查询o通过SELECT语句的select_list项组成结果表的列。o投影查询格式如下:oSELECTALL|DISTINCTTOPnPERCENTo*|column_name|expre
3、ssion|IDENTITYCOL|ROWGUIDCOLoAScolumn_alias|column_alias=expression,n8.2.1投影查询o1.选择一个表中指定的列o使用SELECT语句选择一个表中的某些列,各列名之间要以逗号分隔。o【例8-1】查询“teaching”数据库中学生的姓名、性别和专业。oUSEteachingoSELECTsname,ssex,specialtyFROMstudent8.2.1投影查询o【例8-2】查询“teaching”库中“course”的所有记录。oUSEteachingoSELECT*FROMcourseo用“*”表示表中所有的列,按用
4、户创建表时声明列的顺序来显示所有的列。 8.2.1投影查询o【例8-3】查询 “teaching”中“学生表”的专业名称,滤掉重复行。oUSEteachingoSELECTDISTINCT专业FROM学生表o用DISTINCT关键字可以过滤掉查询结果中的重复行。8.2.1投影查询o【例8-4】查询“teaching”库中“course”表的前三行信息。oUSEteachingoSELECTtop3*FROMcourse8.2.1投影查询o【例8-5】查询“teaching”库中“course”表的前50%行的信息。oUSEteachingoSELECTtop50percent*FROMcour
5、se 8.2.1投影查询o2.改变查询结果中的显示标题o在SELECT语句中,用户可以根据实际需要对查询数据的列标题进行改变,或者为没有标题的列加上临时的标题。o常用的方式:o在列表达式后面给出列名。o用“=”来连接列表达式。o用AS关键字来连接列表达式和指定的列名。 8.2.1投影查询o【例8-6】查询“student”表中所有学生的学号、姓名,结果中各列的标题分别指定为汉字学号和姓名。oUSEteachingoSELECTsnoAS学号,snameAS姓名FROMstudento或:oUSEteachingoSELECT学号=sno,姓名=snameFROMstudento或:oUSEte
6、achingoSELECTsno学号,sname姓名FROMstudent8.2.1投影查询o3.计算列值o在进行数据查询时,经常需要对查询到的数据进行再次计算处理。oT-SQL允许直接在SELECT语句中使用计算列。“计算列”并不存在于表格所存储的数据中,它是通过对某些列的数据进行演算得来的结果,所以没有列名。8.2.1投影查询o【例8-7】查询“SC”表,按150分制计算成绩。oUSEteachingoSELECTsno,cno,score150=score*1.50FROMsc 8.2.2 选择查询o投影查询是从列的角度进行的查询,一般对行不进行任何过滤(DISTINCT除外)。但是,一
7、般的查询都不是针对全表所有行的查询,只是从整个表中选出满足指定条件的内容,这就要用到WHERE子句进行选择查询。o选择查询的基本语法如下:oSELECTSELECT_LISToFROMTABLE_LISToWHERESEARCH_CONDITIONSo其中,SEARCH_CONDITIONS为选择查询的条件。8.2.2 选择查询o1.使用关系表达式o比较运算符用于比较两个表达式的值,共有9个,它们是:o=(等于)、(小于)、(大于)、=(大于等于)、(不等于)、!=(不等于)、!(不大于)。o比较运算的格式为:expression=|=|!=|!expressiono其中expression是
8、除text、ntext和image外类型的表达式。o【例8-8】查询“teaching”库“sc”表中成绩大于等于60的学生的学号、课程号和成绩。oUSEteachingoSELECT*FROMscWHEREscore=608.2.2 选择查询o2.使用逻辑表达式o逻辑运算符共有3个,它们是:oNOT:非,对表达式的否定。oAND:与,连接多个条件,所有的条件都成立时为真。oOR:或,连接多个条件,只要有一个条件成立就为真。o【例8-9】查询“teaching”库中“计算机”专业的“男”生的信息。oUSEteachingoSELECT*FROMstudentoWHEREspecialty=计算
9、机andssex=男8.2.2 选择查询o【例8-10】查询“teaching”库中“计算机”专业的或“男”生的信息。oUSEteachingoSELECT*FROMstudentoWHEREspecialty=计算机orssex=男 8.2.2 选择查询o3.使用BETWEEN关键字图8-7例8-10的查询结果o使用BETWEEN关键字可以更方便地限制查询数据的范围。其语法格式为:o表达式NOTBETWEEN表达式1AND表达式2o使用BETWEEN表达式进行查询的效果完全可以用含有“=”和“”和“=80ANDscore=2 8.3.1分组查询oHAVING与WHERE子句的区别是:WHER
10、E子句是对整表中数据筛选满足条件的行;而HAVING子句是对GROUP BY分组查询后产生的组加条件,筛选出满足条件的组。另外,HAVING中条件使用聚合函数,WHERE中条件不能使用聚合函数。8.3.1分组查询o2.CUBE和ROLLUP的使用o(1)CUBEo指定在结果集内不仅包含由GROUPBY提供的行,还包含汇总行。GROUPBY汇总行针对每个可能的组和子组组合在结果集内返回。GROUPBY汇总行在结果中显示为NULL,但用来表示所有值。使用GROUPING函数可确定结果集内的空值是否为GROUPBY汇总值。o结果集内的汇总行数取决于GROUPBY子句内包含的列数。GROUPBY子句中
11、的每个操作数(列)绑定在分组NULL下,并且分组适用于所有其他操作数(列)。由于CUBE返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。8.3.1分组查询o【例8-23】在“teaching”库中查询“sc”表,求被选修的各门课程的平均成绩和选修该课程的人数,及所有课程的总平均成绩和总选修人数。oUSEteachingoSELECTcno,AVG(score)AS平均成绩,COUNT(sno)AS选修人数oFROMscoGROUPBYcnooWITHCUBE8.3.1分组查询o【例8-24】在“teaching”库中查询“student”表,统计各专业男生、女生人数
12、及每个专业的学生人数和男生总人数、女生人数以及所有学生总人数。oUSEteachingoSELECTspecialty,ssex,COUNT(*)AS人数oFROMstudentoGROUPBYspecialty,ssexoWITHCUBE8.3.1分组查询o(2)ROLLUPoROLLUP指定在结果集内不仅包含由GROUPBY提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。o使用CUBE或ROLLUP时,不支持区分性聚合函数,如AVG(DISTINCT列名)、COUNT(DISTI
13、NCT列名)等。8.3.1分组查询o【例8-25】统计在“teaching”库中每个专业的男女生人数,每个专业的总人数和所有学生总人数。oUSEteachingoSELECTspecialty,ssex,COUNT(*)AS人数FROMstudentoGROUPBYspecialty,ssexoWITHROLLUP 8.3.3数据汇总o通过上一面的例子我们发现,在SELECT子句中出现聚合函数时,结果集中的数据全是聚合值,没有明细值。这是使用SELECT子句计算聚合值的缺点。能否解决这种问题呢,答案是肯定的,解决问题的方法就是使用COMPUTE子句。o在SELECT语句中使用COMPUTE子句
14、时,查询结果由两个部分组成:前一部分就是未用COMPUTE子句时产生的结果集;后一部分只有一行,是由COMPUTE子句产生附加的汇总数据,出现在整个结果集的末尾。8.3.3数据汇总oCOMPUTE子句有两种形式,一种形式是不带BY子句,另一种形式是带BY子句。oCOMPUTE子句的语法格式如下:图8-17例8-25的查询结果oCOMPUTE聚合函数名(expression),nBYexpression,no注意:AVG|COUNT|MAX|MIN|SUM这些函数均会忽略NULL值,且DISTINCT选项不能在此使用。8.3.3数据汇总o【例8-26】在“teaching”中查询“计算机”专业的
15、学生的学号、姓名和性别,并统计学生总人数。oUSEteachingoSELECTsno,sname,ssexFROMstudentWHEREspecialty=计算机oCOMPUTECOUNT(sno) 8.3.3数据汇总o【例8-27】在“teaching”库中查询所有学生的选课信息,并计算每个学生的平均成绩。oUSEteachingoSELECTsno,cno,scoreoFROMscoORDERBYsnooCOMPUTEavg(score)BYsno 8.4连接查询o以上的查询操作都是从一个表中检索数据。在实际应用中,经常需要同时从两个表或两个以上表中检索数据,并且每一个表中的数据往往作
16、为一个单独的列出现在结果集中。o实现从两个或两个以上表中检索数据且结果集中出现的列来自于两个或两个以上表中的检索操作被称为连接技术,或者说连接技术是指对两个表或两个以上表中数据执行乘积运算的技术。o在MicrosoftSQLServer202X系统中,这种连接操作又可以细分为交叉连接、内连接、外连接等。下面分别研究这些连接技术。8.4.1 内连接o内连接把两个表中的数据连接生成第三个表,第三个表中仅包含那些满足连接条件的数据行。在内连接中,使用INNER JOIN连接运算符,并且使用ON关键字指定连接条件。o内连接是一种常用的连接方式,如果在JOIN关键字前面没有明确指定连接类型,那么默认的连接类型是内连接。内连接的语法格式如下:oSELECT select_listoFROM 表1 INNER JOIN 表2 ON 连接条件o或oSELECT select_listoFROM 表1 ,表2 WHERE 连接条件8.4.1 内连接o【例8-28】从“teaching”库中查询每个学生的姓名、课程号和成绩。oUSEteachingoSELECT,oFROMstudentINNERJOIN