数据库的基本操作3-数据处理

处理数据(DML)

数据控制语言(DML)

DML(Data mainipultation language)数据操纵语言

事务的完成是由若干个DML语句组成的

把sql的操作分为四大类

  • DML(Data mainipultation language) 数据操纵语言:insert update delete select
  • DDL(Data Defintied Language) 数据定义语言:create alter drop
  • TCL(Transaction Controll Language) 事务控制语言:commit savepoint rollback
  • DCL(Data Controll Language) 数据控制语言:grant revoke

2.插入数据

INSERT 语句语法

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

ff732d54ab60b5150660aaec5d84b8d2.png

插入数据

插入数据的三种方式:

a.省略列名

  insert into 表名 values(value1,value2);

b.插入指定的列(列名与value要一一对应)

  insert into 表名(列名1,列名2,...... ) values(value1,value2,...... );

c.通过创建脚本进行创建

   insert into 表名 values(&提示1,&提示2,...... );
   insert into 表名(列名1,列名2,....)values(&提示1,&提示2,...... );

通过&实现,需要注意的是如果插入的是字符或字符串则需要加上‘单引号’进行标识

案例分析

创建表格

--插入数据案例分析
--创建表格
/*
    创建student表
    sid    学生id   --primary key
    sname  学生姓名 
    sage   学生年龄
    grade  学生成绩
*/
create table student(
       sid number(10) primary key,
       sname varchar2(20),
       sage number(3),
       grade number(3)
);
select * from student;
--插入数据测试
/*
   插入数据有三种方式
   a.省略列名插入数据
     insert into 表名 values(value1,value2,.......);
  b.插入指定的列
    insert into 表名(列名1,列名2,.......)values(value1,value2,.......);
  c.通过创建脚本方式插入数据
    insert into 表名 values(&提示1,&提示2,.......);
    insert into 表名(列名1,列名2,.......)values(&提示1,&提示2,.......);
*/

数据测试

--a.省略列名:必须使得插入数据的顺序与定义的顺序一一对应
insert into student values(1001,'张三',18,90);
--在满足约束的条件下,可以插入空值(用空值填充数据)
--显示插入空值:在values子句中插入指定的空值
insert into student values(1002,'李四',null,null);
--隐式插入空值:在插入的时候省略相应列的值
insert into student(sid,sname) values(1003,'王五');

c2792b65cf6cd38ca06784809d12eeaf.png
--b.插入指定的列
insert into student(sid,sname,grade) values(1004,'王五',95);

6779d3b4ce2e6086286f78b2770ee3c5.png
--c.通过创建脚本进行创建
insert into student values(&学生编号,&学生姓名,&学生年龄,&学生成绩);

961fb1efecd07e20b8f14591adcf08b5.png
insert into student(sid,sname) values(&学生编号,&学生姓名);

c654d0ea70ce1c3ba37e125ff9b3a55c.png
--亦可插入指定的数据
insert into student(sid,sname) values(1007,sysdate);
--查询插入的所有数据
select * from student;

75cc7d0a91f2d845e5bd5f3d49ce2c31.png

3.更新数据

基本语法

b5484bc36296a4f3c0ae852233943557.png

案例分析

--更新数据
--普通更新数据
--1.将student表中sid为1007的学生姓名修改为小七,并设置相应的成绩
update student
set sname='小七',grade=95
where sid=1007;
select * from student;

f8842705b48ce413bf814947d2115c21.png
--使用子查询更新语句
--2.将student表中sid为空的学生成绩设置为与sid为1005的学生成绩相同
update student
set grade=(select grade
           from student
           where sid=1005)
where grade is null;
select * from student;

0cb195ebf3dd6022001e8985172f1d93.png

4.删除数据

基本语法

e0d206ebf1875ca4e58bad5bd928677c.png

案例分析

--删除数据
--a.普通删除指定数据
--删除一条指定数据
--1.删除student表中sid为1007的数据
delete
from student
where sid = 1007;
select * from student;

9330a3a2b907b2359f903996e70f74c3.png
--删除多组数据
--2.删除student表中sid小于1005的所有数据
delete
from student 
where sid < 1005;
select * from student;

b8890fb56df8e7cbb2f4869129730d29.png
--b.通过子查询删除指定数据
--3.删除student表中成绩与sid为1005的学生相同的学生信息
delete
from student
where grade = (select grade
               from student
               where sid = 1005);
select * from student;

bf65ffc247d363a50d464172a3b43327.png

Delete和Truncate

delete和truncate都是删除表中的数据

delete操纵可以rollback(回滚),但delete 操纵可能会产生碎片,并且不会释放空间

truncate 清空表

--delete与truncate
insert into student values(1001,'张三',18,92);
select * from student;

