资源预览内容
第1页 / 共61页
第2页 / 共61页
第3页 / 共61页
第4页 / 共61页
第5页 / 共61页
第6页 / 共61页
第7页 / 共61页
第8页 / 共61页
第9页 / 共61页
第10页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
u熟悉熟悉SELECT语法格式语法格式u掌握掌握WHERE,ORDER BY,GROUP BY,HAVING子子句句u掌握基本的多表查询掌握基本的多表查询u掌握内连接、外连接、交叉连接和联合查询掌握内连接、外连接、交叉连接和联合查询u了解自连接的使用了解自连接的使用u掌握多行和单值子查询的使用掌握多行和单值子查询的使用u了解了解嵌套子查询嵌套子查询的使用的使用第第4章章 获取数据获取数据4.1 基本基本SELECT查询语句查询语句 SELECT语句的执行窗口语句的执行窗口:使用使用SQL编辑器编辑器 数据查询数据查询 假定已建好假定已建好Students、Courses、Enrollment三个三个表,并已向各个表添加了数据(见下页表)。表,并已向各个表添加了数据(见下页表)。讨论一下数据查询问题:讨论一下数据查询问题:数据查询用来描述怎样从数据库中获取所需的数据。数据查询用来描述怎样从数据库中获取所需的数据。数据查询用到的语句就是查询语句,即数据查询用到的语句就是查询语句,即SELECT语句语句,它是数据库操作中最基本、最重要的语句之一。,它是数据库操作中最基本、最重要的语句之一。SELECT语句的功能就是从一个或多个表或视图(一语句的功能就是从一个或多个表或视图(一种虚拟表)中查到满足条件的数据。种虚拟表)中查到满足条件的数据。它的数据源是表或视图,而结果是另一个表。它的数据源是表或视图,而结果是另一个表。 查询语句基本结构查询语句基本结构 v语法:语法:语法:语法:SELECT FROM WHERE GROUP BY HAVING ORDER BY vSELECTSELECTSELECTSELECT语句说明语句说明语句说明语句说明 SELECTSELECTSELECTSELECT语语语语句句句句包包包包括括括括:SELECT SELECT SELECT SELECT 子子子子句句句句,FROMFROMFROMFROM子子子子句句句句,可可可可选选选选的的的的WHEREWHEREWHEREWHERE子子子子句句句句、GROUP GROUP GROUP GROUP BYBYBYBY子子子子句句句句、HAVINGHAVINGHAVINGHAVING子子子子句句句句和和和和ORDER BYORDER BYORDER BYORDER BY子句。子句。子句。子句。(1)SELECT ,称称为为SELECT子子句句,用于用于指定整个查询结果表中包含的列指定整个查询结果表中包含的列。 假假 定定 已已 经经 执执 行行 完完 FROM、 WHERE、GROUP BY、HAVING子子句句,从从概概念念上上来来说说得得到到了了一一个个表表,若若将将该该表表称称为为T,从从T表表中中选选择择SELECT子子句句指指定定的的目目标标列列组组成成表表就就为为整整个个查查询的结果表。询的结果表。(2) FROM ,称为,称为FROM子句。子句。 用用于于指指定定整整个个查查询询语语句句用用到到的的一一个个或或多多个个基基本本表表或或视视图图,是是整整个个查查询询语语句句的的数数据据来来源源,通通常常称为数据源表。称为数据源表。 (3) WHERE ,称称为为WHERE子子句句。用用于于指指定定多多个个数数据据源源表表的的连连接接条条件件和和单单个个源源表表中中行行的的筛筛选选条条件件或或选选择择条条件件。如如果果只只有有一一个个源源表表,则则没没有有表表间间的的连连接接条条件件,只只有有行行的的筛筛选选条条件。件。(4) GROUP BY ,称称为为GROUP BY子子句句。假假定定已已经经执执行行完完FROM、WHERE子子句句,则则从从概概念念上上来来说说得得到到了了一一个个表表,若若将将该该表表称称为为T1表表,则则GROUP BY用用于于指指定定T1表表按按哪哪些些列列(称称为为分分组组列列)进进行行分分组组,所所有有这这些些行行组组成成一一个个表表,不不妨妨把把它它称称为为T2表表,T2表表实际上是一个组表。实际上是一个组表。(5) HAVING ,称称为为HAVING子子句句。与与GROUP BY子句一起使用子句一起使用。 用用于于指指定定组组表表T2表表的的选选择择条条件件,即即选选择择T2表表中中满满足足的的行行,组组成成一一个个表表就就是是SELECT子句中提到的表子句中提到的表T。(6) ORDER BY ,称称为为ORDER BY子子句句。若若有有ORDER BY子子句句,则则用用于于指指定定查查询询结结果果表表T中中按按指指定定列列进进行行升升序序或或降降序序排排序序,得得到到整整个个查查询询的结果表。的结果表。SELECTSELECTSELECTSELECT语句包含了关系代数中的选择、投影、连接、语句包含了关系代数中的选择、投影、连接、语句包含了关系代数中的选择、投影、连接、语句包含了关系代数中的选择、投影、连接、笛卡儿积等运算。笛卡儿积等运算。笛卡儿积等运算。笛卡儿积等运算。下面首先学习下面首先学习下面首先学习下面首先学习单表查询单表查询单表查询单表查询SELECTSELECTSELECTSELECT语句中的各个子句语句中的各个子句语句中的各个子句语句中的各个子句4.1.1 单表查询单表查询 v单表查询指的是在一个源表中查找所需的数据。单表查询指的是在一个源表中查找所需的数据。单表查询指的是在一个源表中查找所需的数据。单表查询指的是在一个源表中查找所需的数据。 因此,单表查询时,因此,单表查询时,因此,单表查询时,因此,单表查询时,FROMFROM子句中的子句中的子句中的子句中的 只要给出一个源表表名。只要给出一个源表表名。只要给出一个源表表名。只要给出一个源表表名。1. SELECT1. SELECT1. SELECT1. SELECT子句子句子句子句 (1 1)选择表中若干列)选择表中若干列 在在SELECTSELECT子子句句的的 中中指指定定整整个个查查询询结结果表中出现的若干个列名,各列名之间用逗号分隔果表中出现的若干个列名,各列名之间用逗号分隔【例例4.1】查询全体学生的学号与姓名查询全体学生的学号与姓名 SELECT Sno,Sname FROM Students 【例例4.2】查查询询数数据据库库studentcourse学学生生基基本本信信息表息表s中学生的学号,姓名,所在系。中学生的学号,姓名,所在系。 SELECT 学号学号,姓名姓名,系系 FROM s(2 2)选择表中所有列)选择表中所有列( (无条件查询无条件查询) ) 可可以以在在 中中指指定定表表中中所所有有列列的的列列名名,也也可可以以用用* *来来代代替替,或或用用 .*.*代代表表指指定定表表的的所所有有列列。* * 代代表表所所有有列列;输输出出显显示示列列的的次次序序由由SELECTSELECT指定指定【例例4.1】查询所有学生可选的课程信息。查询所有学生可选的课程信息。SELECT * FROM c *表示选择当前表的所有属性列【例4.2】查询全体学生的学号、姓名、性别、年龄、所在系查询全体学生的学号、姓名、性别、年龄、所在系 SELECT Sno, Sname, Ssex, Sage, Sdept FROM Students 等价于:SELECT * FROM Students (3 3)查询的数据可以使用表达式)查询的数据可以使用表达式 表表表表达达达达式式式式可可可可以以以以是是是是列列列列名名名名、常常常常量量量量、函函函函数数数数、或或或或用用用用列列列列名名名名、常常常常量量量量、函函函函数数数数等等等等经经经经过过过过+(+(+(+(加加加加) ) ) )、-(-(-(-(减减减减) ) ) )、* * * *( ( ( (乘乘乘乘) ) ) )、/(/(/(/(除除除除) ) ) )等组成的公式。等组成的公式。等组成的公式。等组成的公式。【例例4.3.3】查查询询全全体体学学生生的的选选课课情情况况,即即学学号号、课课程程号号、成成绩绩,对对成绩值都加成绩值都加5。 SELECT Sno,Cno,Grade+5 FROM Enrollment 注意:注意:结果中表结果中表达式列达式列Grade5无列名。实际上无列名。实际上所有表达式列都所有表达式列都没有列名。没有列名。 ( 4 4)设置列的别名)设置列的别名 所所所所谓谓谓谓别别别别名名名名,就就就就是是是是另另另另一一一一个个个个名名名名字字字字。有有有有时时时时需需需需要要要要显显显显示示示示特特特特殊殊殊殊的的的的输出列名,主要是为了方便阅读。输出列名,主要是为了方便阅读。输出列名,主要是为了方便阅读。输出列名,主要是为了方便阅读。例如:例如:例如:例如: select select select select 职称职称职称职称 高校教师职称高校教师职称高校教师职称高校教师职称 from from from from 教师教师教师教师oo设置列别名的方法有:设置列别名的方法有:oo原列名原列名 AS AS 列别名列别名 或者:或者: 列别名原列名列别名原列名o【例4.3.4】查询全体学生的学号、姓名,并为原来的英文列名设置中文别名。以下三种方法等价:oSELECT Sno 学号 , Sname 姓名 FROM StudentsoSELECT Sno AS 学号 ,Sname AS 姓名 FROM Studentso SELECT 学号=Sno , 姓名=Sname FROM Students【例例4.3.54.3.5】查查询询全全体体学学生生的的选选课课情情况况,其其成成绩绩列列值值都加都加5 5,并为各列设置中文的别名,并为各列设置中文的别名 SELECT Sno 学学号号,Cno 课课程程号号,Grade+5 成成绩绩 FROM Enrollment 结果为:结果为: 【例例4.44.4】查询表查询表s s的学号和姓名信息,其中设置学号的学号和姓名信息,其中设置学号的别名为的别名为xhxh,设置姓名的别名为,设置姓名的别名为xmxmSELECT SELECT 学号学号 AS AS xhxh, , 姓名姓名 AS AS xmxm FROM S FROM S或或SELECT SELECT 学号学号 AS AS xhxh , , 姓名姓名 AS AS xmxm FROM S FROM S或或SELECT SELECT 学号学号 AS AS xhxh , , 姓名姓名 AS AS xmxm FROM S FROM S或或SELECT SELECT xhxh=学号学号, , xmxm=姓名姓名 FROM SFROM S( 5)使用DISTINCT消除结果表中完全重复的行 o例如:SELECT 职称 from 教师 职称职称 副教授副教授 讲师讲师 教授教授 教授教授 select distinct 职称 from 教师 【例例3.3.63.3.6】显示所有选课学生的学号。显示所有选课学生的学号。SELECT Sno 学号学号 FROM Enrollment【例例4.3.74.3.7】显显示示所所有有选选课课学学生生的的学学号号,并并去去掉掉重重复复行。行。SELECT DISTINCT Sno 学号学号 FROM Enrollment 与与DISTINCTDISTINCT相相反反的的是是ALLALL,ALLALL表表示示保保留留结结果果表表中中的重复行。默认情况下是的重复行。默认情况下是ALLALL,表示保留重复行,表示保留重复行。 2. FROM子句子句 单表查询中,源表只有一个:单表查询中,源表只有一个: FROM 例例如如,要要查查找找学学生生有有关关的的信信息息,用用到到Students表表,则则FROM子句为:子句为:FROM Students例例如如,要要查查找找课课程程有有关关的的信信息息,用用到到Courses表表,则则FROM子句为:子句为:FROM Courses例例如如,要要查查找找选选课课有有关关的的信信息息,用用到到Enrollment表表,则则FROM子句为:子句为:FROM Enrollment 3、通过、通过TOP子句限制结果集输出的行数子句限制结果集输出的行数(1)命令格式)命令格式SELECT TOP n PERCENT 属性列表属性列表 (2)功能)功能 n是一个正整数,如果指定是一个正整数,如果指定PERCENT关键字,则返回前百关键字,则返回前百分之分之n条记录,条记录,n必须介于必须介于0到到100之间的正整数。比如之间的正整数。比如“SELECT TOP 3 ”表示输出查询结果集的前表示输出查询结果集的前3行,行,“SELECT TOP 3 PERCENT”表示输出查询结果集的前表示输出查询结果集的前3%记录行。记录行。n n例如:例如:例如:例如: select distinct top 8 select distinct top 8 籍贯籍贯籍贯籍贯 from from 学生信息学生信息学生信息学生信息【例例4.84.8】将课程成绩将课程成绩7070分以下的同分以下的同学的成绩提高学的成绩提高5 5分,然后把结果存储分,然后把结果存储到(到(另存另存)新数据表新数据表“最新成绩最新成绩”中。中。SELECT SELECT 成绩成绩+5 AS +5 AS 最新成绩最新成绩 INTO INTO 最新成绩最新成绩 FROM sc WHERE FROM sc WHERE 成绩成绩70704、 INTO子句的使用子句的使用4.1.2 WHERE子句子句 WHERE :只获得满足条件的数据。:只获得满足条件的数据。l查询体条件中没有多表连接条件,只有一个表的行筛选条件查询体条件中没有多表连接条件,只有一个表的行筛选条件 。l中中常常用用的的运运算算符符:比比较较运运算算符符和和逻逻辑辑运算符。(运算符。(P101表表4-1)l常常用用的的比比较较运运算算符符有有:=(等等于于)、(大大于于)、=(大大于于等等于于)、=(小小于于等等于于)、!=或或(不不等等于于)、!( (不大不大于于)、!( (不小不小于于)共共9种。种。范范围围比比较较运运算算符符:BETWEEN AND ,NOT BETWEEN AND集合比较运算符:集合比较运算符:IN ,NOT IN字符匹配运算符:字符匹配运算符:LIKE,NOT LIKE空值比较运算符:空值比较运算符:IS NULL,IS NOT NULL条件连接运算符:条件连接运算符:AND,OR,NOT l基于其它运算符的查询【例例4.104.10】在基本表在基本表S S中检索中检索1978-01-061978-01-06出生出生的学生情况。的学生情况。SELECT * FROM s SELECT * FROM s WHERE WHERE 出生日期出生日期= =1978-01-061978-01-06【例例4.114.11】在基本表在基本表S S中检索中检索19781978年及以后出年及以后出生的学生情况。生的学生情况。SELECT * FROM s SELECT * FROM s WHERE year(WHERE year(出生日期出生日期)=1978)=1978或或SELECT * FROM s SELECT * FROM s WHERE year(WHERE year(出生日期出生日期)!1978)!1978【例例4.14】列出表列出表S中管理信息系年龄小于中管理信息系年龄小于28岁的学生的学号和出生年份情况。岁的学生的学号和出生年份情况。SELECT 学号学号, year(出生日期出生日期) as 出生年份出生年份FROM s WHERE 系系 =管理信息系管理信息系 and (year(getdate()-year(出生日期出生日期)=下限值下限值 AND列名列名= 80 AND Grade =90 【例例4.3.11】查查询询学学生生年年龄龄不不在在2030之之间间的的学学生学号、姓名、所在系。生学号、姓名、所在系。SELECT Sno ,Sname,Sdept FROM Students WHERE Sage NOT BETWEEN 20 AND 30SELECT Sno ,Sname,Sdept FROM Students WHERE Sage30 基于基于ININ的查询的查询IN用用于于测测试试一一个个列列值值是是否否与与常常量量表表中中的的任任何何一一个个值值相相等等。IN条件表示格式为:条件表示格式为:列名列名 IN (常量常量1, 常量常量2, 常量常量n)当当列列值值与与IN中中的的任任一一常常量量值值相相等等时时,则则条条件件为为TRUE,否则为否则为FALSE。NOT IN与与IN的的含含义义正正好好相相反反,当当列列值值与与IN中中的的任任一一常常量值都不相等时,则结果为量值都不相等时,则结果为TRUE,否则为,否则为FALSE。 【例例4.3.12】查查询询数数学学系系、计计算算机机系系、艺艺术术系系学学生生的的学学号号、姓名。姓名。SELECT Sno,Sname FROM Students WHERE Sdept IN (Math, Computer, Art)此句等价于:此句等价于:SELECT Sno,Sname FROM Students WHERE Sdept =Math OR Sdept = Computer OR Sdept = Art【例例4.3.13】查查询询既既不不是是数数学学系系、计计算算机机系系,也也不不是是艺术系学生的学号、姓名。艺术系学生的学号、姓名。SELECT Sno,Sname FROM Students WHERE Sdept NOT IN (Math, Computer, Art)此句等价于:此句等价于:SELECT Sno,Sname FROM Students WHERE Sdept! =Math AND Sdept! = Computer AND Sdept! = Artl基于基于LIKELIKE的查询的查询lLIKE用用于于测测试试一一个个字字符符串串是是否否与与给给定定的的模模式式匹匹配配。所所谓谓模模式式是是一一种种特特殊殊的的字字符符串串,其其中中可可以以包包含含普普通通字字符符,也也可可以以包包含含特特殊意义的字符殊意义的字符(通常叫通配符通常叫通配符)。l一般形式为:列名一般形式为:列名 LIKE l模式串中可包含四种通配符:模式串中可包含四种通配符:o _:匹匹配配任任意意一一个个字字符符。注注意意,在在这这里里一一个个汉汉字字或或一一个个全全角角字字符符也也算算一一个个字字符符。如如 _u_表表示示第第二二个个字字符为符为u或或U,o%:匹匹配配任任意意0个个或或多多个个字字符符。如如S%表表示示以以S开开头头的字符串。的字符串。o :匹配:匹配 中的任意中的任意一个一个字符。如字符。如SDJ 。o :不匹配不匹配 中的任意一个字符。如中的任意一个字符。如SDJ o 可以用可以用LIKE来实现模糊查询来实现模糊查询【例例4.3.144.3.14】查查找找姓姓名名的的第第二二个个字字符符是是u u并并且且只只有有三三个个字符的学生的学号、姓名。字符的学生的学号、姓名。SELECT Sno,Sname FROM Students WHERE Sname LIKE _u_【例例4.3.154.3.15】查查找找姓姓名名以以S S开开头头的的所所有有学学生生的的学学号号、姓姓名。名。SELECT Sno,Sname FROM Students WHERE Sname LIKE S%【例例4.3.164.3.16】查查找找姓姓名名以以S S、D D或或J J开开头头的的所所有有学学生生的的学学号、姓名。号、姓名。SELECT Sno,Sname FROM Students WHERE Sname LIKE SDJ%【例例4.3.17】查查找找姓姓名名不不是是以以S、D或或J开开头头的的所所有有学学生的学号、姓名。生的学号、姓名。SELECT Sno,Sname FROM Students WHERE Sname LIKE SDJ% 等价于:等价于:SELECT Sno,Sname FROM Students WHERE Sname NOT LIKE SDJ%【例例4.15】在表在表S中查询管理信息系学生的姓中查询管理信息系学生的姓名。名。SELECT 姓名 as 姓名,系 as 所在院系 FROM S WHERE 系 LIKE 管理信息系【例例4.164.16】查询陈老师所教的课程信息。查询陈老师所教的课程信息。SELECT * FROM c SELECT * FROM c WHERE WHERE 教师教师 LIKE LIKE 陈陈% %【例例4.174.17】在基本表在基本表S S中检索出生日期包含中检索出生日期包含1313的学生情况。的学生情况。SELECT * FROM s SELECT * FROM s WHERE WHERE 出生日期出生日期 like %13%like %13%【例例4.18】如果要找出其姓名中不含有如果要找出其姓名中不含有“红红”的学生情况,则在的学生情况,则在LIKE前增加前增加NOT 。SELECT * FROM s WHERE 姓名 NOT LIKE %红% 【例例4.19】在基本表在基本表S中检索以中检索以“王王”姓打头,姓打头,名字由名字由1个汉字组成的学生姓名。个汉字组成的学生姓名。SELECT 姓名 FROM s WHERE 姓名 LIKE 王_o空值是尚未确定或不确定的值。空值是尚未确定或不确定的值。o判判断断某某列列值值是是否否为为NULLNULL值值,不不能能使使用用比比较较运运算算符符等等于于和和不不等等于于,而而只只能能使使用用专专门门的的判判断断空空值值的的子子句句,如下:如下: 判断列值为空的语句格式为判断列值为空的语句格式为:列名列名IS NULL 判断列值不为空的语句格式为判断列值不为空的语句格式为:列名列名 IS NOT NULL l基于基于NULLNULL空值的查询空值的查询【例例4.29】查询缺少成绩的学生的学号和相应的查询缺少成绩的学生的学号和相应的课程号。(某些学生选修课程后没有参加考试,课程号。(某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。)所以有选课记录,但没有考试成绩。) SELECT 学号,课程号 FROM sc WHERE 成绩 IS NULL【例例4.30】查询有选修成绩的学生的学号和相应查询有选修成绩的学生的学号和相应的课程号。的课程号。 SELECT 学号,课程号 FROM sc WHERE 成绩 IS NOT NULL【例例4.18】查查询询无无考考试试成成绩绩的的学学生生的的学学号号和和相相应应的的课课程号。程号。SELECT Sno, Cno FROM Enrollment WHERE Grade IS NULL不等价于不等价于:SELECT Sno, Cno FROM Enrollment WHERE Grade =0 【例例4.19】查查询询有有考考试试成成绩绩(即即成成绩绩不不为为空空值值)的的学学生生的学号、课程号。的学号、课程号。SELECT Sno, Cno FROM Enrollment WHERE Grade IS NOT NULL 【例例4.214.21】在基本表在基本表S S中检索中检索19751975年出生或者姓王年出生或者姓王的学生情况。的学生情况。SELECT * FROM s SELECT * FROM s WHERE year(WHERE year(出生日期出生日期)=1975 OR )=1975 OR 姓名姓名 LIKE LIKE 王王% % 【例例4.224.22】在基本表在基本表S S中检索在中检索在19701970年到年到19801980年之年之间出生的学生情况。间出生的学生情况。SELECT * FROM s SELECT * FROM s WHERE year(WHERE year(出生日期出生日期)1970 and year()1970 and year(出生日出生日期期)1980)1980l基于多个条件的查询基于多个条件的查询【例例4.23】在基本表在基本表S中检索不在管理信息系中检索不在管理信息系的学生情况。的学生情况。SELECT * FROM s WHERE not (系=管理信息系)或SELECT * FROM s WHERE 系!=管理信息系l使用统计函数的查询使用统计函数的查询 统统计计函函数数也也称称为为集集合合函函数数或或聚聚集集函函数数,其其作作用用是是对对一一组组值值进进行行计计算算并并返回一个值。返回一个值。【例例4.22】求学生的总人数求学生的总人数SELECT COUNT(*) AS 学生的总人数学生的总人数 FROM Students 【例例4.23】求选修了课程的学生人数求选修了课程的学生人数SELECT COUNT(DISTINCT Sno) AS 选选修修课课程程的的总总人人数数 FROM Enrollment【例例4.24】求选修了求选修了C1课程的学生的平均成绩。课程的学生的平均成绩。SELECT AVG(Grade) AS 平均成绩平均成绩 FROM Enrollment WHERE Cno=C1【例例4.25】求求20010102号学生的考试总成绩之和。号学生的考试总成绩之和。SELECT SUM(Grade) AS 20010102考试总成绩考试总成绩 FROM Enrollment WHERE Sno = 20010102【例例4.26】选修了选修了C1课程的学生的最高分和最低分课程的学生的最高分和最低分SELECT MAX(Grade) AS 最高分最高分, MIN(Grade) AS 最低分最低分 FROM Enrollment WHERE Cno=C1 指定整个指定整个SELECT语句的输出结果中记录的排序依据。语句的输出结果中记录的排序依据。ORDER BY ASC | DESC , n ASC表表示示按按列列值值升升序序方方式式排排序序,DESC表表示示按按列列值值降降序方式排序。序方式排序。如如果果没没有有指指定定排排序序方方式式,则则默默认认的的排排序序方方式式为为升升序序排排序。序。在在ORDER BY子子句句中中,可可以以指指定定多多个个用用逗逗号号分分隔隔的的列名。这些列出现的顺序决定了查询结果排序的顺序。列名。这些列出现的顺序决定了查询结果排序的顺序。当当指指定定多多个个列列时时,首首先先按按最最前前面面的的列列进进行行排排序序,如如果果排排序序后后存存在在两两个个或或两两个个以以上上列列值值相相同同的的行行,则则对对这这些些值值相相同同的的行行再再依据第二列进行排序,依此类推。依据第二列进行排序,依此类推。 4.1.3 ORDER BY子子句句【例例4.314.31】将所有女生按年龄升序排序。将所有女生按年龄升序排序。SELECT * FROM s WHERE 性别=女 ORDER BY 出生日期 ASC 【例例4.324.32】将将SCSC数据表中的信息按学生学号升序,数据表中的信息按学生学号升序,课程号降序排列。课程号降序排列。【例例4.30】查查询询所所有有学学生生的的行行,并并按按学学生生的的年年龄龄值值从从小小到大排序。到大排序。SELECT * FROM Students ORDER BY Sage【例例4.31】查查询询选选修修了了C1课课程程的的学学生生的的学学号号和和成成绩绩,查查询结果按成绩降序排列。询结果按成绩降序排列。SELECT Sno, Grade FROM Enrollment WHERE Cno=C1 ORDER BY Grade DESC【例例4.32】查查询询全全体体学学生生信信息息,查查询询结结果果按按所所在在系系的的系系名名升序排列,同一系的学生按年龄降序排列。升序排列,同一系的学生按年龄降序排列。 SELECT * FROM Students ORDER BY Sdept ASC, Sage DESC【例例4.33】求求选选修修课课程程大大于于等等于于2 2门门课课的的学学生生的的学学号号、平平均均成绩和选课门数,并按平均成绩降序排列。成绩和选课门数,并按平均成绩降序排列。SELECT Sno AS 学学号号, AVG(Grade) AS 平平均均成成绩绩, COUNT(*)AS 修课门数修课门数FROM Enrollment GROUP BY Sno HAVING COUNT(*) = 2 ORDER BY AVG (Grade) DESC 【例例】在在SC表中,查询学号为表中,查询学号为1的同学获得最的同学获得最高成绩的课程号。高成绩的课程号。【例例】在在SC表中,找出选修了课程号为表中,找出选修了课程号为2的课的课程,而且课程成绩最高的前两位同学。程,而且课程成绩最高的前两位同学。4.1.4 GROUP BY 子句子句 有有时时我我们们需需要要把把FROM、WHERE子子句句产产生生的的表表按按某某种种原原则则分分成成若若干干组组,然然后后再再对对每每个个组组进进行行统统计计,一一组组形形成一行,最后把所有这些行组成一个表,称为组表。成一行,最后把所有这些行组成一个表,称为组表。GROUP BY子句在子句在WHERE子句后边子句后边。一般形式为一般形式为:GROUP BY , n 其中其中 是分组的依据。是分组的依据。分组原则分组原则是是 的的列值相同,就为同一组列值相同,就为同一组。当当有有多多个个 时时,则则先先按按第第一一个个列列值值分分组组,然然后后对对每每一一组再按第二个列值进行分组,依此类推。组再按第二个列值进行分组,依此类推。 【例例4.27】求选修每门课程的求选修每门课程的学生人数学生人数。SELECT Cno AS 课课程程号号, COUNT(Sno) AS 选选修修人人数数 FROM Enrollment GROUP BY Cno 【例例例例4.284.284.284.28】输输输输出出出出每每每每个个个个学学学学生生生生的的的的学学学学号号号号和和和和他他他他/ / / /她她她她的的的的各各各各门门门门课课课课程的程的程的程的总成绩总成绩总成绩总成绩。SELECT Sno 学号学号, Sum(grade) 总成绩总成绩 FROM Enrollment GROUP BY Sno 注注注注 意意意意 :包包含含GROUP BY子子句句的的查查询询语语句句中中,SELECT子子句句指指定定的的列列名名,要要么么是是统统计计函函数数,如如上上例例中中的的COUNT(Sno),要要么么是是包包含含在在GROUP BY子子句中的列名句中的列名,如上例中的,如上例中的Cno,否则将出错否则将出错。u如下列语句是错误的如下列语句是错误的:SELECT Sno AS 学学 号号 ,Cno AS 课课 程程 号号 , COUNT(Sno) AS 选修人数选修人数 FROM Enrollment GROUP BY Cno 因因为为SELECT子子句句中中的的Sno列列,既既不不是是统统计计函函数数,也不是也不是GROUP BY子句中的列名。子句中的列名。 4.1.5 HAVING子句子句oHAVING子子句句指指定定GROUP BY生生成成的的组组表表的的选选择择条条件件,在在GROUP BY子子句句之之后后,并并且且必必须须与与GROUP BY子句一起使用。子句一起使用。o一般形式为:一般形式为:HAVING o例例4.29:求求选选修修课课程程大大于于等等于于2门门课课的的学学生的学号、平均成绩,选修的门数。生的学号、平均成绩,选修的门数。SELECT Sno, AVG(Grade) AS 平平均均成成绩绩, COUNT(*) AS 选选 修修 门门 数数 FROM EnrollmentGROUP BY Sno HAVING COUNT(*) = 2 本讲总结一、SELECT语句的执行窗口二、查询语句基本结构查询语句基本结构三、三、SELECTSELECT语句说明语句说明 四、四、 单表查询单表查询 1. SELECT1. SELECT子句子句 (1 1)选择表中若干列)选择表中若干列(2 2)选择表中所有列)选择表中所有列( (无条件查询无条件查询) )(3 3)使用表达式)使用表达式( 4 4)设置列的别名)设置列的别名( 5 5)使用)使用DISTINCTDISTINCT消除结果表中完全重复的行消除结果表中完全重复的行1. SELECT1. SELECT1. SELECT1. SELECT子句子句子句子句 2. FROM子句子句 3、通过、通过TOP子句限制结果集输出的行数子句限制结果集输出的行数4、 INTO子句的使用子句的使用5、WHERE子句子句 6、 GROUP BY 子句子句 7、 HAVING子句子句8、 ORDER BY子句子句 5. WHERE子句子句 ( 1 1)基于比较运算符的查询)基于比较运算符的查询( 2 2 2 2)基于)基于)基于)基于BETWEENBETWEENBETWEENBETWEENANDANDANDAND的查询的查询的查询的查询 ( 3)基于基于ININ的查询的查询 ( 4)基于基于LIKELIKE的查询的查询 ( 5)基于NULL空值的查询 ( 6 )基于多个条件的查询 ( 7)使用统计函数的查询使用统计函数的查询练习oSELECT语句必需有的两个关键字是? o在SQL语句中对输出结果排序的语句 ?oSELECT语句中何时使用分组子句,何时不必使用分组子句? 1、有两个表:、有两个表: COURSES(CNO,CN,PCNO) ENROLLMENT(SNO,CON,GRADE) 其中,其中,COURSES为课程表关系,对应的属性分别为课程表关系,对应的属性分别是课号、课程名和选修课号,是课号、课程名和选修课号,ENROLLMENT为学为学生选课表,对应的属性分别是学号、课号和成绩。生选课表,对应的属性分别是学号、课号和成绩。用用SQL语言写出:语言写出:o对表对表ENROLLMENT中课号等于中课号等于C1的选择运算。的选择运算。o对表对表COURSES的课号、课程名的投影运算。的课号、课程名的投影运算。o两个表的自然连接运算。两个表的自然连接运算。 作业2、已知学生表、已知学生表S和学生选课表和学生选课表ENROLLMENT,其表其表中所具有的列如下。中所具有的列如下。 S(SNO,SN,SD,PROV) ENROLLMENT(SNO,CN,GRADE) 其中,其中,SNO为学号,为学号,SN为姓名,为姓名,SD为系名,为系名,PROV为省区,为省区,CN为课程名,为课程名,GRADE为分数。为分数。 试用试用SQL语言实现下列操作:语言实现下列操作: (1)查询)查询“信息系信息系”学生来自哪些省区学生来自哪些省区(2)按分数降序排列,输出)按分数降序排列,输出“英语系英语系”学生中选修学生中选修了了“计算机计算机”课程的学生的姓名和分数课程的学生的姓名和分数
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号