数据库技术及应用(SQL Server )1.7_第1页
数据库技术及应用(SQL Server )1.7_第2页
数据库技术及应用(SQL Server )1.7_第3页
数据库技术及应用(SQL Server )1.7_第4页
数据库技术及应用(SQL Server )1.7_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

数据库技术及应用(SQLServer)教学单元1.7第7章

SELECT数据查询(基本)

案例1-7教务管理SELECT数据查询SELECT数据查询学习导航2SELECT数据查询知识框架3单元1.7

SELECT数据查询(基本)能力目标能够充分认识到SQL数据查询是数据库的重要技术,是数据库的主要应用目的。熟练掌握各种查询为数据库应用系统的开发奠定基础能够根据数据库应用系统功能需求对表进行投影查询、连接查询、选择查询、分组统计查询、限定查询、排序查询、保存查询能够阅读并熟练书写SELECT查询语句和有关参数(英文)4单元1.7

SELECT数据查询(基本)知识目标SELECT查询语句的语法格式和应用投影、连接和选择查询的语法与应用分组统计、限定、排序和保存查询的语法与应用素质目标培养与用户沟通的能力,以便能很好地满足用户的应用需求通过大量的训练,培养积极、自信和严谨的工作作风通过复杂的训练,培养克服困难、开动脑筋、积极解决问题的能力5单元1.7

SELECT数据查询(基本)6案例1-7教务管理SELECT数据查询根据教务管理系统的功能需求,应用T-SQL的SELECT查询语句对数据库“EDUC”中所创建的表进行数据查询(检索)。工作任务单元1.7

SELECT数据查询(基本)7用户可以使用SELECT语句从数据库中按照功能需求查询出数据信息实现对关系的投影、选择和连接的专门关系运算可以得到经过分类、统计和排序处理后的查询结果T-SQL完全支持SQL-92标准的SELECT语句SELECT语句是数据库应用最广泛和最重要的语句之一区别起见,对于实现查询功能的SELECT语句我们称之为SELECT查询语句SELECT数据查询语句的功能与特点一、SELECT查询语句结构8SELECT表达式[,...n] --投影(计算统计)[INTO新表名] --保存FROM表名[,...n] --连接[WHERE逻辑表达式] --选择[GROUPBY表达式[,...n]] --分组统计[HAVING逻辑表达式] --限定分组统计[ORDERBY表达式[,...n]] --排序SELECT…FROM一、SELECT查询语句结构9功能与说明:对一个或多个表(基表或视图)按一定的条件和需求进行查询,产生出一个新表(即查询结果),该新表可被显示出来、作为表(子查询)再应用或者被命名保存起来。SELECT语句中的子句顺序非常重要,可以省略任选子句,但这些子句在使用时必须按规定的顺序出现。SELECT查询语句中的表达式由*|列名、常量、变量、函数和运算符构成。很多情况下表达式仅为表的列名。SELECT…FROM一、SELECT查询语句结构10功能与说明:SELECT查询语句作为嵌入式语言,可以嵌入在各种高级语言中实现对数据库的访问。SELECT查询语句作为自含式语言,可以使用SSMS的【查询编辑器】进行编辑、编译、执行和保存。SELECT…FROM二、SELECT子句投影查询11SELECT[ALL|DISTINCT][TOPn]表达式[,...n]功能说明:SELECT子句主要是一个用逗号分隔的表达式列表,用于对查询结果集进行投影操作。SELECT子句中的表达式主要为要投影的表的列名,也可以由其他常量、变量、函数和运算符构成。此外,还有一些参数可以根据需要进行选择,下面将通过实例分别讲解它们的应用。SELECT…语法二、SELECT子句投影查询12语法:*|列名[,...n]说明:当表达式为通配符“*”时,按表中所有列名的原有顺序进行投影查询。当表达式为一个或多个列名时,按列名的顺序对表进行投影查询。1.投影某些列的值二、SELECT子句投影查询131.投影某些列的值【例7-1】从课程表“Course”中查询出所有数据信息。代码SELECT*FROMCourse --通配符“*”代表投影所有列查询结果二、SELECT子句投影查询141.投影某些列的值【例7-2】从课程表“Course”中查询出课程号“CID”、学分“Credit”和课程名“Cname”的数据信息。代码SELECTCID,Credit,Cname --投影列CID,Credit,CnameFROMCourse --查询表Course查询结果二、SELECT子句投影查询15语法:TOPn[PERCENT]说明:如果未指定关键字PERCENT,则返回查询结果集的前n行数据。如果指定了关键字PERCENT,n就是查询返回结果集行的百分比。2.