ce381ad29a3741f7ae1d1139e2330178.png
--delete删除表中数据,可以回滚
delete from student;

344eb0364bb8194ecac9fc81867c85dc.png

点击数据回滚,恢复删除之前的内容

90b9657ca81185a7973c9f191d1c62e4.png
select * from student;

13fd43a8cf8beda97c353f5cbd9378a0.png

Truncate语句执行之后自动提交,此时可以看到相应的回滚按钮并没有亮起来,数据也被清空

c2103e2a355050ade4f42e0967383e97.png

5.数据库事务(重要)

事务基础

事物的特性

数据库事务有四大特性: ACID --> 原子性 一致性 隔离性 持久性

  • 原子性(Atomicity)

指事务在逻辑上是不可分割的操作单元,所有的语句要么都执行成功,要么都执行失败并进行撤销。

  • 一致性(Consistency)

从一个状态转换为另外一个状态

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束

  • 隔离性(Isolation)

隔离性是针对并发而言。所谓的并发是指数据库服务器同时执行多个事务,如果在执行的过程中不采取有效的专门控制机制,并发事务之间会发生相互干扰

隔离性就是隔离并发运行的多个事务避免产生相互影响

  • 持久性(Durability)

事务一旦提交对数据的修改就是持久性的,数据已经从内存转移到了外部服务器上,并执行了固化的步骤

数据库事务的组成:

  • 一个或者多个DML语句
  • 一个DDL(数据定义语言)
  • 一个DCL 数据控制语言

使用commit 和rollback 进行事务的提交和事务的回滚

控制事务

--创建表格
create table student( 
 sid number(10) primary key,
 sname varchar2(20)
);
--数据测试
insert into student values(1,'张三');
insert into student values(2,'李四');
--设置保存点p1
savepoint p1;
select * from student;

39ce5a4182eb14d1191fa12bda90249b.png
--再次插入数据、修改数据
insert into student values(3,'王五');
update student set sname='hahabibu' where sid=2;
--设置保存点p2
savepoint p2;
select * from student;

802eae94b40f3a23670cd4a988e84aee.png
--测试删除数据
delete from student where sid=3;
select * from student;

8d5926450845f994fbec79606ec5ba13.png
--如果出现异常可以回滚到设置的保存点
--a.回滚到记录点p2
rollback to p2;
select * from student;

16cd1a6ceaa96de6419a0e54c891120e.png
--b.回滚到记录点p1
rollback to p1;
select * from student;

3f1e149490b1eb3f7862971771bec341.png
--提交事务 
commit;

ae77e8e66304e910db08cabbee77bb48.png

218b931fb9866c4458690f11944667eb.png

数据库的事务隔离级别

面试题: 数据库事务相关的内容

  • 问题一: 什么是事务?
  • 问题二:事务的四大特性是什么?详细解释:ACID
  • 问题三: 在数据库中由并发导致的各种问题包含哪些?
  • 问题四: 为了解决以上问题设计了哪些隔离级别详细解释?

1.什么是事务?

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务的完成由若干个DML语句组成的。

2.事务的四大特性?ACID

数据库事务有四大特性: ACID --> 原子性 一致性 隔离性 持久性

  • 原子性(Atomicity)

指事务在逻辑上是不可分割的操作单元,所有的语句要么都执行成功,要么都执行失败并进行撤销。

  • 一致性(Consistency)

从一个状态转换为另外一个状态

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束

  • 隔离性(Isolation)

隔离性是针对并发而言。所谓的并发是指数据库服务器同时执行多个事务,如果在执行的过程中不采取有效的专门控制机制,并发事务之间会发生相互干扰

隔离性就是隔离并发运行的多个事务避免产生相互影响

  • 持久性(Durability)

事务一旦提交对数据的修改就是持久性的,数据已经从内存转移到了外部服务器上,并执行了固化的步骤

3.在数据库中由并发导致的各种问题包含哪些?

由于数据库的隔离性导致的并发问题包括以下内容

对于同时运行的多个事务,当这些事务访问数据库中相同的数据,如果没有采取必要的隔离机制将会导致各种并发问题。

  • 脏读

对于两个事务T1,T2 。 T1读取了已经被T2更新但是还没有提交的字段之后,如果T2发生了回滚,T1读取的内容就是无效的。

  • 不可重复读

对于两个事务T1,T2。T1读了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,两次读取的值就是不同的。

  • 幻读(虚度)

对于两个事务T1,T2 T1从一个表中读取一个字段,然后T2在该表中插入一个新的行之后,如果T1再次读取这个表发现数据行数变多。

  • 丢失更新

是第一次提取的内容被第二次提交的内容进行了覆盖。

