精华内容
下载资源
问答
  • 事务由单独单元的一个或多个SQL语句组成,在这个单元,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据...

    一、事务

    (一)概念

    1.TCL语言

    Transaction Control Language,事务控制语言

    2.事务

    事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。事务用来管理 DML(INSERT、UPDATE、DELETE) 语句。
    INNODB 存储引擎 支持事务,而MYISAM、MEMORY等不支持事务

    3.存储引擎

    • 概念:在MySQL中的数据用各种不同的技术存储在文件(或内存)中。
    • 可以通过show engines;来查看MySQL支持的存储引擎。
    • 在MySQL中用的最多的存储引擎有:INNODB、MYISAM、MEMORY等。

    (二)事务的ACID属性

    1.原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    2.一致性(Consistency)

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

    3.隔离性(Isolation)

    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个事务请求同一数据。不同的事务之间彼此没有任何干扰。

    4.持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

    案例:假设有这样一张账户表,小明和小红各有1000元,此时小明想转500元给小红
    在这里插入图片描述

    UPDATE bank SET account=500 WHERE username='小明';
    UPDATE bank SET account=1500 WHERE username='小红';
    

    假如刚修改完小明的account就发生了异常,那么小红的account就没有被修改到,那么此时小明只有500元,小红有1000元,那么就少了500元。这种情况就应该将小明的余额修改的操作给回滚。因为这两条语句是一个事务,事务中的操作要么都发生,要么都不发生(原子性)。事务必须使数据库从一个一致性状态(转账前两人余额总和为2000元)变换到另外一个一致性状态(转账后两人余额总和为2000元)(一致性)。假设小明给小红转账的同时,有另外一个事务小刚给小明转账,那也得等待小明给小红转账结束。(隔离性)假设转账结束并提交了,那么最终的结果会一直保存在数据库中。(持久性

    (三)事务的创建

    1.隐式事务

    事务没有明显的开启和结束的标记。比如INSERT、UPDATE、DELETE语句。这种事务的autocommit(自动提交)都是开的。
    在这里插入图片描述

    2.显式事务

    事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用

    (1)步骤1:开启事务

    SET autocommit=0;
    START TRANSACTION;#可写可不写
    

    (2)步骤2:编写事务中的SQL语句(SELECT、INSERT、UPDATE、DELETE)

    语句1,
    语句2,
    ...
    

    (3)结束事务

    一切正常,则提交事务:

    COMMIT;
    

    或者需要撤销操作,回滚事务:

    ROLLBACK;
    

    案例

    #创建表
    DROP TABLE IF EXISTS bank;
    CREATE TABLE bank(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	username VARCHAR(20),
    	account DOUBLE
    );
    #插入值
    INSERT INTO bank(username,account) VALUES('小明',1000),('小红',1000);
    #开启事务
    SET autocommit=0;
    START TRANSACTION;
    #编写事务语句
    UPDATE bank SET account=500 WHERE username='小明';
    UPDATE bank SET account=1500 WHERE username='小红';
    #结束事务
    COMMIT;
    

    在这里插入图片描述

    假如结束事务用的是ROLLBACK;,那么结果是两人的余额都还是操作前的1000。

    (四)数据库的隔离级别

    • 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
      • 脏读:对于两个事务 T1、 T2,T1 读取了已经被 T2 更新但还没有被提交的字段。之后,若 T2 回滚,T1读取的内容就是临时且无效的。
      • 不可重复读: 对于两个事务T1、T2,T1 读取了一个字段,然后 T2 更新了该字段。之后,T1再次读取同一个字段,值就不同了。
      • 幻读:对于两个事务T1、T2,T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行。之后,如果 T1 再次读取同一个表,就会多出几行。
    • 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。
    • 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

    数据库提供的四种事务隔离级别

    隔离级别 描述 脏读 不可重复读 幻读
    READ UNCOMMITTED(读未提交数据) 允许事务读取未被其他事务提交的变更 会出现 会出现 会出现
    READ COMMITTED(读已提交数据) 只允许事务读取已经被其它事务提交的变更 不会出现 会出现 会出现
    REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新 不会出现 不会出现 会出现
    SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。但性能十分低下。 不会出现 不会出现 不会出现
    • ORACLE支持的2种事务隔离级别:READ COMMITTEDSERIALIZABLE。ORACLE默认的事务隔离级别为:READ COMMITTED
    • MySQL支持4种事务隔离级别。MySQL默认的事务隔离级别为:REPEATABLE READ
    • 每启动一个MySQL程序,就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation,表示当前的事务隔离级别。
    • 查看当前的隔离级别: SELECT @@tx_isolation;
    • 设置当前MySQL连接的隔离级别: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    • 设置数据库系统的全局的隔离级别: SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

    (五)保存点

    在MySQL中, 保存点SAVEPOINT属于事务控制处理部分。SAVEPOINT关键字用于在数据库事务中设置一个存储点,在一个较长的事务中暂存数据,如果在事务末尾执行回滚,可选择性地回滚到 SAVEPOINT设置的暂存点。

    语法

    • SAVEPOINT 保存点名; 设置SAVEPOINT。如果重复设置同名SAVEPOINT,新的会覆盖老的。
    • RELEASE SAVEPOINT 保存点名; 释放SAVEPOINT。
    • ROLLBACK【WORK】 TO 【SAVEPOINT】保存点名; 回滚到指定的SAVEPOINT。执行多条操作时,回滚到想要的那条语句之前。

    另外,执行 COMMIT 或 ROLLBACK (未指定 SAVEPOINT)都会清空当前事务的所有 SAVEPOINT。

    案例
    在这里插入图片描述

    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM bank WHERE id=1;
    SAVEPOINT a;#设置保存点
    DELETE FROM bank WHERE id=2;
    ROLLBACK TO a;#回滚到保存点
    

    在这里插入图片描述

    (六)DELETE和TRUNCATE在事务使用时的区别

    假设有这样一张bank表:
    在这里插入图片描述

    1.DELETE删除可以回滚

    案例

    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM bank;
    ROLLBACK;
    

    结果
    在这里插入图片描述

    2.TRUNCATE删除不能回滚

    案例

    SET autocommit=0;
    START TRANSACTION;
    TRUNCATE TABLE bank;
    ROLLBACK;
    

    结果
    在这里插入图片描述

    二、视图

    (一)含义

    视图是MySQL5.0.1版本出现的新特性,是通过表动态生成的一种虚拟存在的表,可以和普通表一样使用。行和列的数据来自于定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。

    (二)视图的优点

    • 重用SQL语句
    • 简化复杂的SQL操作,不必知道它的查询细节
    • 保护数据,提高安全性

    (三)应用场景

    • 多个地方用到同样的查询结果
    • 该查询结果使用的sql语句较复杂

    案例:查询姓张的学生名和专业名
    传统方法:

    SELECT stuname,majorname
    FROM student s
    INNER JOIN major m ON s.majorid=m.id
    WHERE s.stuname LIKE '张%';
    

    视图方法:

    CREATE VIEW v1
    AS
    SELECT stuname,majorname
    FROM student s
    INNER JOIN major m ON s.majorid=m.id;
    
    SELECT * FROM v1 WHERE stuname LIKE '张%';
    

    (四)创建和使用视图

    格式

    CREATE VIEW 视图名
    AS
    查询语句;
    

    案例1:查询姓名中包含a字符的员工名、部门名和工种信息

    #1.创建
    CREATE VIEW myv1
    AS
    SELECT last_name,department_name,job_title
    FROM employees e
    JOIN departments d ON e.department_id=d.department_id
    JOIN jobs j ON j.job_id=e.job_id;
    #2.使用
    SELECT * FROM myv1 WHERE last_name LIKE '%a%';
    

    案例2:查询各部门的平均工资级别
    传统方法:(FROM后面的子查询)

    #1.查询每个部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id;
    #2.连接1的结果集和job_grades表,筛选条件平均工资between lowest_sal and highest_sal
    SELECT ag_dep.*,g.grade_level
    FROM(
    	SELECT AVG(salary) ag,department_id
    	FROM employees
    	GROUP BY department_id
    )ag_dep
    INNER JOIN job_grades g
    ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
    

    视图方法:

    #1.创建视图查看每个部门的平均工资
    CREATE VIEW myv2
    AS
    SELECT AVG(salary) ag,department_id
    FROM employees
    GROUP BY department_id;
    #2.使用
    SELECT myv2.ag,g.grade_level
    FROM myv2
    INNER JOIN job_grades g
    ON myv2.ag BETWEEN g.lowest_sal AND g.highest_sal;
    

    案例3:查询平均工资最低的部门信息

    SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    

    案例4:查询平均工资最低的部门名和工资

    CREATE VIEW myv3
    AS
    SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    
    SELECT d.department_name,m.ag
    FROM myv3 m
    INNER JOIN departments d
    ON m.department_id=d.department_id;
    

    (五)修改视图

    1.方式一

    格式

    CREATE OR REPLACE VIEW 视图名
    AS 
    查询语句;
    

    创建视图时也可以这样写

    案例

    CREATE OR REPLACE VIEW myv3
    AS
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
    

    2.方式二

    格式

    ALTER VIEW 视图名
    AS
    查询语句;
    

    案例:

    ALTER VIEW myv3
    AS
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
    

    (六)删除视图

    用户可以一次删除一个或者多个视图,前提是必须有该视图的DROP权限。
    格式

    DROP VIEWIF EXISTS】 视图名,视图名,...;
    

    案例

    DROP VIEW IF EXISTS myv1,myv2,myv3;
    

    (七)查看视图

    格式

    DESC 视图名;
    

    如果需要查询某个视图的定义,也可以:

    SHOW CREATE VIEW 视图名;
    

    (八)更新视图

    假设有这样一张视图:

    CREATE OR REPLACE VIEW myv1
    AS
    SELECT last_name,email
    FROM employees;
    

    1.插入数据

    案例

    INSERT INTO myv1 VALUES('小明','xm@qq.com');
    

    不光视图中会插入这条数据,原始表也会,修改、删除也是如此。

    2.修改数据

    案例

    UPDATE myv1 SET last_name='小红' WHERE last_name='小明';
    

    3.删除数据

    案例

    DELETE FROM myv1 WHERE last_name='小红';
    

    4.不支持更新的视图

    视图一般是用于查询的,不是更新的。视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的,会报IS NOT UPDATEABLE错误

    • 包含以下关键字的SQL语句:分组函数、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL
    • 常量视图
    • SELECT中包含子查询
    • JOIN
    • FROM后面跟着一个不能更新的视图
    • WHERE子句的子查询引用了FROM子句中的表

    (九)视图和表的区别

    创建的语法 是否实际占用物理空间 使用
    视图 CREATE VIEW 没有,只是保存了SQL逻辑 增删查改,只是一般不能增删改
    CREATE TABLE 占用,保存了数据 增删查改

    练习题1:创建视图emp_v1,要求查询电话号码以’011’开头的员工姓名和工资、邮箱

    CREATE OR REPLACE VIEW emp_v1
    AS
    SELECT last_name,salary,email
    FROM employees
    WHERE phone_number LIKE '011%';
    
    SELECT * FROM emp_v1;
    

    不能写成:

    CREATE OR REPLACE VIEW emp_v1
    AS
    SELECT last_name,salary,email
    FROM employees;
    
    SELECT * FROM emp_v1 WHERE phone_number LIKE '011%';
    

    因为emp_v1里面没有phone_number这个字段。

    练习题2:创建视图emp_v2,要求查询最高工资高于12000的部门信息

    CREATE OR REPLACE VIEW emp_v2
    AS
    SELECT MAX(salary) mx,department_id
    FROM employees
    GROUP BY department_id
    HAVING MAX(salary)>12000;
    
    SELECT d.*,e.mx
    FROM departments d
    INNER JOIN emp_v2 e
    ON d.department_id=e.department_id
    
    展开全文
  • 数据处理约束和视图

    2019-05-08 16:33:54
    6、 insert 只能插入(一条数据) 7、 update 修正现存数据,可以一次更新多条数据 8、 delete table 删除现存、删除表格,可以回滚 9、 truncate table 清空表格,不可回滚 10、 commit 提交 11、 sa...

    数据处理约束和视图
    数据处理的要点:
    1、 使用 DML 语句
    2、 向表中插入数据
    3、 更新表中数据
    4、 从表中删除数据
    5、 控制事务
    6、 insert 只能插入(一条数据)
    7、 update 修正现存数据,可以一次更新多条数据
    8、 delete table 删除现存、删除表格,可以回滚
    9、 truncate table 清空表格,不可回滚
    10、 commit 提交
    11、 savepoint 保存点
    12、 rollback 回滚
    插入数据
    1、 为每一列添加一个新值。
    2、 按列的默认顺序列出各个列的值。
    3、 在 INSERT 子句中随意列出列名和他们的值。
    4、 字符和日期型数据应包含在单引号中。
    数据库事务
    • 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
    • 数据库事务由以下的部分组成:
    – 一个或多个DML 语句
    – 一个 DDL(Data Definition Language – 数据定义语言) 语句
    – 一个 DCL(Data Control Language – 数据控制语言) 语句
    COMMIT和ROLLBACK语句的优点
    使用COMMIT 和 ROLLBACK语句,我们可以:
    1、 确保数据完整性。
    2、 数据改变被提交之前预览。
    3、 将逻辑上相关的操作分组。
    回滚到保留点
    1、 使用 SAVEPOINT 语句在当前事务中创建保存点。
    2、 使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
    提交或回滚前的数据状态
    1、 改变前的数据状态是可以恢复的
    2、 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
    3、 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
    4、DML语句所涉及到的行被锁定, 其他用户不能操作。
    提交后的数据状态
    1、 数据的改变已经被保存到数据库中。
    2、 改变前的数据已经丢失。
    3、 所有用户可以看到结果。
    4、 锁被释放,其他用户可以操作涉及到的数据。
    5、所有保存点被释放。
    约束
    注意事项
    1、 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
    2、 创建和修改约束:
    3、 非空约束(not null)只能定义在列级
    4、 唯一约束(unique)的列值可以为空
    5、 外键(foreign key)引用的列起码要有一个唯一约束
    (1)建表的同时
    (2)建表之后
    3、可以在表级或列级定义约束
    4、可以通过数据字典视图查看约束
    约束是表级的强制规定,有五种约束,分别为:
    NOT NULL 非空约束
    UNIQUE 唯一性约束
    PRIMARY KEY 主键约束
    FOREIGN KEY 外键约束
    CHECK 检查性约束
    表级约束和列级约束
    1、作用范围:
    ①列级约束只能作用在一个列上
    ②表级约束可以作用在多个列上(当然表级约束也
    可以作用在一个列上)
    2、定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
    3、非空(not null) 约束只能定义在列上
    FOREIGN KEY 约束的关键字
    FOREIGN KEY: 在表级指定子表中的列
    REFERENCES: 标示在父表中的列
    ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
    ON DELETE SET NULL(级联置空): 子表中相应的列置空
    添加约束的语法
    使用 ALTER TABLE 语句:
    1、 添加或删除约束,但是不能修改约束
    2、 有效化或无效化约束
    3、 添加 NOT NULL 约束要使用 MODIFY 语句
    视图
    1、 视图是一种虚表。
    2、 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
    3、 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
    4、 视图向用户提供基表数据的另一种表现形式
    5、 rownum “伪列” ---- 数据表本身并没有这样的列, 是 oracle 数据库为每个数据表 “加上的” 列. 可以标识行号.默认情况下 rownum 按主索引来排序. 若没有主索引则自然排序.
    6、 rownum 对 ROWNUM 只能使用 < 或 <=, 而是用 =, >, >= 都将不能返回任何数据.
    7、 视图分简单视图和复杂视图
    定义视图的含义
    1、 描述视图
    2、 创建和修改视图的定义,删除视图
    3、 从视图中查询数据
    4、 通过视图插入, 修改和删除数据
    5、 使用“Top-N” 分析
    数据库对象的基本描述
    表 基本的数据存储集合,由行和列组成。
    视图 从表中抽出的逻辑上相关的数据集合。
    序列 提供有规律的数值。
    索引 提高查询的效率
    同义词 给对象起别名
    视图中使用DML的规定
    1、 可以在简单视图中执行 DML 操作
    2、 当视图定义中包含以下元素之一时不能使用delete:
    (1)组函数
    (2)GROUP BY 子句
    (3)DISTINCT 关键字
    (4)ROWNUM 伪列
    3、当视图定义中包含以下元素之一时不能使用update:
    (1)组函数
    (2)GROUP BY子句
    (3)DISTINCT 关键字
    (4)ROWNUM 伪列
    (5)列的定义为表达式
    4、当视图定义中包含以下元素之一时不能使insert:
    (1)组函数
    (2)GROUP BY 子句
    (3)DISTINCT 关键字
    (4)ROWNUM 伪列
    (5)列的定义为表达式
    (6)表中非空的列在视图定义中未包括

    展开全文
  • 只是存放,不能更新和删除视图中没有数据 基本表的数据变化视图才会变化,跟新视图本质是更新基本表; 操作90%都是查询; 2.删除 3.受限更新 通过视图修改会有格外限制 4.定义基于视图新视图; ❖语句格式 CR...

    您尽心尽力去做事了嘛?

    复习

    1.插入 insert into values

    插入多条元组,直接子查询可以一次插入多条元组

    Where

    2.更新

    3.删除 delete from 和drop table的区别

    区别:表还在不在?

    基于视图的操作

    1.查询 90%都是查询;

    只是存放,不能更新和删除,视图中没有数据

    基本表的数据变化视图才会变化,跟新视图本质是更新基本表;

    操作90%都是查询;

    2.删除

    3.受限更新

    通过视图修改会有格外的限制

    4.定义基于视图的新视图;

    ❖语句格式
    
    CREATE VIEW <视图名> [(<列名> [,<列名>]…)]   --重新给某个属性列命名(三种情况)
    AS <子查询>
    [WITH CHECK OPTION];  --将来通过视图增删改查是不能破坏的谓词
    
    ⬧ 子查询不允许含有ORDER BY子句和DISTINCT短语
    ⬧ WITH CHECK OPTION
    ➢透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)
    
    

    [例3.84] 建立信息系学生的视图。

    CREATE VIEW IS_Student --没有带列名,就是用的原表的名字
    AS
    SELECT Sno, Sname, Sage
    FROM student
    WHERE Sdept= 'IS' 
    WITH CHECK OPTION 
    --如果要插入的时候,假设没有给所在系赋值,可以插入但是会自动赋值为计算机系,Sdept= 'IS'
    
    -- 视图 -- 设计  --可以看到Sdept的筛选器变成了  = 'IS'
    
    --从单个基本表导出,只是去掉了基本表某些行和某些列,保留了码————行列子集视图
    
    select *
    from is_student;
    
    --[例3.86] 建立信息系选修了1号课程的学生视图。
    
    CREATE VIEW IS_S1(Sno,Sname,Grade)
    AS
    SELECT Student.Sno,Sname,Grade
    FROM Student,SC
    WHERE Student.Sno=SC.Sno AND
    	Sdept= 'IS' AND
    	SC.Cno= '1'--[例3.87]建立信息系选修了1号课程且成绩在90分以上的学生视图。
    
    CREATE VIEW IS_S2
    AS
    SELECT Sno,Sname,Grade
    FROM IS_S1     --基于上一个视图;	在IS_S1的基础之上;
    WHERE Grade>=90
    [3.89] 将学生的学号及他的平均成绩定义为一个视图。
    --视图中应该有两列
    
    
    CREATE VIEW S_G(Sno,Gavg)
    AS 
    SELECT Sno,AVG(Grade)   --平均成绩
    FROM SC				    
    GROUP BY Sno;		--根据学号分组
    
    
    --显示
    select *from is_a;
    

    删除视图

    ❖语句格式
    
    DROP VIEW <视图名> [CASCADE];
    
    ⬧ 该语句从数据字典中删除指定的视图定义
    ⬧ 由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删
    除
    ⬧ 删除基表时,由该基表导出的所有视图定义都必须显式删除
    ⬧ 如果CASCADE选项,则删除该视图时会把由它导出的视图一块删除
    
    drop view is_a;
    

    查询视图

    ❖从用户角度:查询视图与查询基本表相同
    ❖DBMS实现视图查询的方法
    ⬧ 实体化视图(View Materialization) 			这个方法不推荐!!!
    	➢有效性检查:检查所查询的视图是否存在
    	➢执行视图定义,将视图临时实体化,**生成临时表**  会造成数据的冗余	
    
    	➢**查询视图转换为查询临时表**
    
    	➢查询完毕删除被实体化的视图(临时表)
    

    视图的消解法

    ⬧ 视图消解法(View Resolution)  不存在数据的冗余
    	➢进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图
    的定义
    	➢把视图定义中的子查询与用户的查询结合起来,转换成**等价的对基本表的查询**
    	
    	➢执行修正后的查询!
    

    并不需要用户来做什么

    --[例3.92] 在信息系学生的视图中找出年龄小于20岁的学生。
    
    SELECT Sno,Sage
    FROM IS_Student
    WHERE Sage<20--◼ 视图消解法
    --转换后的查询语句为:
    
    SELECT Sno,Sage 
    FROM Student
    WHERE Sdept= 'IS' AND Sage<20--[例3.94]在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩。
    SELECT *
    FROM S_G
    WHERE Gavg>=90--错误示范
    SELECT Sno,AVG(Grade)
    FROM SC
    WHERE AVG(Grade)>=90
    GROUP BY Sno;
    --查询转换:
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno; --因为视图中没有数据
    HAVING AVG(Grade)>=90

    更新视图

    ❖用户角度:更新视图与更新基本表相同
    ❖DBMS实现视图更新的方法
    
    	⬧ 视图实体化法(View Materialization)
    	⬧ 视图消解法(View Resolution)
    
    ❖指定WITH CHECK OPTION子句后
    
    	DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新.
    
    
    [3.95] 将信息系学生视图IS_Student中学号201215122的学生姓名改为“刘辰” 。
    UPDATE IS_Student
    SET Sname= '刘辰'
    WHERE Sno= ' 201215122 '--转换后的语句: 
    --转成对基本表的操作
    --修改的是本身视图可以看到的数据
    UPDATE student
    SET Sname= '刘辰'
    WHERE Sno= ' 201215122 ' AND Sdept =IS’;
    

    删除信息系学生的记录

    Delete 
    from is_studnet
    where sno= '201215129'Delete 
    from studnet
    where sno= '201215129' and sdept = 'IS'

    更新视图

    ❖一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义
    地转换成对相应基本表的更新(对两类方法均如此)
    --例:视图S_G为不可更新视图。
    --非行列子集视图,涉及到聚簇函数的不能更新;
    CREATE VIEW S_G (Sno,Gavg) 
    --基本表没有平均分这个项所以不可更新;无意义
    AS 
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno;
    

    视图的作用

    ❖视图能够**简化**用户的操作
    ❖视图使用户能以多种角度看待同一数据
    ❖视图对重构数据库提供了一定程度的逻辑独立性
    ❖视图能够对机密数据提供安全保护
    ❖适当的利用视图可以更清晰的表达查询
    
    逻辑独立性 :三级模式 外模式(视图) 内模式(多个存储文件) 模式 (基本表)    
    
    展开全文
  • 销售退货单(M_RET_SALE)、售后服务处理单(AP_V_RESERVICES),需要注意的是 售后服务处理单 是视图视图本身并不存储数据,视图表中的数据都是来源于基表,所以我虽然使用的delete from 删除语句从视图表中...

      误删数据的前因后果一大堆就不描述了……

      总计删除6条 售后服务处理单,4条销售退货单,下面记录一下数据恢复的过程:

    1.

      首先明确我删除记录的两个表分别为:销售退货单(M_RET_SALE)、售后服务处理单(AP_V_RESERVICES),需要注意的是 售后服务处理单 是一个视图(视图本身并不存储数据,视图表中的数据都是来源于基表,所以我虽然使用的delete from 删除语句从视图表中删除了数据,但是实际上是删除了基表中的数据,如果我想恢复视图表数据,实际上只要恢复了基表的数据之后,视图表中的数据自然就出来了),下面我先恢复 AP_V_RESERVICES视图表的基表AP_SERVICES中的数据,把他的数据恢复了视图表的数据就回来了

    根据删除条件找到我进行删除操作的时间点(找到删除视图的时间,就相当于找到了删除AP_SERVICES基表数据的时间):

    select sql_text,first_load_time,last_load_time from V$SQL where sql_text like '%delete from AP_V_RESERVICES%';
    

    (正好6条delete数据,正是我删除的记录)
    在这里插入图片描述
    2.

      根据删除的时间点,查询删除时间点前,该表中的数据(根据上面6个delete数据来看,最先删除的那条记录的时间是:2020-10-27 16:35:51,所以该时间点前,即将删除的6条记录都应该在表中):

    select * from AP_SERVICES as of timestamp to_timestamp('2020-10-27 16:35:50','yyyy-mm-dd hh24:mi:ss') ;
    

    在这里插入图片描述

    也就是说,上图中查出来的数据中,有我即将要删除的那条数据,根据该条数据和其他表的关联关系找到这条数据的独有特征是:DOCNO字段中包含有 PSP2010000078 字符串,所以我要具体找到这条数据可以添加搜索条件:

    select * from AP_SERVICES as of timestamp to_timestamp('2020-10-27 16:35:13','yyyy-mm-dd hh24:mi:ss') where docno='PSP2010000044';
    

    找到了该条记录:
    在这里插入图片描述

    3.
      将该条记录复制为 Insert 语句,再重新插入回AP_SERVICES,就ok了,以此方法,将基表中删除的记录都恢复回来。

    展开全文
  • 支持物化视图

    2020-11-30 10:54:50
    Doris中的用于存放明细数据数据模型,建表可指定,数据不会被聚合。</li><li>Base 表:Doris 中通过 CREATE TABLE 命令创建出来的表。</li><li>Materialized Views 表:简称 MVs,...
  • 批量删除

    2019-07-26 08:06:05
    在我们项目,不仅仅有单删,还有批量删除,批量删除是为了满足需要删除条数据的,它比删快很多,而且可以全部删除,或者你选中数据进行删除。那么批量删除的方法到底难不难呢,其实也不难,个人建议是先把单...
  • 1.删除数据需要注意问题【删除记录delete删除数据本身没有太多说,还是删除时候有...视图(view)【是一张虚拟表:使客户端在虚拟进行操作】 视图就是一条查询语句结果【因为查询之后结果本...
  • 1.删除数据需要注意问题【删除记录delete删除数据本身没有太多说,还是删除时候有truncate用法 ...3.视图(view)【是一张虚拟表:使客户端在虚拟进行操作】 视图就是一条查询语句结果【因...
  • Oraclet中的触发器

    2011-06-04 21:58:17
    例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表去。 CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; CREATE OR REPLACE TRIGGER del_emp BEFORE DELETE ON ...
  • foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:检查,指定一个表达式,用于检验指定数据 MySQL不支持check约束,但可以使用check约束,而没有任何效果; 根据约束数据列限制,约束...
  • 说明: 此参数指定链接程序 (如: UNIX 中的 ld, 或用于将目标文件链接到共享对象或 DLL 的 GNU ld) 的完整路径名。此参数是可选的。随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了个值...
  • Android SQL

    2020-08-11 09:36:10
    Drop:删除整个表,表的视图,数据库中的其他对象 操作语言: insert 创建一条记录 update 修改一条记录 delete 删除记录 数据查询语句: select 从一个或多个表中检索某些记录 select 列名.列名 from表; ...
  • m_db_interface_log)3、前端配置页面查询页面:新增及修改页面:第个sql一般用来删除原有数据,第二个sql一般用来插入新数据,多sql可以写在一起,代码做了批处理,用分号隔开(英文分号)。不配置临界时间点...
  • 想做个记录的程序,将文本框中输入的内容显示在列表中,现在能够添加,但是在删除时,数据模型中的数据删除成功,但是在列表视图中仍然存在,仅仅是有显示,但点击后没反应。 ``` public class Address { ...
  • SQLite3学习笔记(1)

    2018-09-17 23:32:00
    命令: DDL-数据定义: ...DROP -- 删除整个表,或者表的视图,或者数据库中的其他对象 DML - 数据操作: INSERT -- 创建一条记录 UPDATE -- 修改记录 DELETE -- 删除记录 DQL - 数据查询: SEL...
  • 4.2 B树索引对于删除DELETE管理 ...大量索引内部信息,该视图正常情况下没有数据,只有在运行了下面命令以后才会被填充数据,而且该视图中只能存放一条与分析过索引相关记录,不会有第二条记
  • 常用mysql语句

    2011-01-25 16:53:00
    <br />最常用的四语句: SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义...
  • Visual Studio程序员箴言中文扫描PDF

    热门讨论 2010-12-28 01:04:18
    技巧4.17 使用一条命令自动隐藏所有工具窗口 83 技巧4.18 自定义按下工具窗口图钉时行为,自动隐藏工具窗口还是整个工具窗口选项卡组 84 技巧4.19 通过工具窗口自动隐藏显示自动隐藏工具窗口 85 技巧4.20...
  • 2.4.2 在一条语句执行INSERT、UPDATE和DELETE 78 2.5 捕获和跟踪数据修改改变 81 2.5.1 返回数据修改语句影响行 81 2.5.2 异步捕获表数据修改 83 2.5.3 从CDC表查询所有变更 87 2.5.4 从CDC表查询...
  • sql经典语句部分

    2011-07-31 11:16:50
    删除视图:drop view viewname 10、说明:几个简单基本sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 ...
  • sql总结.doc

    2019-08-27 22:08:51
    (聚簇索引B+树中叶子结点存放的是数据和指向下一条数据的指针) 非聚簇索引:对主键和非主键字段建立索引时,直接找到B+树中的叶子结点,B+树中叶子结点存放的是对应数据的地址,并通过地址找到数据。 (3)Create ...
  • excel使用

    2012-11-25 17:06:01
    在单元格中显示公式如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图”选项...
  •  删除视图:drop view viewname 10、说明:几个简单基本sql语句  选择:select * from table1 where 范围  插入:insert into table1(field1,field2) values(value1,value2)  删除:delete from table1 ...
  • ZendFramework中文文档

    2011-03-22 10:11:12
    10.6.2. 取回一条记录 10.6.3. 修改数据 10.7. Zend_Db_Table_Rowset 10.7.1. 简介 10.7.2. 取回结果集 10.7.3. 遍历结果集 10.8. Zend_Db_Table Relationships 10.8.1. Introduction 10.8.2. Defining ...
  • 5.5.3 修改视图语句结构 5.5.4 重命名视图名称 5.5.5 使用SQL语句修改视图 5.5.6 删除视图的语句结构 5.5.7 使用SQL语句删除视图 5.6 视图应用 5.6.1 利用视图简化表复杂连接 5.6.2 利用视图简化复杂查询 ...
  • (2) 触发器还有助于强制引用完整性,以便在添加、更新或删除中的行时保留表之间已定义的关系。 32、函数依赖概念:设有关系模式R(U),X和Y都是U的子集。若对于R(U)的任一可能的关系r,r中不可能存在两个元组在X...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

删除视图中的一条数据delete