限制返回行数二、SELECT子句投影查询16【例7-3】从学生表“Student”中查询出前3行数据。代码:SELECTTOP3SID,Sname,Sex,Birthdate--返回前3行数据FROMStudent查询结果:2.

限制返回行数二、SELECT子句投影查询17【例7-4】从学生表“Student”中查询出前20%行数据。代码:SELECTTOP20PERCENTSID,Sname,Sex,Birthdate--返回前20%行的数据FROMStudent查询结果:21行数据,21*20%=4.2,取整数52.

限制返回行数二、SELECT子句投影查询18语法:All|DISTINCT功能说明:指定All(缺省)关键字将保留查询结果集中的全部数据行。当对表进行投影操作之后,在查询结果集中可能会出现重复的数据行,使用DISTINCT关键字可消除查询结果集中的重复数据行。3.消除重复行二、SELECT子句投影查询19【例7-5】从学生表“Student”中查询出学校各专业的名称。可以用DISTINCT关键字消除重复的专业名称。代码:SELECTDISTINCTSpecialty--使用DISTINCT消除重复数据行FROMStudent查询结果:3.消除重复行二、SELECT子句投影查询20语法:表达式[,...n]说明:在SELECT子句的表达式中可以使用加(+)、减(−)、乘(*)、除(/)、取模(%)和字符连接(+)等运算符及各种函数进行运算,通过对表达式的计算来获取查询结果的列值。值得注意的是,对表中列的计算只是影响查询结果,并不改变表中的数据。4.投影表达式的值二、SELECT子句投影查询21【例7-6】从课程表“Course”中查询出学分对应的课程学时(假设每18学时计1学分),显示前5行。代码(表达式含运算符)SELECTTOP5CID,Cname,Credit,Credit*18FROMCourse查询结果:4.投影表达式的值二、SELECT子句投影查询22【例7-6】从课程表“Course”中查询出学分对应的课程学时(假设每18学时计1学分),显示前5行。代码(表达式含函数)SELECTTOP5CID,Cname,Credit,STR(Credit*18,3,0)+'学时'FROMCourse查询结果:4.投影表达式的值二、SELECT子句投影查询23【例7-7】从课程表“Course”中查询出学分和对应的课程学时,并显示前5行。代码(表达式为常量)SELECTTOP5CID,Cname,Credit,'学分',STR(Credit*18,3,0),'学时’FROMCourse查询结果:4.投影表达式的值二、SELECT子句投影查询24语法1:指定的列标题=表达式语法2:表达式[AS]指定的列标题说明:自定义列标题后,在查询结果的标题位置将显示指定的列标题,而不再显示表中定义的列名。如果指定的列标题不是常规标识符(如含有空格等),则要使用分隔符界定。语法中AS关键字可以不选。在默认情况下,数据查询结果显示的列标题就是在创建表时用的列名,用户可能不易识别。对于通过表达式计算出来的列(如以上几个例子),系统不指定列标题,而以“无列名”标识,这样的情况就可以为查询结果重新指定列标题。5.自定义列标题二、SELECT子句投影查询25【例7-8】对例7-6中得到的查询结果用中文显示列标题。代码(自定义列标题):SELECTTOP5CIDAS[课程号],CnameAS[课程名],Credit学分,学时=STR(Credit*18,3,0)FROMCourse查询结果:6.自定义列标题二、SELECT子句投影查询26语法:函数名([ALL|DISTINCT]表达式|*)说明:与其他函数不同,聚合函数的参数一般为列名或者包含列名的表达式,主要功能是对表在指定列名表达式的值上进行纵向统计和计算,所以也称之为列函数。聚合函数的参数中,ALL关键字表示函数对指定列的所有值进行统计和计算,DISTINCT关键字说明函数仅对指定列的唯一值(不计重复值)进行统计和计算,ALL为默认设置。6.投影聚合函数的值二、SELECT子句投影查询27语法:函数名([ALL|DISTINCT]表达式|*)常用函数:COUNT:统计列中选取的项目个数或查询输出的行数。SUM:计算指定的数值型列名表达式的总和。AVG:计算指定的数值型列名表达式的平均值。MAX:求出指定的数值、字符或日期型列名表达式的最大值。MIN:求出指定的数值、字符或日期型列名表达式的最小值。6.投影聚合函数的值二、SELECT子句投影查询28【例7-9】从学生表“Student”中统计出男生的人数。代码(表达式含有函数):SELECTCOUNT(*)AS人数--统计表中满足条件的行数FROMStudentWHERESex='男' --选择性别为男的行查询结果(以文本格式输出):人数-----------8(1行受影响)6.聚合函数(COUNT())二、SELECT子句投影查询29【例7-10】从学生表“Student”中统计出专业个数。注意,DISTINCT关键字的作用是消除重复行,即每个专业只计一次。代码(表达式含有函数):--统计表“Student”中名称不重复的专业个数SELECTCOUNT(DISTINCTSpecialty)AS专业个数FROMStudent查询结果(以文本格式输出):专业个数-----------4(1行受影响)6.聚合函数(COUNT(DISTINCT))二、SELECT子句投影查询30【例7-11】从学生表“Student”中统计出学生的总数、录取分数“AScores”的最高分、最低分、总分(无实际意义,仅为举例)和平均分。代码(表达式含有函数):SELECT

