数据操作语言
DML(Data Manipulation Language - 数据操作语言)可以在下列条件执行:
- 向表中插入数据
- 修改现存数据
- 删除现存数据
事务是由完成若干项工作的DML语句组成的
插入数据
insert语句语法:
insert into table [(column [, column...]}]
values (value [, value...]);
使用这种语法一次只能向表中插入 一 条 \color{red}{一条} 一条数据。
- 为每一列添加一个新值。
- 按列的默认顺序列出各个列的值。
- 在insert子句中随意列出列名和它们的值。
- 字 符 和 日 期 型 数 据 应 包 含 在 单 引 号 中 。 \color{red}{字符和日期型数据应包含在单引号中。} 字符和日期型数据应包含在单引号中。
insert into departments(department_id, department_name, manager_id, location_id)
values(17, 'Public Relations', 100, 1700);
1 row created.
向表中插入空值
- 隐式方式:在列名表中省略该列的值。
insert into department (department_id, department_name)
values (30, 'Purchasing');
1 row created.
- 显示方式:在VALUES子句中指定空值。
insert into departments
values (100, 'Finance', NULL, NULL);
1 row created.
插入指定的值
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,100);
加入新成员
insert into employees
values (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561', TO_DATE('FEB 3,1999', 'MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30);
1 row created.
创建脚本
- 在SQL语句中使用 & 变量指定列值。
- & 变量放在VALUES子句中。
insert into departments (department_id, department_name, location_id)
values(&department_id, '&department_name', &location);
从其它表中拷贝数据
- 在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%';
4 rows created.
- 不必书写VALUES子句
- 子查询中的值列表应与INSERT子句中的列名对应
更新数据
- 使用UPDATE语句更新数据
update table
set column = value[, column = value, ...]
[where condition];
- 可以一次更新多条数据
- 使用where子句指定需要更新的数据
update employees
set department id = 70
where employee_id = 113;
1 row updated.
- 如果省略where子句,则表中的所有数据都将被更新
update copy_emp
set department_id = 110;
22 rows updated.
在update语句使用子查询
示例:更新114号员工的工作和工资使其与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 = 114;
1 row updated.
在update语句中使用子查询
- 在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);
1 row updated.
更新中的数据完整性错误
update employees
set department_id = 55
where department_id = 110;
不存在55号部门
使用DELETE语句从表中删除数据
delete [from] table
[where condition];
- 使用where子句指定删除的记录
delete from departments
where department_name = 'Finace';
1 row deleted.
- 如果省略where子句,则表中的全部数据将被删除
delete from copy_emp;
22 rows deleted.
在DELETE中使用子查询
- 在delete中使用子查询,使删除基于另一个表中的数据
delete from employees
where department_id = (select department_id
from departments
where department_name like '%Public%');
1 row deleted.
删除中的数据完整性错误
delete from departments
where department_id = 60;
Delete 和 Truncate
- 都是删除表中的数据
- Delete操作可以rollback,可以闪回
- Delete操作可能产生碎片,并且不释放空间
- Truncate:清空表
控制事务
回滚到保留点
- 使用 S A V E P O I N T \color{red}{SAVEPOINT} SAVEPOINT 语句在当前事务中创建保存点
- 使用 R O L L B A C K \color{red}{ROLLBACK} ROLLBACK T O \color{red}{TO} TO S A V E P O I N T \color{red}{SAVEPOINT} SAVEPOINT 语句回滚到创建的保存点
update...
savepoint update done;
Savepoint created.
insert...
rollback to update_done;
Rollback complete.
数据库的隔离级别
-
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
- 脏读:
对于两个事务T1,T2, T1读取了已经被T2更新但还没有提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。 - 不可重复读:
对于两个事务T1, T2, T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。 - 幻读:
对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
- 脏读:
-
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,是他们不会相互影响,避免各种并发问题。
-
一个事务与其它事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。
数据库提供的4种事务隔离级别
- Oracle支持的2种事务隔离级别:
- READ COMMITED
- SERIALIZABLE
Oracle默认的事务隔离级别为:READ COMMITED
MySQL默认的事务隔离级别为:REPEATABLE READ
总结
语句 | 功能 |
---|---|
INSERT | 插入 |
UPDATE | 修正 |
DELETE | 删除 |
COMMIT | 提交 |
SAVEPOINT | 保存点 |
ROLLBACK | 回滚 |
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。