数据库及应用 授课教师:岳静 教学网站:http://swpu.fy.chaoxing.com Tel:

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
计算机软件技术基础计算机软件技术基础 数据库系统( 3 ). 第 2 页 4.3 关系数据库语言 SQL 关系数据库 SQL ( Structured Query Language )语言是关系 数据库的标准语言,对关系模型的发展和商用 DBMS 的研制起 着重要的作用。 SQL 发展历史  1986.
Chapter 3: SQL.
数据查询 单表查询 连接查询 嵌套查询 集合查询.
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
關聯查詢.
第5章 关系数据库标准语言SQL 主讲:张丽芳.
数据库系统概论 华中科技大学能源与动力工程学院
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
An Introduction to Database System
第2讲 Transact-SQL语言.
数据库原理 Database Principles 第三章 关系数据库标准语言SQL(续1).
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
数据库应用技术 SQL Server 2005.
An Introduction to Database System An Introduction to Database System
An Introduction to Database System
数据库技术 实践.
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
Chap 11 SQL基本查詢指令.
第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
Access数据库程序设计 总复习.
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
使用SQL Server Management Studio 进行数据查询与维护
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
資料庫 (Database) SQL Server 2008實作
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
文科计算机小公共课规划教材 Access 程序设计.
计算机应用基础 上海大学计算中心.
第3章 数据查询与SQL命令.
数据库原理 Database Principles 第五章 数据库完整性 Database Principles.
请写出下列查询语句并给出结果 1、列出student表中所有记录的sname、sex和class列。
關聯式資料庫.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
数据库技术 第三章 关系数据库标准语言SQL 中国科学技术大学网络学院 阚卫华.
第4章 SQL语言基础及数据库定义 4.1 基本概念 4.2 SQL Server 提供的主要数据类型 4.3 数据定义.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
Chap 10 SQL定義、操作與控制指令.
An Introduction to Database System An Introduction to Database System
第4章 数据的查询与更新 4.1 SQL查询语句格式 4.2 简单查询 4.3 统计查询 4.4 连接查询 4.5 嵌套查询
第3章 MySQL教學範本 主從式資料庫系統 - CH3.
第九章 進階的查詢技巧.
国家“十一五”规划教材 数据库原理与应用教程.
国家“十一五”规划教材 数据库原理与应用教程(第3版).
SQL SERVER 一些经典语句 1.
SPARQL若干问题的解释 刘颖颖
MySQL 結構化查詢語言 MySQL.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
数据库基础 1.
数据库技术.
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
学习目标 1、什么是表连接 2、表连接类型 3、表连接区别.
查询与视图 蔡海洋.
第14章 SQL数据查询与操纵 内容提要 本章知识点
SQL查询语句 蔡海洋.
VB与Access数据库的连接.
第4章 Excel电子表格制作软件 4.4 函数(一).
国家“十一五”规划教材 数据库原理与应用教程(第3版).
第八讲 SQL语言之数据查询(2) 第三讲 SQL Server 2000 数据库技术.
学习目标 1、limit的作用 2、实例操作.
8 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
学习目标 1、了解基本运算符 2、运算符优先级.
学习目标 1、如何对结果进行分组 2、分组函数的一些实用方法.
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
基于列存储的RDF数据管理 朱敏
VB与Access数据库的连接.
第4章 数据查询.
第 9 章 查詢資料- 善用 SELECT 敘述.
Presentation transcript:

数据库及应用 授课教师:岳静 教学网站:http://swpu.fy.chaoxing.com Tel:13551817786 E-mail: qiuqiuyj@163.com 教学网站:http://swpu.fy.chaoxing.com 123

第 4 章 数据操作 4.1 数据查询 4.2 数据更改

Student表

Course表

SC表

思考 如何查询表中的数据呢?

