资源描述
熟悉SELECT语法格式掌握WHERE,ORDERBY,GROUPBY,HAVING子句掌握基本的多表查询掌握内连接、外连接、交叉连接和联合查询了解自连接的使用掌握多行和单值子查询的使用了解嵌套子查询的使用,第4章获取数据,4.1基本SELECT查询语句,SELECT语句的执行窗口:使用SQL编辑器,数据查询,假定已建好Students、Courses、Enrollment三个表,并已向各个表添加了数据(见下页表)。,讨论一下数据查询问题:数据查询用来描述怎样从数据库中获取所需的数据。数据查询用到的语句就是查询语句,即SELECT语句,它是数据库操作中最基本、最重要的语句之一。SELECT语句的功能就是从一个或多个表或视图(一种虚拟表)中查到满足条件的数据。它的数据源是表或视图,而结果是另一个表。,查询语句基本结构,语法:SELECTFROMWHEREGROUPBYHAVINGORDERBY,SELECT语句说明SELECT语句包括:SELECT子句,FROM子句,可选的WHERE子句、GROUPBY子句、HAVING子句和ORDERBY子句。SELECT,称为SELECT子句,用于指定整个查询结果表中包含的列。假定已经执行完FROM、WHERE、GROUPBY、HAVING子句,从概念上来说得到了一个表,若将该表称为T,从T表中选择SELECT子句指定的目标列组成表就为整个查询的结果表。,(2)FROM,称为FROM子句。用于指定整个查询语句用到的一个或多个基本表或视图,是整个查询语句的数据来源,通常称为数据源表。(3)WHERE,称为WHERE子句。用于指定多个数据源表的连接条件和单个源表中行的筛选条件或选择条件。如果只有一个源表,则没有表间的连接条件,只有行的筛选条件。,(4)GROUPBY,称为GROUPBY子句。假定已经执行完FROM、WHERE子句,则从概念上来说得到了一个表,若将该表称为T1表,则GROUPBY用于指定T1表按哪些列(称为分组列)进行分组,所有这些行组成一个表,不妨把它称为T2表,T2表实际上是一个组表。(5)HAVING,称为HAVING子句。与GROUPBY子句一起使用。用于指定组表T2表的选择条件,即选择T2表中满足的行,组成一个表就是SELECT子句中提到的表T。,(6)ORDERBY,称为ORDERBY子句。若有ORDERBY子句,则用于指定查询结果表T中按指定列进行升序或降序排序,得到整个查询的结果表。SELECT语句包含了关系代数中的选择、投影、连接、笛卡儿积等运算。下面首先学习单表查询SELECT语句中的各个子句,4.1.1单表查询,单表查询指的是在一个源表中查找所需的数据。因此,单表查询时,FROM子句中的只要给出一个源表表名。1.SELECT子句(1)选择表中若干列在SELECT子句的中指定整个查询结果表中出现的若干个列名,各列名之间用逗号分隔,【例4.1】查询全体学生的学号与姓名SELECTSno,SnameFROMStudents【例4.2】查询数据库studentcourse学生基本信息表s中学生的学号,姓名,所在系。SELECT学号,姓名,系FROMs,(2)选择表中所有列(无条件查询)可以在中指定表中所有列的列名,也可以用*来代替,或用.*代表指定表的所有列。*代表所有列;输出显示列的次序由SELECT指定【例4.1】查询所有学生可选的课程信息。SELECT*FROMc*表示选择当前表的所有属性列【例4.2】查询全体学生的学号、姓名、性别、年龄、所在系SELECTSno,Sname,Ssex,Sage,SdeptFROMStudents等价于:SELECT*FROMStudents,(3)查询的数据可以使用表达式表达式可以是列名、常量、函数、或用列名、常量、函数等经过+(加)、-(减)、*(乘)、/(除)等组成的公式。【例4.3.3】查询全体学生的选课情况,即学号、课程号、成绩,对成绩值都加5。SELECTSno,Cno,Grade+5FROMEnrollment,注意:结果中表达式列Grade5无列名。实际上所有表达式列都没有列名。,(4)设置列的别名所谓别名,就是另一个名字。有时需要显示特殊的输出列名,主要是为了方便阅读。例如:select职称高校教师职称from教师,设置列别名的方法有:原列名AS列别名或者:列别名原列名【例4.3.4】查询全体学生的学号、姓名,并为原来的英文列名设置中文别名。以下三种方法等价:SELECTSno学号,Sname姓名FROMStudentsSELECTSnoAS学号,SnameAS姓名FROMStudentsSELECT学号=Sno,姓名=SnameFROMStudents,【例4.3.5】查询全体学生的选课情况,其成绩列值都加5,并为各列设置中文的别名SELECTSno学号,Cno课程号,Grade+5成绩FROMEnrollment结果为:,【例4.4】查询表s的学号和姓名信息,其中设置学号的别名为xh,设置姓名的别名为xmSELECT学号ASxh,姓名ASxmFROMS或SELECT学号ASxh,姓名ASxmFROMS或SELECT学号ASxh,姓名ASxmFROMS或SELECTxh=学号,xm=姓名FROMS,(5)使用DISTINCT消除结果表中完全重复的行,例如:SELECT职称from教师职称副教授讲师教授教授selectdistinct职称from教师,【例3.3.6】显示所有选课学生的学号。SELECTSno学号FROMEnrollment【例4.3.7】显示所有选课学生的学号,并去掉重复行。SELECTDISTINCTSno学号FROMEnrollment与DISTINCT相反的是ALL,ALL表示保留结果表中的重复行。默认情况下是ALL,表示保留重复行。,2.FROM子句,单表查询中,源表只有一个:FROM例如,要查找学生有关的信息,用到Students表,则FROM子句为:FROMStudents例如,要查找课程有关的信息,用到Courses表,则FROM子句为:FROMCourses例如,要查找选课有关的信息,用到Enrollment表,则FROM子句为:FROMEnrollment,3、通过TOP子句限制结果集输出的行数,(1)命令格式SELECTTOPnPERCENT属性列表(2)功能n是一个正整数,如果指定PERCENT关键字,则返回前百分之n条记录,n必须介于0到100之间的正整数。比如“SELECTTOP3”表示输出查询结果集的前3行,“SELECTTOP3PERCENT”表示输出查询结果集的前3%记录行。例如:selectdistincttop8籍贯from学生信息,【例4.8】将课程成绩70分以下的同学的成绩提高5分,然后把结果存储到(另存)新数据表“最新成绩”中。SELECT成绩+5AS最新成绩INTO最新成绩FROMscWHERE成绩(大于)、=(大于等于)、(不等于)、!(不大于)、!(不小于)共9种。,范围比较运算符:BETWEENAND,NOTBETWEENAND集合比较运算符:IN,NOTIN字符匹配运算符:LIKE,NOTLIKE空值比较运算符:ISNULL,ISNOTNULL条件连接运算符:AND,OR,NOT,基于其它运算符的查询,【例4.10】在基本表S中检索1978-01-06出生的学生情况。SELECT*FROMsWHERE出生日期=1978-01-06【例4.11】在基本表S中检索1978年及以后出生的学生情况。SELECT*FROMsWHEREyear(出生日期)=1978或SELECT*FROMsWHEREyear(出生日期)!1970andyear(出生日期)=2ORDERBYAVG(Grade)DESC,【例】在SC表中,查询学号为1的同学获得最高成绩的课程号。【例】在SC表中,找出选修了课程号为2的课程,而且课程成绩最高的前两位同学。,4.1.4GROUPBY子句有时我们需要把FROM、WHERE子句产生的表按某种原则分成若干组,然后再对每个组进行统计,一组形成一行,最后把所有这些行组成一个表,称为组表。GROUPBY子句在WHERE子句后边。一般形式为:GROUPBY,n其中是分组的依据。分组原则是的列值相同,就为同一组。当有多个时,则先按第一个列值分组,然后对每一组再按第二个列值进行分组,依此类推。,【例4.27】求选修每门课程的学生人数。SELECTCnoAS课程号,COUNT(Sno)AS选修人数FROMEnrollmentGROUPBYCno,【例4.28】输出每个学生的学号和他/她的各门课程的总成绩。SELECTSno学号,Sum(grade)总成绩FROMEnrollmentGROUPBYSno,注意:包含GROUPBY子句的查询语句中,SELECT子句指定的列名,要么是统计函数,如上例中的COUNT(Sno),要么是包含在GROUPBY子句中的列名,如上例中的Cno,否则将出错。如下列语句是错误的:SELECTSnoAS学号,CnoAS课程号,COUNT(Sno)AS选修人数FROMEnrollmentGROUPBYCno因为SELECT子句中的Sno列,既不是统计函数,也不是GROUPBY子句中的列名。,4.1.5HAVING子句HAVING子句指定GROUPBY生成的组表的选择条件,在GROUPBY子句之后,并且必须与GROUPBY子句一起使用。一般形式为:HAVING例4.29:求选修课程大于等于2门课的学生的学号、平均成绩,选修的门数。SELECTSno,AVG(Grade)AS平均成绩,COUNT(*)AS选修门数FROMEnrollmentGROUPBYSnoHAVINGCOUNT(*)=2,本讲总结,一、SELECT语句的执行窗口二、查询语句基本结构三、SELECT语句说明四、单表查询1.SELECT子句(1)选择表中若干列(2)选择表中所有列(无条件查询)(3)使用表达式(4)设置列的别名(5)使用DISTINCT消除结果表中完全重复的行,1.SELECT子句2.FROM子句3、通过TOP子句限制结果集输出的行数4、INTO子句的使用5、WHERE子句6、GROUPBY子句7、HAVING子句8、ORDERBY子句,5.WHERE子句(1)基于比较运算符的查询(2)基于BETWEENAND的查询(3)基于IN的查询(4)基于LIKE的查询(5)基于NULL空值的查询(6)基于多个条件的查询(7)使用统计函数的查询,练习,SELECT语句必需有的两个关键字是?在SQL语句中对输出结果排序的语句?SELECT语句中何时使用分组子句,何时不必使用分组子句?,1、有两个表:COURSES(CNO,CN,PCNO)ENROLLMENT(SNO,CON,GRADE)其中,COURSES为课程表关系,对应的属性分别是课号、课程名和选修课号,ENROLLMENT为学生选课表,对应的属性分别是学号、课号和成绩。用SQL语言写出:对表ENROLLMENT中课号等于C1的选择运算。对表COURSES的课号、课程名的投影运算。两个表的自然连接运算。,作业,2、已知学生表S和学生选课表ENROLLMENT,其表中所具有的列如下。S(SNO,SN,SD,PROV)ENROLLMENT(SNO,CN,GRADE)其中,SNO为学号,SN为姓名,SD为系名,PROV为省区,CN为课程名,GRADE为分数。试用SQL语言实现下列操作:(1)查询“信息系”学生来自哪些省区(2)按分数降序排列,输出“英语系”学生中选修了“计算机”课程的学生的姓名和分数,
展开阅读全文