340 likes | 475 Views
数据库原理与应用. 11 – SQL 语言 ⑦ 数据修改、视图等 郑捷. 嵌套查询(子查询). 在一个查询中,嵌入另外一个查询,作为外查询的依据或者参与者 根据内外查询的结果和关系,分为 相关与不相关子查询 单值子查询、列表子查询 子表查询 存在查询. 数据库原理与应用. 郑捷. 2. 子查询. ANY、ALL谓词 EXISTS子查询 子表查询 UNION查询 综合使用. ANY(SOME) 、 ALL 谓词. 对于返回列表的子查询,通常使用 IN 谓词配合进行查询 但是有时候可能希望对其每个元素进行判断.
E N D
数据库原理与应用 11 – SQL语言 ⑦ 数据修改、视图等 郑捷
嵌套查询(子查询) • 在一个查询中,嵌入另外一个查询,作为外查询的依据或者参与者 • 根据内外查询的结果和关系,分为 • 相关与不相关子查询 • 单值子查询、列表子查询 • 子表查询 • 存在查询 郑捷 lzj@fjnu.edu.cn www.lzj.name 数据库原理与应用 郑捷 2
子查询 • ANY、ALL谓词 • EXISTS子查询 • 子表查询 • UNION查询 • 综合使用 郑捷 lzj@fjnu.edu.cn www.lzj.name
ANY(SOME)、ALL谓词 • 对于返回列表的子查询,通常使用IN谓词配合进行查询 • 但是有时候可能希望对其每个元素进行判断 郑捷 lzj@fjnu.edu.cn www.lzj.name
ANY(SOME)、ALL谓词 • ANY(SOME)和ALL谓词对列表中的内容进行了修饰,使得之前的比较运算有可能进行。 • ANY要求比较运算与任一个元素满足条件即可 • ALL要求比较运算与全部元素均满足条件才行 • SOME是ANY的同义词 郑捷 lzj@fjnu.edu.cn www.lzj.name
比较运算等价转换关系 • 打叉表示在大部分情况下,这个比较是没有意义的 • 注意:以上等价条件是在子查询有结果的情况下。当子查询没有结果,则情况比较特殊 郑捷 lzj@fjnu.edu.cn www.lzj.name
EXISTS存在子查询 • 有些场合下,我们只需要知道一个查询有没有可返回的记录,而不关心具体内容 • EXISTS用于判断子查询是否有返回内容。如果有,则整个式子为真,否则为假。直接作为逻辑条件 • 但是返回数量多少、什么内容,一概忽略 郑捷 lzj@fjnu.edu.cn www.lzj.name
EXISTS子查询性质 • EXISTS子查询基本上都是相关子查询,一般用 SELECT * 方式,因为我们不关心查到什么 • 重点在于:如何构造子查询的WHERE、HAVING字句 • 在不考虑效率、可读性的情况下,EXISTS子查询可以等价实现几乎所有的查询 郑捷 lzj@fjnu.edu.cn www.lzj.name
子表子查询 • 在FROM字句中,被查询的对象可以是另外一个查询结果,叫做子表子查询 • 子表子查询是将子查询的结果作为外查询的数据源 郑捷 lzj@fjnu.edu.cn www.lzj.name
子表子查询要求 • 对于子表子查询,只能是不相关子查询 • 子查询作为表参与外查询,必须有别名!! • 往往子查询被作为参与连接的一个部分 郑捷 lzj@fjnu.edu.cn www.lzj.name
UNION查询 • UNION查询实际上就是将两个查询的结果进行“并”运算 • 要求其连接的两个查询结果集在列属性上一一对应 • 例:找出年龄未知的工程师,以及男性工程师 • 更多情况下,UNION连接的是无法用相同结构进行查询的几个语句 • UNION会自动将重复的元组删去,可以用UNION ALL来保留重复记录 郑捷 lzj@fjnu.edu.cn www.lzj.name
数据修改、视图等 • 数据的更改 • 插入、删除、更新 • 视图 • 概念和作用 • 创建和使用 • 视图的限制 • 索引、约束等的额外说明 郑捷 lzj@fjnu.edu.cn www.lzj.name
数据更新 • 有三种操作 • 插入:添加新记录 • 删除:删除原有记录 • 更新:修改原记录中指定字段的值 • 数据更新只影响记录,不影响表结构,同时新数据必须满足约束要求 郑捷 lzj@fjnu.edu.cn www.lzj.name
插入语句 • INSERT [INTO] <表> [(<字段列表>)]VALUES(<值列表>) • INSERT [INTO] <表> [(<字段列表>)]SELECT 字句 郑捷 lzj@fjnu.edu.cn www.lzj.name
插入数据说明 • 插入的新记录必须满足约束要求 • 如果省略字段列表,则系统自动默认按照字段顺序插入 • 值列表必须和字段列表一一对应 • 当某个字段没有给出值时,按照字段默认值进行 • 第二种语法将子查询的结果插入表中,可以同时插入多条记录,但是同样必须满足上述要求 郑捷 lzj@fjnu.edu.cn www.lzj.name
插入案例 • 添加新公司 • 添加新员工 • 安排人员参加项目 • 新建一个表,记录员工的姓名、公司名称和参加的项目数,查询出结果并插入新表 郑捷 lzj@fjnu.edu.cn www.lzj.name
SELECT INTO语句 • SELECT <字段> INTO <新表名> FROM ...... • 该语句将查询到的结果作为一个新表 郑捷 lzj@fjnu.edu.cn www.lzj.name
删除 • DELETE [FROM] <表> [WHERE <条件>] 郑捷 lzj@fjnu.edu.cn www.lzj.name
删除说明 • 如果没有指定条件,则删除全表所有记录,操作请注意!! • 删除全部记录后表结构仍存在,只是数据没了 • 当表有外键时,删除操作应满足外键要求 郑捷 lzj@fjnu.edu.cn www.lzj.name
外键对删除的影响 • 当两个表之间有外键关系时,对主键表记录的删除可能引起外键表数据违反约束 • 为避免这个情况,在建立外键的时候可以对删除操作进行如下附加说明: • 禁止操作(NO ACTION) • 禁止操作的进行,报告违反约束 • 级联操作(CASCADE) • 级联删除相关的外键表记录 • 置空操作(SET NULL) • 将外键表相关记录的外键字段设置为空(NULL) • 在SQL2000中不提供 郑捷 lzj@fjnu.edu.cn www.lzj.name
删除案例 • 删除上海公司 • 删除新添加的员工 • 修改外键,使得北京公司可以被删除 郑捷 lzj@fjnu.edu.cn www.lzj.name
更新数据 • UPDATE <表>SET <字段>=<值> [{,<字段>=<值>}][WHERE <条件>] 郑捷 lzj@fjnu.edu.cn www.lzj.name
更新说明 • 如果没有指定条件,则更新全表的记录 • 新数据必须满足约束要求 • 新值可以是一个常量,也可以是一个表达式,还可以是根据原值计算的结果 • 当更新主键字段时,应注意外键的要求。外键对其的约束和删除操作一样 郑捷 lzj@fjnu.edu.cn www.lzj.name
更新案例 • 每个人的工资增加20% • 上海公司的员工调动到北京公司 郑捷 lzj@fjnu.edu.cn www.lzj.name
视图 • 视图是从一个或几个基本表或视图导出的表 • 它是一个虚表 • 数据库只保存视图的定义,而不存放数据,数据保存在原始的基本表中 • 视图可以被看作是命名了的查询 郑捷 lzj@fjnu.edu.cn www.lzj.name
创建视图 • CREATE VIEW <视图名>[(<列名列表>)]AS SELECT ……[WITH CHECK OPTION] • DROP VIEW <视图名> 郑捷 lzj@fjnu.edu.cn www.lzj.name
视图的限制 • SELECT语句可以是任意合法的查询,不论多复杂都可以 • 在没有TOP字句的情况下,不允许出现ORDER BY字句(仅限SQL Server) 郑捷 lzj@fjnu.edu.cn www.lzj.name
视图案例 • 建立公司代码和员工人数的视图 • 建立男员工的视图 郑捷 lzj@fjnu.edu.cn www.lzj.name
视图的使用 • 在查询中,可以将视图看作一个表进行使用,对其进行查询 • 这个时候,可以将视图视作一个命名后的子查询 • 这也是最常见的用法 • 例:在上面建立的视图基础上进行查询 郑捷 lzj@fjnu.edu.cn www.lzj.name
更新视图 • 可以透过视图进行数据的更新 • 但是有一个明确的限制:只有视图中的数据可以和基本表中的数据一一对应时,才能进行更新 • 例如,之前建立的分组查询的视图是不可更新的,而男员工视图是可以更新的 郑捷 lzj@fjnu.edu.cn www.lzj.name
视图的作用 • 简化用户操作 • 提供对数据的不同观察角度 • 提供数据的逻辑独立性 • 提供更好的安全保护 • 有利于更清晰地表达查询 郑捷 lzj@fjnu.edu.cn www.lzj.name
索引 • 索引是对基本表中的数据的一个摘要 • 索引能提高检索数据的效率 • 在设计查询的时候,要注意思考索引起到的作用 郑捷 lzj@fjnu.edu.cn www.lzj.name
约束 • 约束是对数据的限制 • 在更新数据的时候,要注意约束的作用 郑捷 lzj@fjnu.edu.cn www.lzj.name
预习 • 关系查询处理和查询优化(课本第九章) • 查询优化的概念 • 查询的步骤 • 查询优化 • 代数优化 • 物理优化 郑捷 lzj@fjnu.edu.cn www.lzj.name