抽取特定属性 语法: 如果你需要抽取指定的列,你可以在SELECT语句中指定列名称。 SELECT 列名 FROM 表名 NOTE: All the chapters in this book include SQL queries and demos to explain concepts. You need to demonstrate these queries using the user account, Kim, Robert, or Angela, who does not have administrative privileges. In the examples, where you need to use administrative rights, specific inputs have been given for the faculty. Explain the students that SQL Server 2005 consists of many data types. Int, float, char, and varchar are some of the most commonly used data types. In addition, explain all the four data types to the students and ask them to read in the SG about other data types. FAQs Question: Difference between char and varchar? Answer: Char has a fixed length of characters to store whereas it is flexible in case of varchar.

选择表中若干列 查询指定列 例1 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student Sno sname 9512101 李勇 9512102 刘晨 9512103 王敏 9521101 张立 9521102 吴宾 9521103 张海 9531101 钱小平 9531102 王大力

选择表中若干列 Select sname,sno,sdept from student 例2 查询全体学生的姓名、学号、所在系 例2 查询全体学生的姓名、学号、所在系 Select sname,sno,sdept from student 注意:目标列表达式的顺序可以与表中的顺序不一致。

查询表中的全部列 SELECT Sno,Sname,Ssex, Sage, Sdept FROM Student 例3 查询全体学生的记录 等价于:SELECT * FROM Student

查询表中的全部列 查询的结果: Sno Sname Ssex Sage Sdept 9512101 李勇 男 19 计算机系 9512102 刘晨 20 9512103 王敏 女 9521101 张立 22 信息系 9521102 吴宾 21 9521103 张海 9531101 钱小平 18 数学系 9531102 王大力

思考 如何找出每个学生的出生年份呢?

例4.查询全体学生的姓名及其出生年份 SELECT Sname,2010- Sage FROM Student 结果为: 可以是表中存在的属性列,也可以是表达式、常量或者函数。 查询经过计算的列 例4.查询全体学生的姓名及其出生年份 SELECT Sname,2010- Sage FROM Student 结果为: Sname (无列名 ) 李勇 1989 刘晨 1988 王敏 张立 1986 吴宾 1987 张海 钱小平 1990 王大力

例5. 查询全体学生的姓 名和出生年份,并在出生 年份列前加入一个列,此 列的每行数据均为‘Year of Birth’常量值。 查询经过计算的列 Sname (无列名 ) 李勇 Year of Birth 1988 刘晨 1987 王敏 张立 1985 吴宾 1986 张海 钱小平 1989 王大力 例5. 查询全体学生的姓 名和出生年份,并在出生 年份列前加入一个列,此 列的每行数据均为‘Year of Birth’常量值。 SELECT Sname,‘Year of Birth’, 2002-Sage FROM Student 查询结果 :

指定列名 通过指定列的别名可以改变查询结果的列标题 语法格式为: 列名 | 表达式 [ AS ] 列标题 或: 列标题 =列名 | 表达式

指定列名 例5 查询全体学生的姓名和出生年份。 SELECT Sname 姓名, 2002-Sage 年份 FROM Student 姓名 李勇 1982 刘晨 1981 王敏 张立 1979 吴宾 1980 张海 钱小平 1983 王大力

选择表中的若干元组 例6 查询所有选修了课程的学生学号 SELECT Sno FROM SC 怎样才能删除重复的行?

消除取值相同的行 SQL 的DISTINCT关键字可以去掉结果表中的重复行 SELECT DISTICT Sno FROM SC Sno 9512101 9512102 9521102 9521103 9531101

思考 如何查询计算机系的学生的详细信息??

查询满足条件的元组 查询满足条件的元组是通过WHERE子句实现的; 语法格式 Select …from …

