《数据库上课-第五讲-SQL语言-2(简单查询)-PPT.ppt》由会员分享,可在线阅读,更多相关《数据库上课-第五讲-SQL语言-2(简单查询)-PPT.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据库系统原理与设计第5讲 SQL语言-2电话:Email:1主要内容 SQL 概述 数据定义 数据更新1 简单查询 连接查询 聚合查询 集合运算 嵌套子查询 SQL 查询一般格式 数据更新2 视图 21简单查询 1.1 投影运算1.2 选择运算 1.3 排序运算1.4 查询表31.1 投影运算 SQL 查询的基本结构包括3 个子句:SELECT 子句 对应投影运算,指定查询结果中所需要的属性或表达式 FROM 子句 对应笛卡尔积,给出查询所涉及的表,表可以是基本表、视图或查询表 WHERE 子句 对应选择运算,指定查询结果元组所需要满足的选择条件注意:SELECT 是必须的,其他是可选的。4
2、基本语法为 SELECT A1,A2,.,An/*需要查找的属性或表达式*/FROM R1,R2,.,Rm/*查询所涉及的表*/WHERE P/*代表谓词(即选择条件),如果省略 WHERE 子句,表示P 为真*/SQL 的查询结果中允许包含重复元组 一般理解的执行过程:首先对表R1,R2,.,Rm执行笛卡尔积 然后在笛卡尔积中选择使得谓词P 为真的记录 再在A1,A2,.,An属性列中进行投影运算,不消除重复元组51.1.1 查询指定列 选取表中的全部列或指定列,通过SELECT 确定要查询的属性 例3.1 查询所有班级的班级编号、班级名称和所属学院 SELECT classNo,class
3、Name,institute FROM Class 该查询的执行过程是:从Class 表中依次取出每个元组 对每个元组仅选取classNo、className 和institute 三个属性的值,形成一个新元组 最后将这些新元组组织为一个结果关系输出61.1.2 消除重复元组 需要消除重复元组,使用DIS TINC T 关键字 例3.2 查询所有学院的名称。SELECT institute FROM Class 上述查询不消除重复元组 消除重复元组 SELECT DISTINCT institute FROM Class7大家应该也有点累了,稍作休息大家有疑问的,可以询问和交流 大家有疑问的,
4、可以询问和交流81.1.3 查询所有列 两种方法:将所有的列在SELECT 子句中列出(可以改变列的显示顺序);使用*符号,*表示所有属性,按照表定义时的顺序显示所有属性 例3.3 查询所有班级的全部信息。SELECT classNo,className,classNum,grade,institute FROM Class 或 SELECT*FROM Class91.1.4 给属性列取别名 可为属性列取一个便于理解的列名,如用中文来显示列名 为属性列取别名特别适合经过计算的列 例3.4 查询所有班级的所属学院、班级编号和班级名称,要求用中文显示列名 可使用AS 关键字取别名:SELECT i
5、nstitute AS 所属学院,classNo AS 班级编号,className AS 班级名称 FROM Class101.1.5 查询经过计算的列 可使用属性、常数、函数和表达式 例3.5 查询每个班级编号、班级名称以及该班级现在为几年级,并将班级编号中大写字母改为小写字母输出 SELECT lower(classNo)班级编号,className,year(curdate()-grade AS 年级 FROM Class 函数lower()将大写字母改为小写字母 函数curdate()获取当前系统的日期 其他函数:now(),getdate()函数year()提取日期中的年份111.
6、2 选择运算(WHERE 子句)WHERE 子句可实现关系代数中的选择运算 WHERE 常用的查询条件有:比较运算:、=、=、=、(或!=)范围查询:BETWEEN.AND 集合查询:IN 空值查询:IS null 字符匹配查询:LIKE 逻辑查询:AND、OR、NOT121.2.1 比较运算 比较运算符、=、=、=、(或!=)例3.6 查询2007 级的班级编号、班级名称和所属学院。SELECT classNo,className,institute FROM Class WHERE grade=200713 该查询的执行过程可能有多种方法:全表扫描法 依次取出Class 表中的每个元组 判
7、断该元组的grade 属性值是否等于2007 若是则将该元组的班级编号、班级名称和所属学院属性取出,形成一个新元组 最后将所有新元组组织为一个结果关系输出 该方法适用于小表,或者该表未在grade 属性列上建索引 索引搜索法 如果该表在grade 属性列上建有索引,且满足条件的记录不多,则可使用索引搜索法来检索数据 具体使用何种方法由数据库管理系统的查询优化器来选择,详见第8 章内容14 在学生Student 表中查询年龄大于或等于19 岁的同学学号、姓名和出生日期。SELECT studentNo,studentName,birthday FROM Student WHERE year(cu
8、rdate()-year(birthday)=19 例3.7 15.1.2.2 范围查询 BETWEEN.AND 用于查询属性值在某一个范围内的元组 NOT BETWEEN.AND 用于查询属性值不在某一个范围内的元组 BETWEEN 后是属性的下限值,AND 后是属性的上限值 例3.8 在选课Score 表中查询成绩在80 90 分之间的同学学号、课程号和相应成绩 SELECT studentNo,courseNo,score FROM Score WHERE score BETWEEN 80 AND 90 该查询也可以使用逻辑运算AND 实现,见例3.2216 例3.9 在选课Score
9、表中查询成绩不在80 90 分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score NOT BETWEEN 80 AND 90 该查询也可以使用逻辑运算OR 实现,见例3.23171.2.3 集合查询 IN用于查询属性值在某个集合内的元组 NOT IN 用于查询属性值不在某个集合内的元组 IN后面是集合,可以是具体的集合,也可以是查询出来的元组集合(该部分内容详见3.4 节的内容)。例3.10 在选课Score 表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩。SELECT
10、 studentNo,courseNo,score FROM Score WHERE courseNo IN(001,005,003)该查询也可以使用逻辑运算OR 实现,见例3.1918 例3.11 在学生 Student 表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。SELECT studentName,native,classNo FROM Student WHERE native NOT IN(南昌,上海)该查询也可以使用逻辑运算AND 实现,见例3.21191.2.4 空值查询 空值表示未知或不确定的值,空值表示为null IS null 用于查询属性值为空值 IS
11、 NOT null 用于查询属性值不为空值 IS 不能用“=”替代 例3.12 在课程Course 表中查询先修课程为空值的课程信息。SELECT*FROM Course WHERE priorCourse IS NULL20 例3.13 在课程Course 表中查询有先修课程的课程信息。SELECT*FROM Course WHERE priorCourse IS NOT NULL211.2.5 字符匹配查询 LIKE 用于字符匹配查询,语法格式为:NOT LIKE ESCAPE 查询的含义是:如果在LIKE前没有NOT,则查询指定的属性列值与相匹配的元组;如果在LIKE前有NOT,则查询指
12、定的属性列值不与相匹配的元组。22 可以是一个具体的字符串,也可以包括通配符%和_%表示任意长度的字符串 ab%,表示所有以ab 开头的任意长度的字符串;zhang%ab,表示以zhang 开头,以ab 结束,中间可以是任意个字符的字符串。符号_(下划线)表示任意一个字符 ab_,表示所有以 ab 开头的3 个字符的字符串,其中第3个字符为任意字符;a_b 表示所有以a 开头,以b 结束的4 个字符的字符串,且第2、3 个字符为任意字符。23 例3.14 在班级Class 表中查询班级名称中含有会计的班级信息 SELECT*FROM Class WHERE className LIKE%会计%
13、注意:字符串必须用一对引号括起来 可单可双,小心匹配。24 例3.15 在学生Student 表中查询所有姓王且全名为3 个汉字的同学学号和姓名 SELECT studentNo,studentName FROM Student WHERE studentName LIKE 王_ 注意:在中文SQL-Server 中,如果匹配字符串为汉字,则一个下划线代表一个汉字;如果是西文,则一个下划线代表一个字符。25 例3.16 在学生Student 表中查询名字中不含有“福”的同学学号和姓名。SELECT studentNo,studentName FROM Student WHERE student
14、Name NOT LIKE%福%26 例3.17 在学生Student 表中查询蒙古族的同学学号和姓名 SELECT studentNo,studentName FROM Student WHERE nation LIKE 蒙古族 注意:如果匹配字符串中不含有%和_,则LIKE 与比较运算符“=”的查询结果一样 SELECT studentNo,studentName FROM Student WHERE nation=蒙古族27转义 如果查询字串中本身要包含%和_,必须对通配符进行转义处理。mysql 转义字符是。例3.18 在班级Class 表中查询班级名称中含有“08_”符号的班级名称
15、SELECT className FROM Class WHERE className LIKE%08%紧跟在 符号后的%不是通配符,而是普通的用户要查询的符号281.2.6 逻辑查询 SQL 提供AND、OR 和NOT 逻辑运算符分别实现逻辑与、逻辑或和逻辑非运算 例3.19 在选课Score 表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩SELECT studentNo,courseNo,scoreFROM ScoreWHERE courseNo=001 OR courseNo=005 OR courseNo=003 在例3.10 中使用的是集合运算,本例
16、中采用逻辑“或”运算29 例3.20 在Student 表中查询1991 年出生且籍贯为“汉族”的同学学号、姓名、出生日期。SELECT studentNo,studentName,birthday FROM Student WHERE year(birthday)=1991 AND nation=汉族30 注意:在逻辑运算中,不可以对同一个属性进行逻辑“与”的等值运算 例:在选课Score 表中查询同时选修了“001”和“002”课程的同学的选课信息,如下查询是错误的,得不到结果:SELECT*FROM Score WHERE courseNo=001 AND courseNo=002 要实
17、现该查询,需要使用连接运算或嵌套子查询 通过连接运算表示该查询,参见例3.29、例3.31 通过嵌套子查询,参见例3.39、例3.40 31 例3.21 在Student 表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。SELECT studentName,native,classNo FROM Student WHERE native!=南昌 AND native!=上海 例3.22 在选课Score 表中查询成绩在80 90 分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score=8
18、0 AND score=9032 例3.23 在选课Score 表中查询成绩不在80 90 分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score90331.3 排序运算 使用ORDER BY 子句实现排序运算,其语法为:ORDER BY ASC|DESC,ASC|DESC,.其中:,.可以是属性、函数或表达式 缺省按升序(ASC)排序,按降序排序,必须指明DESC 选项 该运算含义是:在查询结果中首先按 的值进行排序 在 值相等的情况下再按 值排序,依此类推34 例3.24 在学生 Student 表中
19、查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号,并按籍贯的降序排序输出。SELECT studentName,native,classNo FROM Student WHERE native!=南昌 AND native!=上海 ORDER BY native DESC35 例3.25 在学生Student 表中查询“女”学生的学号、姓名、所属班级编号和出生日期,并按班级编号的升序、出生日期的月份降序排序输出。SELECT studentNo,studentName,classNo,birthday FROM Student WHERE sex=女 ORDER BY classNo,month(birthday)DESC 其中:month()函数表示提取日期表达式的月份361.4 查询表 FROM 子句后面可以是基本关系、视图,还可以是查询表 例3.26 查询1991 年出生的“女”同学基本信息。分析:可以先将学生表中的女生记录查询出来,然后再对查询表进行选择、投影操作。SELECT studentNo,studentName,birthday FROM(SELECT*FROM Student WHERE sex=女)AS a WHERE year(birthday)=199137
限制150内