COUNT(*)AS总人数, --统计总数

MAX(AScores)AS最高分,MIN(AScores)AS最低分,--求最大和最小

SUM(AScores)AS总分, --求和STR(AVG(AScores),5,1)AS平均分

--求平均FROMStudent查询结果:6.聚合函数(COUNT,MAX,SUM,AVG)三、FROM子句连接查询31语法:FROM{表名|虚表名}[,...n]说明:指定要查询的基表或视图(虚表)。如果指定了一个以上的基表或视图,则计算它们之间的笛卡儿积,与WHERE子句等值条件配合实现连接查询。有关连接查询的ANSI语法及应用将在后续课程中专门介绍。FROM…语法三、FROM子句连接查询32【例7-12】从教务管理数据库“EDUC”中查询出学生的学号、姓名、所选课程名和成绩信息。代码(多表连接):SELECTStudent.SID,Sname,Cname,Scores --投影各表的列FROMStudent,SC,Course

--三个表进行笛卡儿积WHEREStudent.SID=SC.SIDANDSC.CID=Course.CID--等值连接条件查询结果:1.指定基表三、FROM子句连接查询33语法:表名[AS]别名说明:其中AS关键字可以不选。别名可以简化表名,此外还可以实现自连接。2.为基表指定临时别名三、FROM子句连接查询34【例7-13】同上例,为基表“Student”、“Course”和“SC”指定别名为x、y和z以简化表名。代码:SELECTx.SID,Sname,Cname,Scores--投影各表的列FROMStudentASx,SCASy,CourseASz--为三个表指定别名WHEREx.SID=y.SIDANDy.CID=z.CID --等值条件连接2.为基表指定临时别名三、FROM子句连接查询35【例7-14】从选课表“SC”中查询出选了至少两门课程的学生的学号。代码:第一步SELECTx.SID,x.CID,y.CIDFROMSCx,SCy--为表指定别名,实现自连接WHEREx.SID=y.SIDANDx.CID<>y.CID2.为基表指定临时别名三、FROM子句连接查询36查询结果:说明:连接查询结果的各行中,对于某学生的学号列“SID”,第二列课程号“x.CID”和第三列课程号“y.CID”不同,即说明这些学生选了至少两门课程。2.为基表指定临时别名三、FROM子句连接查询37【例7-14】对于此例在SELECT子句中对学号进行投影,并加上DISTINCT参数,则会消除查询中重复的行。代码:SELECTDISTINCTx.SIDAS学号FROMSCx,SCyWHEREx.SID=y.SIDANDx.CID<>y.CID 查询结果:2.为基表指定临时别名四、WHERE子句选择查询38语法:WHERE逻辑表达式说明:WHERE子句用于选择操作,逻辑表达式用于描述查询条件。当数据行的数据满足查询条件(逻辑表达式为真)时,向SELECT查询结果集提供数据,否则,其中的数据将不被采用。WHERE子句还用在DELETE和UPDATE语句中选择表中要被删除和修改的行。逻辑表达式:由列名、常量、变量、函数、子查询以及比较运算符或逻辑运算符等组成,其值为真(1,'True')或假(0,'False')。WHERE逻辑表达式四、WHERE子句选择查询39比较运算符:

