SQL数据操作功能 (2).ppt
《SQL数据操作功能 (2).ppt》由会员分享,可在线阅读,更多相关《SQL数据操作功能 (2).ppt(106页珍藏版)》请在三一办公上搜索。
1、第5章 SQL语言数据操作功能,5.1 数据查询功能 5.2 数据更改功能 5.3 视图,5.1 数据查询功能,5.1.1 查询语句的基本结构5.1.2 简单查询5.1.3 多表连接查询5.1.4 使用TOP限制结果集5.1.5 子查询,5.1.1 查询语句的基本结构SELECT ALL|DISTINCT,-需要哪些列FROM(或视图)-来自哪些表WHERE-根据什么条件GROUP BY HAVING 内部函数表达式 ORDER BY ASC|DESC;语句含义:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,按SELECT子句中的目标列表达式,选出元组中
2、的属性值形成结果表。,如果有ORDER子句,则结果表要根据指定的列名2按升序或降序排序;如果有GROUP子句,则将结果按的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。通常会在每组中作用集函数。如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。,5.1.2 简单查询,1.选择表中若干列(1)查询表中用户感兴趣的部分属性列。例1:查询全体学生的学号与姓名。SELECT Sno,Sname FROM Student例2:查询全体学生的姓名、学号和所在系。SELECT Sname,Sno,Sdept FROM Student,(2)查询全部列 例3查询全
3、体学生的记录 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student等价于:SELECT*FROM Student,(3)查询经过计算的列 例4查询全体学生的姓名及其出生年份。SELECT Sname,2010-Sage FROM Student结果为如下形式:Sname 2010-Sage-S1 1984 S2 1983 S3 1985 S4 1985例5含字符串常量的列:查询全体学生的姓名和出生年份,并在出生年份列前加一列,此列的每行数据均为“出生年份”常量值。SELECT Sname,出生年份,2010-Sage FROM Student,(4)改变列
4、标题 语法:列名|表达式 AS 列标题或:列标题 列名|表达式例:SELECT Sname 姓名,2008-Sage 年份 FROM Student,(5)消除取值相同的记录例6在修课表中查询有哪些学生修了课程,要求列出学生的学号。SELECT Sno FROM SC结果中有重复的行。用DISTINCT关键字可以去掉结果中的重复行。DISTINCT关键字放在SELECT词的后边、目标列名序列的前边。SELECT DISTINCT Sno FROM SC,2.查询满足条件的元组,(1)比较大小,例7查询计算机系全体学生的姓名。SELECT Sname FROM Student WHERE Sde
5、pt=计算机系例8查询年龄在20岁以下的学生的姓名及年龄。SELECT Sname,Sage FROM Student WHERE Sage 20例9查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade 60,(2)确定范围,用BETWEENAND和NOT BETWEENAND是逻辑运算符,可以用来查找属性值在或不在指定范围内的元组,其中BETWEEN后边指定范围的下限,AND后边指定范围的上限。BETWEENAND的格式为:列名|表达式 NOT BETWEEN 下限值 AND 上限值如果列或表达式的值在(或不在)下限值和上限值范围内
6、,则结果为True,表明此记录符合查询条件。BETWEENAND包括边界值。,例10查询年龄在2023岁之间的学生的姓名、所在系和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23等价于:SELECT Sname,Sdept,Sage FROM Student WHERE Sage=20 AND Sage=23,例11查询年龄不在2023之间的学生姓名、所在系和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23等价于
7、:SELECT Sname,Sdept,Sage FROM Student WHERE Sage 23,例12 对于日期类型的数据也可以使用基于范围的查找。查询1991年6月出版的图书信息:SELECT title_id,type,price,pubdate FROM titles WHERE pubdate BETWEEN 1991/6/1 AND 1991/6/30,(3)确定集合,用来查找属性值属于指定集合的元组。格式为:列名 NOT IN(常量1,常量2,常量n)IN:当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录。NOT IN:当列中的值与某个
8、常量值相等时,结果为False,表明此记录为不符合查询条件的记录。,例13 查询信息管理系、通信工程系和计算机系学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sdept IN(信息管理系,通信工程系,计算机系)等价于:SELECT Sname,Ssex FROM Student WHERE Sdept=信息管理系 OR Sdept=通信工程系 OR Sdept=计算机系,例14 查询既不是信息管理系、通信工程系,也不是计算机系学生的姓名和性别。SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN(信息管
9、理系,通信工程系,计算机系)等价于:SELECT Sname,Ssex FROM Student WHERE Sdept!=信息管理系 AND Sdept!=通信工程系 AND Sdept!=计算机系,(4)字符匹配,一般形式为:列名 NOT LIKE 匹配串中可包含如下四种通配符:_:匹配任意一个字符;%:匹配0个或多个字符;:匹配 中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表达);:不匹配 中的任意一个字符。,例15查询学生表中姓张的学生的详细信息。SELECT*FROM Student WHERE Sname LIKE 张%例16查询学生表中姓张、姓李和姓刘的学生的情
10、况。SELECT*FROM Student WHERE Sname LIKE 张李刘%例17 查询Student表中名字的第2个字为“小”或“大”的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _小大%,例18 查询Student表中所有不姓“刘”的学生。SELECT Sname FROM Student WHERE Sname NOT LIKE 刘%例19 从Student表中查询学号的最后一位不是2、3、5的学生信息。SELECT*FROM Student WHERE Sno LIKE%235,转义字符,若要查找的字符串正好
11、含有通配符,比如下划线或百分号,就需要使用一个特殊子句来告诉系统这里的下划线或百分号是一个普通的字符,而不是一个通配符,这个特殊的子句就是ESCAPE。ESCAPE的语法格式:ESCAPE转义字符其中“转义字符”可以是任何有效的字符。,例如,为查找field1字段中包含字符串“30%”的记录,可在WHERE子句中指定:WHERE field1 LIKE%30!%ESCAPE!又如,为查找field1字段中包含下划线(_)的记录,可在WHERE子句中指定:WHERE field1 LIKE%!_%ESCAPE!,(5)涉及空值的查询,空值(NULL)在数据库中表示不确定的值。例如,学生选修课程后
12、还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成绩为空值。判断某个值是否为NULL,不能使用普通的比较运算符。判断取值为空的语句格式为:列名 IS NULL判断取值不为空的语句格式为:列名 IS NOT NULL,例20 查询还没有考试的学生的学号和相应的课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NULL查询结果如图4-20所示。例21 查询所有已经考试了的学生的学号和课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL,(6)多重条件查询,在WHERE子句中可使用AND和OR来组成多条件查询
13、。使用AND谓词的语法格式如下:布尔表达式1 AND布尔表达式2 AND AND 布尔表达式n只有当全部的布尔表达式均为真时,整个表达式的结果才为真,只要有一个布尔表达式的结果为假,则整个表达式结果即为假。使用OR谓词的语法格式如下。布尔表达式1 OR布尔表达式2 OR OR 布尔表达式n表示只要其中一个布尔表达式为真,则整个表达式的结果即为真;只有当全部布尔表达式的结果均为假时,整个表达式结果才为假。,例22 查询计算机系年龄在20岁以下的学生姓名SELECT Sname FROM Student WHERE Sdept=计算机系 AND Sage 20例23 查询计算机系和信息管理系学生中
14、年龄在1820的学生的学号、姓名、所在系和年龄。SELECT Sno,Sname,Sdept,Sage FROM Student WHERE(Sdept=计算机系 OR Sdept=信息管理系)AND Sage between 18 and 20也可写为:SELECT Sno,Sname,Sdept,Sage FROM Student WHERE Sdept in(计算机系,信息管理系)AND Sage between 18 and 20,3.对查询结果集进行排序,可对查询结果进行排序。排序子句为:ORDER BY ASC|DESC,说明:按进行升序(ASC)或降序(DESC)排序。,例24
15、将学生按年龄的升序排序。SELECT*FROM Student ORDER BY Sage例25 查询选修了“C002”号课程的学生的学号及其成绩,查询结果按成绩降序排列。SELECT Sno,Grade FROM SC WHERE Cno=C002 ORDER BY Grade DESC例26 查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。SELECT*FROM Student ORDER BY Sdept,Sage DESC,4.使用统计函数汇总数据,SQL提供的统计函数有:COUNT(DISTINCT|ALL*)统计元组个数 COUNT(DISTINCT
16、|ALL)统计一列中值的个数 SUM(DISTINCT|ALL)计算一列值的总和 AVG(DISTINCT|ALL)计算一列值的平均值MAX(DISTINCT|ALL)求一列值中的最大值 MIN(DISTINCT|ALL)求一列值中的最小值使用DISTINCT则计算时要取消指定列中的重复值。若不指定DISTINCT或指定ALL(缺省),则表示不取消重复值。上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。,例27 统计学生总人数。SELECT COUNT(*)FROM Student 例28 统计选修了课程的学生的人数。SELECT COUNT(DISTINCT Sno)F
17、ROM SC例29计算学号为“0611101”的学生的考试总成绩之和。SELECT SUM(Grade)FROM SC WHERE Sno=0611101,例30 计算“C001”课程的学生的考试平均成绩。图4-25 例31查询结果SELECT AVG(Grade)FROM SC WHERE Cno=C001例31 查询选修了“C001”号课程的学生的最高分和最低分。SELECT MAX(Grade)最高分,MIN(Grade)最低分 FROM SC WHERE Cno=C001,注意,统计函数不能出现在WHERE子句中。例如,查询年龄最大的学生的姓名,如下写法是错误的:SELECT Snam
18、e FROM Student WHERE Sage=MAX(Sage),5.对查询结果进行分组计算,GROUP BY子句可将查询结果表的各行按一列或多列取值相等的原则进行分组。分组语句的一般形式:GROUP BY HAVING 目的:细化集函数的作用对象。作用:可以控制计算的级别,对全表还是对一组。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。,例32 统计每门课程的选课人数,列出课程号和人数。SELECT Cno as 课程号,COUNT(Sno)as 选课人数 FROM SC GROUP BY Cno
19、该语句首先对查询结果按Cno的值分组,所有具有相同Cno值的元组归为一组,然后再对每一组使用COUNT函数进行计算,求得每组的学生人数。,例33 查询每名学生的选课门数和平均成绩。SELECT Sno 学号,COUNT(*)选课门数,AVG(Grade)平均成绩 FROM SC GROUP BY Sno注意:GROUP BY子句中的分组依据列必须是表中存在的列名,不能使用AS子句指派的结果集列的别名。带有GROUP BY 子句的SELECT语句的查询列表中只能出现分组依据列或统计函数,因为分组后每个组只返回一行结果。,例34 统计每个系的学生人数和平均年龄。SELECT Sdept,COUNT
20、(*)AS 人数,AVG(Sage)AS 平均年龄 FROM Student GROUP BY Sdept例35 带WHERE子句的分组,统计每个系的女生人数。SELECT Sdept,Count(*)女生人数 FROM Student WHERE Ssex=女 GROUP BY Sdept,例36 按多列分组。统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名升序排序SELECT Sdept,Ssex,Count(*)人数,Max(Sage)最大年龄 FROM Student GROUP BY Sdept,Ssex ORDER BY Sdept,使用HAVING,H
21、AVING子句用于对分组后的结果再进行过滤,它的功能有点像WHERE子句,但它用于组而不是单个记录。在HAVING子句中可以使用统计函数,但在WHERE子句中则不能。HAVING通常与GROUP BY子句一起使用。例37 查询选修3门以上课程的学生的学号和选课门数。SELECT Sno,count(*)选课门数 FROM SC GROUP BY Sno HAVING COUNT(*)3,例38 查询选课门数大于等于4门的学生的平均成绩和选课门数。SELECT Sno,AVG(Grade)平均成绩,COUNT(*)选课门数 FROM SC GROUP BY Sno HAVING COUNT(*)
22、=4,说明,WHERE子句用来筛选FROM子句中指定的数据源所产生的行数据。GROUP BY子句用来对经WHERE子句筛选后的结果数据进行分组。HAVING子句用来对分组后的结果数据再进行筛选。对于可在分组操作之前应用的搜索条件,在WHERE子句中指定它们更有效,这样可减少参与分组的数据行。应当在HAVING子句中指定的搜索条件应该是那些必须在执行分组操作之后应用的搜索条件。建议将所有行搜索条件放在WHERE子句中而不是HAVING子句中。,例如,查询计算机系和信息管理系的学生人数:SELECT Sdept,COUNT(*)FROM Student GROUP BY Sdept HAVING
23、Sdept in(计算机系,信息管理系)或:SELECT sdept,COUNT(*)FROM Student WHERE Sdept in(计算机系,信息管理系)GROUP BY Sdept第二种写法比第一种写法效率要高,因为参与分组的数据会比较少。,5.1.3 多表连接查询,若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括内连接、外连接和交叉连接等。连接查询中用于连接两个表的条件称为连接条件或连接谓词。一般格式为:=,必须是可比的,1.内连接,SQL-92 内连接语法如下:SELECT FROM 表名 INNER JOIN 被连接表 ON 连
24、接条件执行过程如下:首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2,重复该过程,直到表1中的全部元组都处理完为止。,例39 查询每个学生及其选课的详细信息。SELECT*FROM Student INNER JOIN SC ON Student.Sno=SC.Sno结果中有重复的列。例40 去掉例39中的重复列。SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Stude
25、nt JOIN SC ON Student.Sno=SC.Sno,例41 查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩。SELECT Sname,Cno,Grade FROM Student JOIN SC ON Student.Sno=SC.Sno WHERE Sdept=计算机系 可为表提供别名,其格式如下:AS 例如,使用别名时例41可写为如下形式:SELECT Sname,Cno,Grade FROM Student S JOIN SC ON S.Sno=SC.Sno WHERE Sdept=计算机系,例42 查询“信息管理系”选修了“计算机文化学”课程的学生的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL数据操作功能 2 SQL 数据 操作 功能
链接地址:https://www.31ppt.com/p-6520965.html