查询满足条件的元组 查询条件 谓 词 比较(比较运算符) 谓 词 比较(比较运算符) =, >, >=, <, <=, <>(或!=)NOT 确定范围 BETWEEN AND, NOT BETWEEN AND 确定集合 IN, NOT IN 字符匹配 LIKE, NOT LIKE 空值 IS NULL, IS NOT NULL 多重条件(逻辑谓词 AND, OR

SELECT Sname FROM Student WHERE Sdept = '计算机系' 结果为 : 例6 查询计算机系全体学生的姓名 SELECT Sname FROM Student WHERE Sdept = '计算机系' 结果为 : Sname 李勇 刘晨 王敏

例7.查询所有年龄在20岁以下的学生的姓名及年龄 SELECT Sname, Sage FROM Student WHERE Sage < 20 Sname Sage 李勇 19 钱小平 18 王大力

例8.查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade < 60

确定范围 BETWEEN…AND和NOT BETWEEN…AND是一个逻辑运算符,可以用来查找属性值在或不在指定范围内的元组。

确定范围 例9 查询年龄在20~23岁之间的学生的姓名、所在系和年龄 SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23 此句等价于: WHERE Sage >=20 AND Sage<=23

确定范围 例10 查询年龄不在20~23之间的学生姓名、所在系和年龄 SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23 此句等价于: SELECT Sname, Sdept, Sage FROM Student WHERE Sage <20 OR Sage>23

确定集合 IN是一个逻辑运算符,可以用来查找属性值属于指定集合的元组 IN的格式为: 列名 [ NOT ] IN (常量1, 常量2, … 常量n) IN的含义为:当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录 Not in 的含义相反

确定集合 例11.查询信息系、数学系和计算机系学生的姓名和性别 SELECT Sname, Ssex FROM Student WHERE Sdept IN ('信息系', '数学系', '计算机系') 此句等价于: SELECT Sname, Ssex FROM Student WHERE Sdept = '信息系' OR Sdept = '数学系' OR Sdept = '计算机系'

确定集合 例12 查询既不是信息系、数学系,也不是计算机系学生的姓名和性别 SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('信息系', '数学系', '计算机系') 此句等价于: SELECT Sname, Ssex FROM Student WHERE Sdept!= '信息系' AND Sdept!= '数学系' AND Sdept!= '计算机系'

字符匹配 LIKE用于查找指定列名与匹配串常量匹配的元组 LIKE运算符的一般形式为: 列名 [NOT ] LIKE ‘ <匹配串>’ 匹配串包括普通字符和通配符 通配符用于表示任意的字符或字符串

通配符 匹配串中可包含如下四种通配符: _: 匹配任意一个字符; %:匹配0个或多个字符; _: 匹配任意一个字符; %:匹配0个或多个字符; [ ]: 匹配[ ]中的任意一个字符;[abcd] [^ ]:不匹配[ ]中的任意一个字符[^abcd]

通配符 例13 查询姓‘张’的学生的详细信息 SELECT * FROM Student WHERE Sname LIKE ‘张%’ 结果为: Sno Sname Ssex Sage Sdept 9521101 张立 男 22 信息系 9521103 张海 20

通配符 例14 查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况 SELECT * FROM Student WHERE Sname LIKE ‘[张李刘]%’ 结果为: Sno Sname Ssex Sage Sdept 9512101 李勇 男 19 计算机系 9512102 刘晨 20 9521101 张立 22 信息系 9521103 张海

通配符 例15 查询名字中第2个字为‘小’或‘大’字的学生的姓名和学号 SELECT Sname, Sno FROM Student WHERE Sname LIKE '_[小大]%' 结果为 Sname Sno 钱小平 9531101 王大力 9531102

通配符 例16 查询所有不姓“刘”的学生 SELECT Sname FROM Student WHERE Sname NOT LIKE '刘% '

通配符 例17 从学生表中查询学号的最后一位不是2、3、5的学生情况 SELECT * FROM Student WHERE Sno LIKE '%[^235]'

涉及空值的查询 空值(NULL)在数据库中有特殊的含义,它表示不确定的值 判断某个值是否为NULL值,不能使用普通的比较运算符(=、!=等),而只能使用专门的判断NULL值的子句来完成 判断取值为空的语句格式为:列名IS NULL 判断取值不为空的语句格式为:列名 IS NOT NULL

涉及空值的查询 例18 查询无考试成绩的学生的学号和相应的课程号 SELECT Sno, Cno FROM SC WHERE Grade IS NULL 例19 查询所有有考试成绩的学生的学号和课程号 SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL

查询计算机系年龄在20岁以下的男生?

多重条件查询 在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。 例20-1 查询计算机系年龄在20岁以下的学生姓名 SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20 例20-2 查询年龄在20岁以下的所有男生的信息select * from student where sage<20 and ssex=‘男’ 练习4

将学生按成绩排序,怎么办?

对查询结果进行排序 排序子句的格式为: ORDER BY <列名> [ASC | DESC ] [ ,… n ]

对查询结果进行排序 例21 将学生按年龄升序排列 select *from student order by sage 例21 将学生按年龄升序排列 select *from student order by sage 例22 查询选修了‘c02’号课程的学生的学号及其成绩,查询结果按成绩降序排列 Select sno,grade from sc where cno=‘c02’ order by grade desc

对查询结果进行排序 用ORDER BY子句对多个列进行排序,则这些列在该子句中出现的顺序决定了对结果集进行排序的方式。

对查询结果进行排序 例23 查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列 SELECT * FROM Student ORDER BY Sdept, Sage DESC

思考 如何求所有学生的平均成绩呢?

使用计算函数汇总数据 COUNT( * ):统计表中元组个数 COUNT(<列名> ):统计本列列值个数 计算函数也称为集合函数或聚合函数、聚集函数,其作用是对一组值进行计算并返回一个单值 SQL提供的计算函数有: COUNT( * ):统计表中元组个数 COUNT(<列名> ):统计本列列值个数 SUM(<列名> ):计算列值总和(必须是数值型列) AVG(<列名> ):计算列值平均值(必须是数值型列) MAX(<列名> ):求列值最大值 MIN(<列名> ):求列值最小值

使用计算函数汇总数据 例24.统计学生总人数 SELECT COUNT(*) FROM Student 例25.统计选修了课程的学生的人数 SELECT COUNT (DISTINCT Sno) FROM SC 例26 计算9512101号学生的考试总成绩之和 SELECT SUM(Grade) FROM SC WHERE Sno = ‘9512101’ 练习6

使用函数的注意事项 Count(*)能计算有空值的元组,其他函数的计算过程忽略空值 计算函数不能出现在WHERE子句中 例 查询年龄最大的学生的姓名,如下写法是错误的: SELECT Sname FROM Student WHERE Sage = MAX(Sage)

思考 如何查询每一课程的选课人数?

对查询结果进行分组计算 什么是分组? 课程号 选课人数 c01 3 c02 4 c03 2 c05 c06

分组方法 GROUP BY可将计算控制在组一级,分组的目的是细化计算函数的作用对象。在一个查询语句中,可以使用任意多个列进行分组。

出现在Group By后面的列名也必须出现在select后面 分组数据(续) GROUP BY GROUP BY从句通过使用集合函数汇总结果集到查询定义的分组中。 使用HAVING从句以消除所有不满足条件的这些组。 语法: SELECT column_list FROM table_name WHERE condition [GROUP BY [ALL] expression [, expression] [HAVING search_condition] 出现在Group By后面的列名也必须出现在select后面 GROUP BY Clause Tell the students that the GROUP BY clause is used to group the output of the SELECT statement in several groups. If ALL is used, then it ignores the restriction provided by the WHERE clause. Just like the WHERE clause, you can use the HAVING clause with the GROUP BY clause. Example: (GROUP BY) SELECT Title, Minimum = MIN(VacationHours), Maximum = MAX(VacationHours) FROM HumanResources.Employee WHERE VacationHours > 20 GROUP BY Title Example: (HAVING) SELECT Title, 'Average Vacation Hours' = AVG(VacationHours) FROM HumanResources.Employee WHERE VacationHours > 30 GROUP BY Title HAVING AVG(VacationHours) >55 Additional Inputs All columns mentioned in the GROUP BY clause have to be included in the SELECT list. If a WHERE clause is present, then the GROUP BY clause groups only those rows which are satisfied by the conditions used in the WHERE clause. 使用Group By就必须使用集合函数

分组举例 例29 统计每门课程的选课人数,列出课程号和人数 SELECT Cno 课程号, COUNT(Sno) 选课人数 FROM SC GROUP BY Cno 查询结果为 : 课程号 选课人数 c01 3 C02 4 c04 2 c05 c06 练习7

分组举例 例30 查询每名学生的学号 ,选课门数和平均成绩 SELECT Sno 学号, COUNT(*) 选课门数, AVG(Grade) 平均成绩 FROM SC GROUP BY Sno 练习8

使用HAVING HAVING子句作用:对分组后的结果再进行过滤,它用于组而不是对单个记录; HAVING通常与GROUP BY子句一起使用。

使用HAVING 例31 查询修了3门以上课程的学生的学号 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3 结果为: Sno 9521102

使用HAVING 例32 查询修课门数等于或大于4门的学生的学号、平均成绩和选课门数 SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >= 4 结果为: Sno 平均成绩 选课门数 9521102 74 4

Student、Course、 Sc这3个表有什么相同之处? 思考 找出姓名为“李勇”的学生的成绩 Student、Course、 Sc这3个表有什么相同之处?

多表连接查询 内连接 自连接 外连接

内连接 最常用的连接类型 如果两个表的相关字段满足连接条件,则从两个表中提取数据并组合成新的记录 内连接的格式为: SELECT FROM 表1 [ INNER ]JOIN 表2 ON <连接条件>

连接 例34 查询每个学生及其修课的情况: SELECT * FROM Student JOIN SC ON Student.Sno = SC.Sno -- 将Student与 SC连接起来

如何查看计算机系学生的名字、所修课的课程号和成绩? 思考 如何查看计算机系学生的名字、所修课的课程号和成绩?

注意 两个表的连接结果中包含了两个表的全部列,Sno列重复了两次,这是不必要的。在写查询语句时应当将这些重复的列去掉; 由于在连接后的表中有重复的列名(Sno列),因此,在ON子句中对Sno加上了表名前缀限制,指明是哪个表中的Sno。 例34 去掉例32中的重复列 SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade, XKLB FROM Student JOIN SC ON Student.Sno = SC.Sno 练习11 练习12

如何查看选修了“数据库基础”课程的学生的学号、姓名? 思考 如何查看选修了“数据库基础”课程的学生的学号、姓名?

join course on course .cno=sc.cno Where course.cname=‘数据库基础’ 连接 例36 查询选修了“数据库基础”课程的学生的学号、姓名 select sno,sname,grade from student join sc on student.sno=sc.sno join course on course .cno=sc.cno Where course.cname=‘数据库基础’

select s2.Sname,s2.Sdept from Student s1 join Student s2 什么含义? 思考 select s2.Sname,s2.Sdept from Student s1 join Student s2 on s1.Sdept=s2.Sdept where s1.Sname='刘晨' and s2.Sname!='刘晨'

思考 查询学生的修课情况,包括修了课程的学生和没有修课的学生

使用外连接 A B C B D E Table X Table Y A B C D E COLUMNS COLUMNS RIGHT OUTER JOIN A B C D E Explain the concept of the RIGHT OUTER JOIN to the students using the diagram. Tell them, that as shown in the figure all the rows from second table, Table Y are displayed. However, only the matching rows from the first table, Table X, are displayed. Also tell them that the data is based on the common column between the tables, Column B. ALL ROWS FROM TABLE Y AND COMMON ROWS FROM TABLE X OUTPUT

外连接 作用:可以输出不满足连接条件的元组的信息; 只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条件。

外连接 外连接的语法格式为: select 列名 FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON <连接条件>

使用外连接 A B C B D E Table X Table Y A B C D E COLUMNS COLUMNS RIGHT OUTER JOIN A B C D E Explain the concept of the RIGHT OUTER JOIN to the students using the diagram. Tell them, that as shown in the figure all the rows from second table, Table Y are displayed. However, only the matching rows from the first table, Table X, are displayed. Also tell them that the data is based on the common column between the tables, Column B. ALL ROWS FROM TABLE Y AND COMMON ROWS FROM TABLE X OUTPUT

使用外连接(续) A B C B D E Table X Table Y A B C D E COLUMNS COLUMNS FULL OUTER JOIN A B C D E Explain the concept of the FULL OUTER join to the students. Tell them that full outer join is a combination of LEFT OUTER join and RIGHT OUTER join. This join returns all the matching and non-matching rows from both the tables. ALL ROWS FROM TABLE Y AND TABLE Y AND COMMON ROWS ONLY ONCE OUTPUT

例38.查询学生的修课情况,包括修了课程的学生和没有修课的学生 SELECT Student.Sno, Sname, Cno, Grade FROM Student LEFT JOIN SC ON Student.Sno = SC.Sno Sno Sname Cno Grade 9512101 李勇 c01 90 c02 86 c06 NULL 9512102 刘晨 78 c04 66 9512103 王敏 9521101 张立 吴宾 82 75 92 c05 50 9521103 张海 68 9531101 钱小平 80 95 9531102 王大力 85

SELECT Student.Sno, Sname, Cno, Grade FROM Student RIGHT JOIN Sc 9512101 李勇 c01 90 c02 86 c06 NULL 9512102 刘晨 78 c04 66 吴宾 82 75 92 c05 50 9521103 张海 68 9531101 钱小平 80 95 9531102 王大力 85 采用右外连接 SELECT Student.Sno, Sname, Cno, Grade FROM Student RIGHT JOIN Sc ON Student.Sno = SC.Sno 练习13

子查询 什么功能? SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname = '刘晨')

子查询 如果一个SELECT语句是嵌套在一个SELECT、INSERT、UPDATE或DELETE语句中,则称之为子查询或内层查询;而包含子查询的语句则称为主查询或外层查询。

基于集合的测试的子查询 通过运算符in或not in,将一个表达式的值与子查询返回的结果集进行比较 格式: where 表达式 [not] in (子查询) 该表达式的值与集合中的某个值相等,则此测试为true;如果该表达式与集合中所有的值均不相等,则返回false

子查询 例38.查询成绩大于90分的学生的学号、姓名 SELECT Student.Sno, Sname, FROM Student JOIN SC ON Student.Sno = SC.Sno where grade>90 还有其他表示方法吗?

子查询 求满足这些学生学号的学生信息 结果为: 求成绩大于90的学生学号 SELECT Sno, Sname FROM Student WHERE Sno IN ( SELECT Sno FROM SC WHERE Grade > 90 ) 结果为: 求满足这些学生学号的学生信息 求成绩大于90的学生学号 Sno Sname 9521102 吴宾 9531101 钱小平

子查询 例39 查询选修了“数据库基础”课程的学生的学号、姓名 SELECT Sno, Sname FROM Student WHERE Sno IN ( SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = '数据库基础') ) 练习14

