SQL 基础之DML 数据处理(十三)

简介:

数据操作语言

DML 可以在下列条件下执行:

– 向表中插入数据

– 修改现存数据

– 删除现存数据

事务是由完成若干项工作的DML语句组成的


表中添加新的数据– INSERT 语句

使用 INSERT 语句向表中插入数据

insert into table [(column [, column...])]

values (value [, value...]);

使用这种语法一次只能向表中插入一条数据


为每一列添加一个新值

  • 按列的默认顺序列出各个列的值

  • 在 INSERT 子句中随意列出列名和他们的值

  • 字符和日期型数据应包含在单引号中

insert into departments(department_id,department_name,manager_id,location_id) values(304,'System Control',202,1900);


隐式方式: 在列名表中省略该列的值。

insert into departments (department_id,department_name) values (30, 'purchasing');


显示方式: 在VALUES 子句中指定空值。

insert into departments values (100, 'finance', null, null);


SYSDATE 函数记录当前系统的日期和时间。

INSERT INTO employees (employee_id,

first_name, last_name,

email, phone_number,

hire_date, job_id, salary,

commission_pct, manager_id,

department_id)

VALUES (113,

'Louis', 'Popp',

'LPOPP', '515.124.4567',

SYSDATE, 'AC_ACCOUNT', 6900,

NULL, 205, 110);


添加新员工

INSERT INTO employees

VALUES (114,

'Den', 'Raphealy',

'DRAPHEAL', '515.127.4561',

TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),

'SA_REP', 11000, 0.2, 100, 60);


创建脚本

在SQL 语句中使用 & 变量指定列值。

& 变量放在VALUES子句中。

insert into departments

(department_id, department_name, location_id)

values (&department_id, '&department_name',&location);


从其它表中拷贝数据

不必书写 VALUES 子句。

子查询中的值列表应于 INSERT 子句中的列名对应。

insert into sales_reps (id, name, salary, commission_pct)

select employee_id, last_name, salary, commission_pct

from employees

where job_id like '%REP%';


修改数据

使用 UPDATE 语句更新数据,可以一次更新多条数据(如果有需求)。

update table

set column = value [, column = value, ...]

[where  condition];


使用 WHERE 子句指定需要更新的数据:

update employees

set department_id = 50

where employee_id = 113;

如果省略WHERE子句,则表中的所有数据都将被更新:


update  copy_emp

set department_id = 110;

指定 column_name= NULL 更新一列的值为 NULL.


使用子查询更新两列

更新 113号员工的工作和工资使其与 205号员工相同

update employees

set job_id = (select job_id

from employees

where employee_id = 205),

salary = (select salary

from employees

where employee_id = 205)

where employee_id = 113;


基于另一张表更新数据

使用UPDATE 子查询,更新为基于另一张表中的数据

update copy_emp

set department_id = (select department_id

from employees

where employee_id = 100)

where job_id = (select job_id

from employees

where employee_id = 200);


从表中删除数据

使用DELETE 语句从表中删除数据

delete [from] table [where condition];


使用WHERE 子句指定删除的记录

delete from departments  where department_name = 'finance';


如果省略WHERE子句,则表中的全部数据将被删除:

delete from copy_emp;


基于另一张表删除数据

delete from employees 

where department_id = (select department_id

from departments

where department_name

like '%public%');


TRUNCATE  语句

从表中删除所有的行,保留了空表和完成的表结构。

数据定义语言 (DDL) ,不是DML语句,不能使用撤销

语法:

TRUNCATE TABLE table_name;

示例:

TRUNCATE TABLE copy_emp;


数据库事务控制语句 COMMIT, ROLLBACK,  和 SAVEPOINT

数据库事务由以下的部分组成:

一个或多个DML 语句

一个 DDL 语句

一个 DCL 语句


数据库事务:开始和结束

以第一个 DML 语句的执行作为开始

以下面的其中之一作为结束:

– COMMIT 或 ROLLBACK 语句

– DDL 或 DCL 语句(自动提交)

– SQL Developer or SQL*Plus用户退出

– 系统崩溃


COMMIT 和ROLLBACK 语句的优点

使用COMMIT 和 ROLLBACK语句,我们可以:

  • 确保数据完整性。

  • 数据改变被提交之前预览。

  • 将逻辑上相关的操作分组。

wKioL1jJWG_z_u-fAABrFvDbvdQ062.jpg


回滚到保存点

  • 使用 SAVEPOINT 语句在当前事务中创建保存点。

  • 使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。


UPDATE...

SAVEPOINT update_done;


INSERT...

ROLLBACK TO update_done;



隐式事务处理

自动提交在以下情况中执行:

– DDL 语句。

– DCL 语句。

– 不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。

会话异常结束或系统异常会导致自动回滚。


提交或回滚前的数据状态

改变前的数据状态是可以恢复的

执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正

其他用户不能看到当前用户所做的改变,直到当前用户结束事务。

DML语句所涉及到的行被锁定, 其他用户不能操作。


COMMIT 后数据的状态

数据的改变被保存在数据库中。

以前的数据被覆盖。

所有用户都可以查看结果。

受影响的行上的锁被释放,可供其他用户来操作的那些行。

所有保存点都将被删除。


修改数据:

delete from employees

where employee_id = 99999;


insert into departments

values (290, 'corporate tax', null, 1700);


提交修改:

commit;


回滚后数据状态

使用 ROLLBACK 语句可使数据变化失效:

  • 数据更改都会被撤消。

  • 数据恢复到以前的状态。

  • 锁被释放。

delete from copy_emp;

rollback ;


回滚后数据状态:示例

delete from test;

25,000 rows deleted.


rollback;

rollback complete.


delete from test where id = 100;

1 row deleted.


select * from test where id = 100;

no rows selected.


commit;

commit complete.


语句级回滚

单独 DML 语句执行失败时,只有该语句被回滚。

Oracle 服务器自动创建一个隐式的保留点。

其他数据改变仍被保留。

用户应执行 COMMIT 或 ROLLBACK 语句结束事务。


读一致性

读一致性为数据提供一个一致的视图

一个用户的对数据的改变不会影响其他用户的改变

对于相同的数据读一致性保证:

– 查询不等待修改。

– 修改不等待查询。

– 修改等待修改。

wKiom1jJWwWRB8MlAACu_Aj07yM792.jpg



SELECT 语句中的 FOR UPDATE  子句

  • 锁定 EMPLOYEES 表中 job_id 为 SA_REP 的行。

select employee_id, salary, commission_pct, job_id

from employees

where job_id = 'SA_REP'

for update

order by employee_id;

  • 当你发出 ROLLBACK 或 COMMIT 命令,锁即被释放。

  • 如果 SELECT 语句试图锁定被另一个用户锁定的行,那么数据库将等待,直到该行可用,才返回 SELECT 语句的结果。


FOR UPDATE  子句 示列

您可以在 SELECT 语句多表查询时使用FOR UPDATE 子句。

select e.employee_id, e.salary, e.commission_pct

from employees e join departments d

using (department_id)

where job_id like 'st_clerk'

and location_id = 1500

for update

order by e.employee_id;


表 EMPLOYEES 和表 DEPARTMENTS 的行都被锁定。

使用 FOR UPDATE 的列名您有资格修改,仅查询的行被锁定。




命令 注释
INSERT 插入行信息
UPDATE 更新信息
DELETE 删除一行信息
TRUNCATE 删除表中所有行内容,但表结构保存
COMMIT 将所有pending的状态的都变成永久
SAVEPOINT 利用回滚创造的保存点
ROLLBACK 废弃所有pending 数据的该表
FOR UPDATE clause  in SELECT 锁住select查询行,知道select结束才释放




本文转自 yuri_cto 51CTO博客,原文链接:http://blog.51cto.com/laobaiv1/1907042,如需转载请自行联系原作者

相关文章
|
SQL 关系型数据库 MySQL
MySQL基本SQL语句2(DML)
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。DML语句主要分为三个大类 本章做演示使用的是上一章创建的表,MySQL基本SQL语句1(DDL) 下面是原本数据库表中的内容 我们使用命令对表进行两个修改如果是需要对全表都进行修改的话,就不需要写条件语句where 此处删除id为1的数据,和前边的修改语句一样,在where后面加入条件 此处删除所有数据,就没有条件了,因此不用写where DML语句是对基
81 1
|
SQL 安全 数据库
深入理解SQL的数据操作语言(DML)
SQL(Structured Query Language)是一种用于管理和操作关系数据库的强大语言。SQL语言被分为多个子语言,其中之一是DML(Data Manipulation Language),用于执行与数据的操作和管理相关的任务。在本文中,我们将深入探讨DML的各个方面,从基础操作到高级技巧,以帮助初学者更好地理解和使用SQL的DML。
350 1
|
8月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
277 0
|
4月前
|
SQL 大数据 数据处理
奇迹降临!解锁 Flink SQL 简单高效的终极秘籍,开启数据处理的传奇之旅!
【9月更文挑战第7天】在大数据处理领域,Flink SQL 因其强大功能与简洁语法成为开发者首选。本文分享了编写高效 Flink SQL 的实用技巧:理解数据特征及业务需求;灵活运用窗口函数(如 TUMBLE 和 HOP);优化连接操作,优先采用等值连接;合理选择数据类型以减少计算资源消耗。结合实际案例(如实时电商数据分析),并通过定期性能测试与调优,助力开发者在大数据处理中更得心应手,挖掘更多价值信息。
53 1
|
5月前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
69 6
|
5月前
|
SQL 大数据 测试技术
奇迹降临!解锁 Flink SQL 简单高效的终极秘籍,开启数据处理的传奇之旅!
【8月更文挑战第9天】在大数据处理领域,Flink SQL 因其强大功能与简洁语法深受开发者青睐。本文分享了编写高效 Flink SQL 的实用技巧:首先需深刻理解数据特性与业务目标;其次,合理运用窗口函数(如 TUMBLE 和 HOP)可大幅提升效率;优化连接操作,优先采用等值连接并恰当选择连接表;正确选取数据类型以减少类型转换开销;最后,持续进行性能测试与调优。通过这些方法,我们能在实际项目中(如实时电商数据分析)更高效地处理数据,挖掘出更多价值。
99 6
|
5月前
|
SQL 关系型数据库 数据库
|
5月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
111 0
|
5月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
586 0