=(等于)、<>(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)【例7-15】从学生表“Student”中查询出学生赵成刚的信息。代码:SELECT*FROMStudentWHERESname=‘赵成刚’--比较运算查询结果:1.比较运算符四、WHERE子句选择查询40【例7-16】从学生表“Student”中查询出软件技术专业学生的信息。代码:SELECT*FROMStudentWHERESpecialty=‘软件技术’--比较运算查询结果:1.比较运算符四、WHERE子句选择查询41【例7-17】从学生表“Student”中查询出到2025年满或大于22岁的学生信息。代码(系统日期2025年):SELECT*,DATEPART(year,GETDATE())-DATEPART(year,Birthdate)年龄FROMStudentWHEREDATEPART(year,GETDATE())-DATEPART(year,Birthdate)>=22查询结果:1.比较运算符四、WHERE子句选择查询42AND(与)运算符【例7-18】从学生表“Student”中查询出到2025年年满或大于22岁的女生信息。代码(系统日期2025年):SELECT*,DATEPART(year,GETDATE())-DATEPART(year,Birthdate)年龄FROMStudentWHEREDATEPART(year,GETDATE())-DATEPART(year,Birthdate)>=22ANDSex='女'--逻辑运算查询结果:2.逻辑运算符(NOT,AND,OR)四、WHERE子句选择查询43NOT(非)运算符【例7-19】从学生表“Student”中查询出到2025年不满22岁的男生信息。代码(系统日期2025年):SELECT*,DATEPART(year,GETDATE())-DATEPART(year,Birthdate)年龄FROMStudentWHERENOT(DATEPART(year,GETDATE())-DATEPART(year,Birthdate)>=22)ANDNOT(Sex='女')--逻辑运算查询结果:2.逻辑运算符(NOT,AND,OR)四、WHERE子句选择查询44OR(或)运算符【例7-20】从学生表“Student”中查询学号为2022216007和2023216089的学生信息。代码:SELECT*FROMStudentWHERESID=‘2022216007'ORSID=‘2023216089' --逻辑运算查询结果:2.逻辑运算符(NOT,AND,OR)四、WHERE子句选择查询45语法:表达式[NOT]BETWEEN开始值AND结束值说明:指表达式的值是否在开始值和结束值之间,其中表达式可以为表中的列名。表达式BETWEEN开始值AND结束值

等价于(表达式>=开始值AND表达式<=结束值)表达式NOTBETWEEN开始值AND结束值

等价于(表达式<开始值OR表达式>结束值)2.逻辑运算符(BETWEEN...AND)四、WHERE子句选择查询46【例7-21】从学生表“Student”中查询出入学录取分数在350分到360分之间的学生信息。代码:SELECT*FROMStudentWHEREAScoresBETWEEN350AND360--范围运算查询结果:2.逻辑运算符(范围运算符)四、WHERE子句选择查询47语法:表达式[NOT]LIKE字符串--含通配符说明:表达式的值(NOT,不)与给定符串(含通配符)相似时,逻辑表达式的值为真。通配符“_”代表一个任意字符,通配符“%”代表任意多个任意字符字符。模式匹配运算符LIKE可以实现对表的模糊查询。2.逻辑运算符(LIKE(模式匹配))四、WHERE子句选择查询48【例7-22】从学生表“Student”中查询出“李”姓的学生信息。代码:SELECT*FROMStudentWHERESnameLIKE'李%'--模式匹配模糊查询查询结果:2.逻辑运算符(LIKE(模式匹配)))四、WHERE子句选择查询49【例7-23】从课程表“Course”中查询出有关程序设计方面的课程。代码:SELECT*FROMCourseWHERECnameLIKE'%程序设计%'--模式匹配模糊查询查询结果:2.逻辑运算符(LIKE(模式匹配)))四、WHERE子句选择查询50语法:表达式〔NOT〕IN(列表|子查询)其中列表为:表达式[,...n]说明:表达式的值(NOT,不)与列表中任何表达式的值相等,则逻辑表达式的值为真。有关IN子查询的应用将在后续课程中进一步介绍。2.逻辑运算符(IN(列表))四、WHERE子句选择查询51【例7-24】从学生表“Student”中查询学号为2022216007和2023216089的学生信息。代码:SELECT*FROMStudentWHERESIDIN(‘2022216007’,‘2023216089’)--列名判断运算--等价“SID=‘202216007’ORSID=‘2023216089’”查询结果:2.逻辑运算符(IN(列表))四、WHERE子句选择查询52语法:表达式IS[NOT]NULL说明:在数据库的表中,除了必须具有值的列不允许为空外,许多列可以没有输入值,这时该列的值为空(NULL)。表达式的值(NOT,不)为空(NULL)时,则逻辑表达式的值为真。其中表达式可以为表中的列名,用于确定指定的列名值是否为NULL。3.谓词运算符(ISNULL)四、WHERE子句选择查询53【例7-25】从教务管理数据库“EDUC”中查询出考试成绩没有登记的学生信息。可先把表“SC”的某行的列“Scores”值改为空值“NULL(大写,自动倾斜)”,注意不要改为0,0也是分数。代码:SELECTStudent.SID,Sname,Cname,ScoresFROMStudent,SC,CourseWHEREStudent.SID=SC.SIDANDSC.CID=Course.CIDANDScoresISNULL--空值判断运算查询结果:3.谓词运算符(ISNULL)五、GROUPBY子句分组统计查询54语法:GROUPBY列表达式[,...n]说明:与列表达式(含有列名的表达式)或聚合函数配合实现分组统计。实际应用中往往需要根据某列的值进行分组统计与汇总。如需要从学生表中统计出各专业的学生总数,统计时用“GROUPBY专业名称”进行分组,然后计算聚合函数的值。如需要从选课表中计算出每位学生的总成绩等,统计时用“GROUPBY学号”来进行分组,然后计算聚合函数的值。注意:在SELECT子句中投影的列表达式必须包含在聚合函数中或者出现在相应的GROUPBY后的列表达式之中。GROUPBY列表达式五、GROUPBY子句分组统计查询55【例7-26】从学生表“Student”中查询出各专业学生入学录取平均分。代码:SELECTSpecialtyAS专业,平均分=str(AVG(AScores),5,1)--求各专业入学录取平均分FROMStudentGROUPBYSpecialty