基于比较测试的子查询 通过比较运算符(=、<>、<、>、<=、>=)将一个表达式的值与子查询返回的值进行比较 where 表达式 比较运算符(子查询) 使用子查询进行比较测试时,要求子查询语句必须是返回单值的查询语句。

基于比较测试的子查询 例40 查询修了‘c02’课程且成绩高于此课程的平均成绩的学生的学号和成绩 SELECT Sno , Grade FROM SC WHERE Cno = 'c02' and Grade > ( SELECT AVG(Grade) from SC WHERE Cno = 'c02') 结果为: Sno Grade 9512101 86 9512102 78

基于比较测试的子查询 where sage = (select max(sage) from student) 例42 查询年龄最大的学生的姓名 select sname from student where sage = (select max(sage) from student)

基于存在性测试的子查询 存在性测试时,一般使用EXISTS谓词 格式:where [not] exists(子查询)

基于存在性测试的子查询 例41 查询选修了‘c01’号课程的学生姓名 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = 'c01')

查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄 思考 查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄

(SELECT MAX(Sage) FROM Student WHERE Sdept= ‘计算机系 ') SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MAX(Sage) FROM Student WHERE Sdept= ‘计算机系 ') AND Sdept <> '计算机系’

带有ANY(SOME)或ALL谓词的子查询 SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= '计算机系') AND Sdept <> ‘计算机系’