4.为了解决以上问题设计了哪些隔离级别详细解释?

为了解决并发问题 数据库定义了四种隔离级别。隔离级别越高效率越慢,根据业务选择一个合适的隔离级别,在性能和安全上做平衡。

  • read_uncommitted:读未提交的数据

允许事务读取未被其他事务提交的变更,脏读,不可重复读,(虚读)幻读问题都会出现

  • read_commited :读已提交的数据

只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是不可重复读和幻读依然存在

  • Repeatableread:可重复读

确保事务可以多次从一个字段中读取相同的值,这个事务存在期间,禁止其他事务对这个字段进行更新,可以避免脏读,不可重复读但是幻读依然存在。

  • Serializable :串行化

确保可以从一个表中读取相同的行,这个事务存在期间禁止其他事务对该表进行插入、更新和删除操作。所有的并发问题都可以避免,但是性能十分低下。

  • 丢失更新:主要是使用乐观锁和悲观锁解决丢失更新。

并不是所有的数据库都支持这四种隔离级别

  • Oracle支持两种隔离级别 read_commited 、Serializable 默认的隔离级别是read_commited
  • Mysql支持四种隔离级别 mysql的默认隔离级别是repeatableread

完整SQL参考:

--插入数据案例分析
--创建表格
/*
    创建student表
    sid    学生id   --primary key
    sname  学生姓名 
    sage   学生年龄
    grade  学生成绩
*/
create table student(
       sid number(10) primary key,
       sname varchar2(20),
       sage number(3),
       grade number(3)
);
select * from student;
--插入数据测试
/*
   插入数据有三种方式
   a.省略列名插入数据
     insert into 表名 values(value1,value2,.......);
  b.插入指定的列
    insert into 表名(列名1,列名2,.......)values(value1,value2,.......);
  c.通过创建脚本方式插入数据
    insert into 表名 values(&提示1,&提示2,.......);
    insert into 表名(列名1,列名2,.......)values(&提示1,&提示2,.......);
*/
--a.省略列名
insert into student values(1001,'张三',18,90);
--在满足约束的条件下,可以插入空值
--显示插入空值:在values子句中插入指定的空值
insert into student values(1002,'李四',null,null);
--隐式插入空值:在插入的时候省略相应列的值
insert into student(sid,sname) values(1003,'王五');

--b.插入指定的列
insert into student(sid,sname,grade) values(1004,'王五',95);



--c.通过创建脚本进行创建
insert into student values(&学生编号,&学生姓名,&学生年龄,&学生成绩);
insert into student(sid,sname) values(&学生编号,&学生姓名);

--亦可插入指定的数据
insert into student(sid,sname) values(1007,sysdate);

--查询插入的所有数据
select * from student;


--------------------------------------
--更新数据
--普通更新数据
--1.将student表中sid为1007的学生姓名修改为小七,并设置相应的成绩
update student
set sname='小七',grade=95
where sid=1007;
select * from student;
--使用子查询更新语句
--2.将student表中sid为空的学生成绩设置为与sid为1005的学生成绩相同
update student
set grade=(select grade
           from student
           where sid=1005)
where grade is null;
select * from student;
-------------------------------------
--删除数据
--a.普通删除指定数据
--删除一条指定数据
--1.删除student表中sid为1007的数据
delete
from student
where sid = 1007;
select * from student;
--删除多组数据
--2.删除student表中sid小于1005的所有数据
delete
from student 
where sid < 1005;
select * from student;

--b.通过子查询删除指定数据
--3.删除student表中成绩与sid为1005的学生相同的学生信息
delete
from student
where grade = (select grade
               from student
               where sid = 1005);
select * from student;

--delete与truncate
insert into student values(1001,'张三',18,92);
select * from student;
--delete删除表中数据,可以回滚
delete from student;
select * from student;
--truncate删除表中数据,直接提交
truncate table student;
select * from student;

drop table student;
--------------------------------------------------------
--数据库事务
--案例分析
--创建表格
create table student( 
 sid number(10) primary key,
 sname varchar2(20)
);
--数据测试
insert into student values(1,'张三');
insert into student values(2,'李四');
--设置保存点p1
savepoint p1;
select * from student;
--再次插入数据、修改数据
insert into student values(3,'王五');
update student set sname='hahabibu' where sid=2;
--设置保存点p2
savepoint p2;
select * from student;
--测试删除数据
delete from student where sid=3;
select * from student;
--如果出现异常可以回滚到设置的保存点
--a.回滚到记录点p2
rollback to p2;
select * from student;
--b.回滚到记录点p1
rollback to p1;
select * from student;
--提交事务 
commit;
Logo

一站式 AI 云服务平台

更多推荐