版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.1简单select查询6.2select语句的统计功能6.3select语句中的多表连接6.4子查询第6章数据查询2/3/20231教学要求:通过本章学习,读者应掌握以下内容:利用SELECT语句进行单表查询的方法利用SELECT语句进行多表连接查询的方法嵌套查询的方法2/3/202326.1简单SELECT语句6.1.1SELECT的语法格式SELECT语句的基本语法格式如下:SELECT<字段列表> [INTO新表名] FROM<表名/视图名列表> [WHERE条件表达式] [GROUPBY列名列表] [HAVING条件表达式] [ORDERBY列名1[ASC|DESC],列名2[ASC|DESC],...,列名n[ASC|DESC]][COMPUTE行聚合函数名(统计表达式)[,…n][BY分类表达式[,…n]]]2/3/20233其中各子名说明如下:(1)字段列表用于指出要查询的字段,也就是查询结果中包含的字段的名称。(2)INTO子句用于创建一个新表,并将查询结果保存到这个新表中。(3)FROM子句用于指出所要进行查询的数据来源,即来源于哪些表或视图的名称。(4)WHERE子句用于指出查询数据时要满足的检索条件。(5)GROUPBY子句用于对查询结果分组。(6)ORDERBY子句用于对查询结果排序。2/3/20234SELECT语句的功能如下:从FROM列出的数据源表中,找出满足WHERE检索条件的记录,按SELECT子句的字段列表输出查询结果表,在查询结果表中可进行分组与排序。说明:在SELECT语句中SELECT子句与FROM子句是不可少的,其余的是可选的。2/3/202356.1.2基本的SELECT语句SELECT语句的基本形式如下: SELECT<字段列表> FROM<表名列表> [WHERE查询条件]1.选择表中若干列USExsglGOSELECT学号,姓名FROMxs2/3/202362.查询表中全部列(*)将表中所有属性都选出来,可以有两种方法。一种方法是在SELECT命令后面列出所有列名。如果列的显示顺序与其在基表中的顺序相同,也可以简单地将<字段列表>简写为“*”。USExsglGOSELECT*FROMkcGO2/3/202373.设置字段别名T-SQL提供了在SELECT语句中操作别名的方法。用户可以根据实际需要对查询数据的列标题进行修改,或者为没有标题的列加上临时标题。其语法格式为:列表达式[as]别名或:别名=列表达式【例6.3】查询xsgl数据库的kc表,列出表中的所有记录,每个记录名称依次为课程编号,课程名称,课程学分及课程时数。USExsglGOSELECT课程号AS课程编号,课程名AS课程名称,学分AS课程学分,学时数AS课程时数FROMkc2/3/202384.查询经过计算的值SELECT子句的<字段列表>不仅可以是表中的属性列,也可以是表达式,包括字符串常量、函数等。其语法格式为:计算字段名=表达式【例6.4】查询所有学生的学号,姓名及年龄。USExsglGOSELECT学号,姓名,年龄=DATEDIFF(YY,出生时间,GETDATE())FROMxsGO2/3/202395.返回全部记录(ALL)要返回所有记录可在SELECT后使用ALL,ALL是默认设置,因此也可以省略。【例6.5】查询XS表中所有学生专业。USExsglGOSELECT专业FROMxsGO2/3/2023106.过滤重复记录(DISTINCT)在例6.5的执行结果集中显示重复行。如果让重复行只显示一次,需在SELECT子句中用DISTINCT指定在结果集中只能显示唯一行。【例6.6】查询xs表中的学生所在专业有哪些。(重复专业只显示一次)。USExsglGOSELECTDISTINCT专业FROMxsGO2/3/2023117.仅返回前面若干条记录其语法格式如下:SELECT[TOPn︱TOPnPERCENT]列名l[,...n]FROM表名其中:TOPn表示返回最前面的n行,n表示返回的行数。TOPnPERCENT表示返回的最前面的n%行。【例6.7】查询xs表中前5条记录USExsglGOSELECTTOP5*FROMxsGO2/3/202312【例6.8】查询XS表中前面10%行记录USExsglGOSELECTTOP10PERCENT*FROMxsGO2/3/2023136.1.3使用INTO子句使用INTO子句允许用户定义一个新表,并且把SELECT子句的数据插入到新表中,其语法格式如下。SELECT<字段列表> INTO新表名 FROM<表名列表> WHERE查询条件使用INTO子句插入数据时,应注意以下几点:(1)新表不能存在,否则会产生错误信息。(2)新表中的列和行是基于查询结果集的。(3)使用该子句必须在目的数据库中具有CREATETABLE权限。(4)如果新表名称的开头为“#”,则生成的是临时表。注意:使用INTO子句,通过在WHERE子句中FALSE条件,可以创建一个和源表结构相同的空表。2/3/202314【例6.9】创建一个和xs表结构相同的xs_new表。USExsglGOSELECT*INTOxs_newFROMxsWHERE6>8设置“WHERE6>8”这样一个明显为逻辑否的条件的目的是为了只保留xs表的结构,而不返回任何记录。2/3/202315【例6.10】查询所有女生的信息并将结果保存在名为“女生表”的数据表中。USExsglGOSELECT*INTO女生表FROMxsWHERE性别='女'2/3/202316【例6.11】查询所有男生的信息并将结果存入临时表中。USExsglSELECT*INTO#TEMPDBFROMxsWHERE性别='男'要查看临时表的内容可用下面的语句:SELECT*FROM#TEMPDB2/3/2023176.1.4使用WHERE子句其语法格式如下:SELECT列名1[,…列名n]FROM表名WHERE条件表达式使用WHERE子句可以限制查询的记录范围。在使用时,WHERE子句必须紧跟在FROM子句后面。WHERE子句中的条件是—个逻辑表达式,其中可以包含的运算符见表6-1。2/3/2023182/3/2023191.比较表达式作查询条件比较表达式是逻辑表达式的一种,使用比较表达式作为查询条件的一般表达形式是:表达式比较运算符表达式其中:表达式为:常量、变量和列表达式的任意有效组合。比较运算符包括:=(等于)、<(小于)、>(大于)、<>(不等于)、!>(不大于)、!<(不小于)、>=(大于等于)、<=(小于等于)、!=(不等于)。2/3/202320【例6.12】查询年龄在23岁以下的学生。USExsglGOSELECT姓名,性别,年龄=DATEDIFF(YEAR,出生时间,GETDATE())FROMxsWHEREDATEDIFF(YEAR,出生时间,GETDATE())<=23GO2/3/2023212.逻辑表达式作查询条件使用逻辑表达式作为查询条件的一般表达形式是:表达式1AND|OR表达式2,或NOT表达式【例6.13】查询年龄为23岁且性别为“女”的学生。USExsglGOSELECT姓名,性别,年龄=DATEDIFF(YEAR,出生时间,GETDATE())FROMxsWHEREDATEDIFF(YEAR,出生时间,GETDATE())=23AND性别='女'2/3/2023223.使用(NOT)BETWEEN…AND关键字其语法格式为:表达式[NOT]BETWEEN表达式lAND表达式2谓词可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。使用BETWEEN限制查询数据范围时同时包括了边界值,而使用NOTBETWEEN进行查询时没有包括边界值。【例6.14】查询年龄在20到22之间的女学生的学号,姓名,年龄。USExsglGOSELECT姓名,性别,年龄=DATEDIFF(YEAR,出生时间,GETDATE())FROMxsWHEREDATEDIFF(YEAR,出生时间,GETDATE())BETWEEN20AND22AND性别='女'2/3/2023234.使用IN关键字同BETWEEN关键字一样,IN的引入也是为了更方便地限制检索数据的范围,灵活使用IN关键字,可以用简洁的语句实现结构复杂的查询。语法格式为:表达式[NOT]IN(表达式1,表达式2[,…表达式n])如果“表达式”的值是谓词IN后面括号中列出的表达式1,表达式2,…表达式n的值之一,则条件为真。【例6.15】查询选修了“a003”和“j003”的学生的学号。USExsglGOSELECTDISTINCT学号FROMcjWHERE课程号IN('a003','j003')GO2/3/2023245.使用LIKE关键字语法格式:表达式[NOT]LIKE<匹配串>其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符。SQLServer提供了以下4种通配符供用户灵活实现复杂的查询条件。%(百分号):表示从0到n个任意字符。_(下划线):表示单个的任意字符。[](封闭方括号):表示方括号里列出的任意一个字符。[^]:任意一个没有在方括号里列出的字符。需要注意的是,以上所有通配符都只有在LIKE子句中才有意义,否则通配符会被当作普通字符处理。2/3/202325【例6.16】查询姓“张”学生的学号及姓名USExsglGOSELECT学号,姓名FROMxsWHERE姓名LIKE'张%'GO注意:通配符和字符串必须括在单引号中。要查找通配符本身时,需将它们用方括号括起来。例如:LIKE'[[]'表示要匹配“[”。2/3/2023266.涉及空值的查询对于空值(NULL)要用IS进行连接,不能用“=”代替。【例6.17】查询选修了课程却没有成绩的学生的学号。USExsGOSELECT学号FROMcjWHERE成绩ISNULLGO2/3/2023276.1.5使用ORDERBY子句对查询的结果进行排序,通过使用ORDERBY子句实现。语法格式如下:ORDERBY表达式1[ASC︱DESC][,…n]]其中,表达式给出排序依据,即按照表达式的值升序(ASC)或降序(DESC)排列查询结果。在默认的情况下,ORDERBY按升序进行排列,即默认使用的是ASC关键字。不能按ntext、text或image类型的列排序,因此ntext、text或image类型的列不允许出现在ORDERBY子句中。2/3/202328【例6.18】按年龄从小到大的顺序显示女学生的姓名,性别及出生时间。USExsglGOSELECT姓名,性别,出生时间FROMxsWHERE性别='女'ORDERBY出生时间DESCGO2/3/2023296.2SELECT语句的统计功能为了进一步方便用户,增强检索功能,SELECT语句中的统计功能可以对查询结果集进行求和、求平均值、求最大最小值等操作。统计的方法是通过集合函数和GROUPBY子句、COMPUTE子句进行组合来实现。6.2.1使用集合函数汇总查询是把存储在数据库中的数据作为一个整体,对查询结果得到的数据集合进行汇总或求平均值等各种运算。SQLServer提供了一系列统计函数,用于实现汇总查询。常用的统计函数见表6-2。2/3/2023302/3/202331【例6.19】查询学生总人数USExsglGOSELECT学生总人数=COUNT(*)FROMxsGO查询结果如图6.17所示2/3/202332如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。【例6.20】查询选修了“a003”课程的学生人数。USExsglGOSELECT选课人数=COUNT(DISTINCT学号)FROMcjWHERE课程号='a003'GO2/3/202333【例6.21】查询选修了“a001”号课程的学生最高分数。USExsglGOSELECTa001课程最高分=MAX(成绩)FROMcjWHERE课程号='a001'GO2/3/2023346.2.2使用GROUPBY子句其语法格式如下。GROUPBY列名[HAVING条件表达式]HAVING条件表达式选项是对生成的组进行筛选。2/3/202335【例6.22】在xs表中分专业统计出男生和女生的平均年龄及人数,结果按性别排序。USExsglGOSELECT专业,性别,AVG(DATEDIFF(YEAR,出生时间,GETDATE()))AS平均年龄,COUNT(*)AS人数FROMxsGROUPBY专业,性别ORDERBY性别GO2/3/202336【例6.23】查询cj表中平均成绩大于80分的学生的学号、平均分,并按分数由高到低排序。USExsglGOSELECT学号,AVG(成绩)AS平均成绩FROMcjGROUPBY学号HAVINGAVG(成绩)>=80ORDERBYAVG(成绩)DESCGO2/3/202337注意:WHERE子句是对表中的记录进行筛选,而HAVING子句是对组内的记录进行筛选,在HAVING子句中可以使用集合函数,并且其统计运算的集合是组内的所有列值,而WHERE子句中不能使用集合函数。2/3/2023386.2.3使用COMPUTE子句使用COMPUTEBY子句,它对BY后面给出的列进行分组显示,并计算该列的分组小计。其语法格式如下:COMPUTE集合函数[BY分类表达式]注意:(1)COMPUTE或COMPUTEBY子句中的表达式,必须出现在选择列表中,并且必须将其指定为与选择列表中的某个表达式完全一样,不能使用在选择列表中指定的列的别名。(2)在COMPUTE或COMPUTEBY子句中,不能指定为ntext、text和image数据类型。(3)如果使用COMPUTEBY,则必须也使用ORDERBY子句。表达式必须与在ORDERBY后列出的子句相同或是其子集,并且必须按相同的序列。例如,如果ORDERBY子句是:ORDERBYa,b,c则COMPUTE子句可以是下面的任意一个(或全部),即:COMPUTEBYa,b,cCOMPUTEBYa,bCOMPUTEBYa(4)在SELECTINTO语句中不能使用COMPUTE。因此,任何由COMPUTE生成的计算结果不出现在用SELECTINTO语句创建的新表内。2/3/202339【例6.24】在cj表中求每门课程成绩大于90分的人数,并显示统计的明细。USExsglGOSELECT*FROMcjWHERE成绩>=90ORDERBY课程号COMPUTECOUNT(课程号)BY课程号GO2/3/2023406.3SELECT语句中的多表连接在实际工作中,我们所查询的内容往往是涉及多张表中的内容。连接查询的目的是通过加载连接字段条件将多个表连接起来,以便从多个表中检索用户所需要的数据。在SQLServer中连接查询类型分为交叉连接、内连接、外连接、自连接。连接查询就是关系运算的连接运算,它是从多个数据源间(FORM)查询满足—定条件的记录。2/3/2023416.3.1交叉连接交叉连接也叫非限制连接,它是将两个表不加任何约束地组合起来。也就是将第一个表的所有行分别与第二个表的每行形成一条新的记录,连接后该结果集的行数等于两个表的行数积,列数等于两个表的列数和。在数学上,就是两个表的笛卡尔积,在实际应用中一般是没有意义的,但在数据库的数学模式上有重要的作用。其语法结构如下:SELECT列名列表FROM表名1CROSSJOIN表名2或者SELECT列名列表FROM表名1,表名22/3/2023426.3.2内连接内连接也叫自然连接,它是组合两个表的常用方法。内连接就是只包含满足连接条件的数据行,是将交叉连接结果集按照连接条件进行过滤的结果。连接条件通常采用“主键=外键”的形式。内连接有以下两种语法格式。其语法结构如下:SELECT列名列表FROM表名1[INNER]JOIN表名2ON表名1.列名=表名2.列名或SELECT列名列表FROM表名1,表名2WHERE表名1.列名=表名2.列名2/3/2023436.3.3外连接在自然连接中,只有在两个表中匹配的才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即另外一个表中的所有行都出现在结果集中)。外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。2/3/2023441.左外连接SELECT列名列表FROM表名1ASALEFT[OUTER]JOIN表名2ASBONA.列名=B.列名2.右外连接其语法格式如下:SELECT列名列表FROM表名1ASARIGHT[OUTER]JOIN表名2ASBONA.列名=B.列名2/3/2023453.全外连接其语法格式如下:SELECT列名列表FROM表名1ASAFULL[OUTER]JOIN表名2ASBONA.列名=B.列名2/3/2023466.3.4自连接连接操作不仅可以在不同的表上进行,也可以在同一张表内进行自身连接,即将同一个表的不同行连接起来。自连接可以看作一张表的两个副本之间的连接。表名在FROM子句中出现两次,必须对表指定不同的别名,在SELECT子句中引用的列名也要使用表的别名进行限定,使之在逻辑上成为两张表。2/3/2023476.3.5合并结果集合并查询也称联合查询是将两个或两个以上的查询结果合并,形成一个具有综合信息的查询结果。使用UNION语句可以把两个或两个以上的查询结果集合并为一个结果集。其语法格式如下:查询语句UNION[ALL]查询语句注意:(1)联合查询是将两个表(结果集)顺序连接。(2)UNION中的每一个查询所涉及到的列必须具有相同的列数、相同位置的列的数据类型要相同。若长度不同,以最长的字段作为输出字段的长度。(3)最后结果集中的列名来自第一个SELECT语句。(4)最后一个SELECT查询可以带ORDERBY子句,对整个UNION操作结果集起作用。且只能用第一个SELECT查询中的字段作排序列。(5)系统自动删除结果集中重复的记录,除非使用ALL关键字。2/3/2023486.4子查询在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为子查询。子查询总是写在圆括号中,可以用在使用表达式的任何地方。上层的查询块称为外层查询或父查询,下层查询块称为内查询或子查询。SQL语言允许多层嵌套查询。即一个子查询中还可以嵌套其他子查询。注意:子查询的SELECT语句中不能使用ORDERBY子句,ORDERBY子句只能对最终查询结果排序。2/3/2023496.4.1嵌套子查询嵌套子查询的执行不依赖于外部嵌套。其一般的求解方法是由里向外处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。1.比较测试中的子查询比较测试中的子查询是指父查询与子查询之间用比较运算符进行连接。但是用户必须确切地知道子查询返回的是一个单值,否则数据库服务器将报错。返回的单个值被外部查询的比较操作(如:=、!=、<、<=、>、>=)使用,该值可以是子查询中使用集合函数得到的值。2/3/202350【例6.33】求选修了哲学课程的学生的学号及姓名。USExsglGOSELECTxs.学号,姓名,专业FROMxs,cjWHERExs.学号=cj.学号ANDcj.课程号=(SELECT课程号FROMkcWHERE课程名='哲学')GO2/3/202351【例6.34】在xs表中查询和“程明”在同一专业的所有男同学信息。USExsglGOSELECT*FROMxsWHERE性别='男'AND专业=(SELECT专业FROMxsWHERE姓名='程明')AND姓名<>'程明'GO2/3/2023522.集合成员测试中的子查询集合成员测试中的子查询是指父查询与子查询之间用IN或NOTIN进行连接,判断某个属性列值是否在子查询的结果中,通常子查询的结果是一个集合。IN表示属于,即外部查询中用于判断的表达式的值与子查询返回的值列表中的一个值相等;NOTIN表示不属于。【例6.35】求选修了学分为5分的课程的学生的学号及姓名。USExsglGOSELECTDISTINCTxs.学号,姓名,专业FROMxs,cjWHERExs.学号=cj.学号ANDcj.课程号IN(SELECT课程号FROMkcWHERE学分=5)2/3/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 准时仓储配送协议
- 融资服务协议书
- 招标文件工期保证协议
- 成绩不佳改进书
- 自力式调节阀门采购协议
- 民间借款合同范本范文
- 仿真绿植购买协议书
- 河沙碎石采购销售协议
- 确保民工薪酬承诺书
- 高低压电力设施招标
- ISO15189培训测试卷及答案
- QCT457-2023救护车技术规范
- 近视防治指南(2024年版)附高度近视防控专家共识
- 静脉输液课件完整版
- 2024风电场智慧运维技术方案
- MOOC 唐宋诗词与传统文化-湖南师范大学 中国大学慕课答案
- 电网建设项目施工项目部环境保护和水土保持标准化管理手册(变电工程分册)
- 专题01非连续性文本阅读(解析版)
- 国开2024年《统计学原理》形成性考核1-3答案
- 2024年-咨询服务合同协议书范本
- 弹力袜的使用课件
评论
0/150
提交评论