带有ANY(SOME)或ALL谓词的子查询 结果: 执行过程: 1.RDBMS执行此查询时,首先处理子查询,找出 计算机系中所有学生的年龄,构成一个集合(20,19) 2.处理父查询,找所有不是计算机系且年龄小于 20 或19的学生 Sname Sage 王敏 18 张立 19

带有ANY(SOME)或ALL谓词的子查询 (续) 例43 查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄。 方法一:用ALL谓词 SELECT Sname,Sage FROM Student WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept= '计算机系') AND Sdept <> '计算机系’;

带有ANY(SOME)或ALL谓词的子查询 (续) 方法二:用聚集函数 SELECT Sname,Sage FROM Student WHERE Sage <(SELECT MIN(Sage) FROM Student WHERE Sdept= '计算机系') AND Sdept <>'计算机系’;

查询没有选修“C01”课程的学生姓名和所在系 思考 查询没有选修“C01”课程的学生姓名和所在系

Select distinct Sname,Sdept from Student S JOIN SC on S.Sno=SC.Sno 方案1 Select distinct Sname,Sdept from Student S JOIN SC on S.Sno=SC.Sno Where Cno!=‘C01’

方案2 Select Sname,Sdept from Student where Sno IN (select Sno FROM SC where Cno!=‘C01’)