--根据专业名称分组查询结果:GROUPBY列名表五、GROUPBY子句分组统计查询56【例7-27】从学生表“Student”中查询出各专业的学生总数,要求查询结果显示专业名称和人数两个列。代码:SELECT专业=Specialty,人数=COUNT(*)--统计各专业学生人数FROMStudentGROUPBYSpecialty

--根据专业名称分组查询结果:GROUPBY列名表五、GROUPBY子句分组统计查询57【例7-28】从选课表“SC”中统计出每位学生的总成绩,要求查询结果显示出学生的学号、姓名和总成绩。代码:SELECT学号=SC.SID,姓名=Student.Sname,总成绩=SUM(Scores)--求每位学生成绩的总和FROMSC,StudentWHERESC.SID=Student.SID--按照学号SID分组GROUPBYSC.SID,Student.Sname查询结果:说明:由于Student.Sname是投影列名,所以必须写在GROUPBY子句列名表中。GROUPBY列名表六、HAVING子句限定查询58语法:HAVING逻辑表达式说明:与GROUPBY子句配合筛选(选择)统计结果。对于以上使用GROUPBY子句分组统计的结果,还可以根据HAVING子句中逻辑表达式指定的条件进行筛选。HAVING子句的逻辑表达式通常包含聚合函数,值得注意的是聚合函数不能放在WHERE子句的逻辑表达式中。HAVING逻辑表达式六、HAVING子句限定查询59【例7-29】从选课表“SC”和学生表“Student”中查询总成绩超过150分的学生的学号、姓名和总成绩。代码:SELECTSC.SID,Student.Sname,总成绩=SUM(Scores) --求每位学生成绩的总和FROMSC,StudentWHERESC.SID=Student.SIDGROUPBYSC.SID,Student.Sname--按照学号SID分组HAVINGSUM(Scores)>150--对学生总成绩进行筛选HAVING逻辑表达式六、HAVING子句限定查询60代码:SELECT学号=SC.SID,姓名=Student.Sname,总成绩=SUM(Scores) --求每位学生成绩的总和FROMSC,StudentWHERESC.SID=Student.SIDGROUPBYSC.SID,Student.Sname--按照学号SID分组HAVINGSUM(Scores)>150--对学生总成绩进行筛选查询结果:说明:WHERESUM(Scores)>150是完全错误的,因为聚合函数SUM(Scores)不能放在WHERE子句的逻辑表达式中。HAVING逻辑表达式七、ORDERBY子句排序查询61语法:ORDERBY{表达式[ASC/DESC]}[,...n]说明:通常表达式为表的列名。按一列或多列(最多8060个字节)对查询结果进行升序(ASC:默认)或降序(DESC)排序。如果ORDERBY子句后是一个表达式表,则系统将根据各列表达式的次序决定排序的优先级,然后排序。ORDERBY无法对数据类型为varchar(max)、nvarchar(max)、varbinary(max)或xml的列使用,并只能在外查询中使用。如果指定了SELECTDISTINCT(消除重复行),那么ORDERBY子句中的列名就必须出现在SELECT子句的列表中。ORDERBY列名七、ORDERBY子句排序查询62【例7-30】从选课表“SC”和学生表“Student”中统计出每位学生的总成绩,并将结果按照总成绩降序排序。代码:SELECTSC.SID,Student.Sname,总成绩=SUM(Scores)FROMSC,StudentWHERESC.SID=Student.SIDGROUPBYSC.SID,Student.SnameORDER

BY

SUM(SCORES)DESC--按照总成绩降序排序ORDERBY列名七、ORDERBY子句排序查询63代码:

温馨提示

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

评论

0/150

提交评论