方案3 Select Sname,Sdept from Student where Sno NOT IN( select Sno FROM SC Where Cno=‘C01’)

方案4 Select Sname,Sdept from Student where Exists(select * from SC where.Sno=Student.Sno And Cno!=‘C01’)

创建数据库的步骤 创建数据库 创建表 插入数据 修改表中数据

插入数据 插入语句的格式为 insert [into] <表名> [(<列名表>)] values(值列表) 其中:<列名表>中的列名必须是表定义中有的列名,值列表中的值可以是常量也可以是NULL值,各值之间用逗号分隔

注意事项 值列表中的值与列名表中的列按位置顺序对应,它们的数据类型必须一致。 如果<表名>后边没有指明列名,则新插入记录的值的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)。

举例 例1 将新生记录(9521105,陈冬,男,信息系,18岁)插入到Student表中 INSERT INTO Student VALUES (‘9521105’, ‘陈冬’, '男', 18, '信息系') 例2 在SC表中插入一新记录,成绩暂缺 INSERT INTO SC(Sno, Cno) VALUES('9521105', 'c01') 或 insert into sc values('9521105', 'c01‘,null)

创建数据库的步骤 创建数据库 创建表 插入数据 修改表中数据

更新数据 使用UPDATE语句实现对数据的修改 UPDATE语句的语法格式为: UPDATE <表名> SET <列名=表达式> [,… n][WHERE <更新条件>]

无条件更新 如何将所有学生的年龄增加1岁 例1 将所有学生的年龄设为20岁 UPDATE Student SET Sage = 20

有条件更新 例2 将‘9512101’学生的年龄改为21岁 UPDATE Student SET Sage = 21 WHERE Sno = '9512101'

带子查询的更新 还有其他的表示方法吗? 例3 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 例3 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE ‘计算机系‘= (SELETE Sdept FROM Student WHERE Student.Sno = SC.Sno); 练习18

删除数据 删除语句:DELETE语句 语法格式为: DELETE [ FROM ] <表名> [WHERE <删除条件>]

无条件删除 删除表中全部数据,但保留表的结构 例1 删除所有学生的选课记录 DELETE FROM SC

有条件删除 例2 删除学号为9531101学生的记录 delete from student where no=‘9533101’

带子查询的删除语句 例3 删除计算机科学系所有学生的选课记录。 DELETE FROM SC 例3 删除计算机科学系所有学生的选课记录。 DELETE FROM SC WHERE ‘计算机系‘= (SELETE Sdept FROM Student WHERE Student.Sno=SC.Sno); 练习16

小结 创建数据库 创建表 插入数据 修改表中数据 查询数据

Thank You ! www.themegallery.com