💖SQL语句
概述
1.SQL是用于访问和处理数据库的标准计算机语言
2.SQL指结构化的语言,全称是Structured Query Language
3.SQL是一种ANSI
(American National Standarsds Insitute 美国标准化组织) 标准的计算机语言.
SQL语句的特点
1.具有综合统一性,不同的数据库的支持的sql稍有不同
增删查改
常见数据库(mysql,sqlserver,oracle,db2)
2,非过程化语言
3.语言简洁,用户容易接受select,drop,alter,create,insert,update,select * from mayilkt_users----查询mayilkt_users的数据
4.集合性
SQL可以在高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理语句都接受集合作为输入,并且返回集合作为输出
💖数据库系统简介
存储数据的一种仓库, 数据库是一个以某种有组织的方式存储在硬盘上的数据集合, 数据库应用场景 javaweb项目 背后的数据都是存放在MySQL(互联网) |
早期存储数据—>临时变量(局部变量)—>随着方法调用而存在,随着方法调用结束而消失
后面- ->成员变量(非静态)–>随着方法对象的创建而存在,随着对象的创建完毕等待垃圾回收器回收而消失
容器---->数组---->长度固定(弊端)
—>stringBuffer—>字符串缓冲区中存储各种字符序列,它长度可变,但是stringBufrer使用完毕等待回收
->集合 >长度可变,它可以存储任意引用类型数据,使用完毕->也要被回收掉
—>10流---->永久存储,但是10流的太耗时了|
数据库存储数据-—>
1)存储空间非常大,可以存储百万条,千万条甚至上亿条数据,用户可以对数据库中数据进行新增,查询,更新,到除等
操作
2)数据独立性高
3)实现数据共享
4)减少数据的冗余度
5)通过数据库里面“事务“->实现数据的一致性以及维护性!
数据库的分类
- A关系型数据库(RDBMS)
1.Oracle数据库 (甲骨文公司) 收费的
2.MySQL数据库 (最流行的数据库) 免费版本 源代码开源
3.SQLServer数据库 (微软开发的数据库) c#(微软公司) windows
4.Sqlite (嵌入式关系数据库) 安卓手机端程序开发
5.db2
6.MariaDB和mySQL是同一个数据库引擎 - B非关系型数据库(NoSQL)
1.Redis (缓存数据库) 持久化存到硬盘
2.Mongoodb (文档数据库)
3.Elasticearch (搜索数据库)
4.Hbase (分布式,列示数据库)
SQL与数据库的关系
1.SQL是一种用于操作的数据库语言,SQL适用于所有关系型数据库
2.MySQL,Qracle,SQLSreber,DB2是一个数据软件,这些数据软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础上扩展自己的SQL语法,大部分的
3.NoSQL数据库都有自己的操作语言,对SQL支持的并不好
SQL属于 数据库编程语言
💖MySQL简介
- 简介
1.MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Sun公司又被Oracle公司收购,因此MySQL目前属于Oracle旗下产品.
2.MySQL所使用的SQL语言是用于访问数据库最常用标准语言,MySQL软件采用了双授权政策分为社区版(免费版本)和商业版(收费版),优于其体积小,速度快,总体拥有成本低,一般中小型网站的开发都选择MySQL作为网站数据库. - 特点
1.MySQL数据库是用C和C++语言编写的,以保证源码的可移植性
2.支持多个操作系统例如:Windows,Linux,Mac OS等
3.支持多线程,可以充分利用CPU资源
4.为多种编程语言提供API,包括C,Java,PHP,Python等
5.MySQL优化了算法,有效的提高了查询速度
6.M有SQL开放的源码代码且无版权制约,自主性强,使用成本低
7.MySQL历史悠久,社区用户非常活跃,遇到问题,可以很快的获得帮助
数据库基本操作
💕DDL
数据库模式定义语言DDL(Date Definition Language),是用于描述数据库中要存储的现实世界实体的语言
1.对数据库的创建,删除,修改操作
2.对表结构创建,删除,修改操作
创建数据库(database)
n多张不停的表结构
java_2211
…
数据库操作
查询
-- 查询所有数据库的名称
show databases;
-- 查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
-- 查询当前正在使用的数据库名称
select database();
-- 使用数据库
use 数据库名称;
创建
-- 创建数据库
create database 数据库名称;
-- 创建数据库,判断不存在,再创建:
create database if not exists 数据库名称;
-- 创建数据库,并指定字符集
create database 数据库名称 character set 字符集名;
删除
-- 删除数据库
drop database 数据库名称;
-- 判断数据库存在,存在删除
drop database if exists 数据库名称;
修改
-- 一般不对数据库修改操作,因为修改的安全性低,容易导致数据缺失
-- 修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
表操作
创建表
create table if not exists 表名(
列名1 数据类型1[长度] (字段约束),
列名2 数据类型2[长度] (字段约束),
列名n 数据类型n[长度] (字段约束)
-- 最后一列不要加,
);
use java_2211;
CREATE TABLE if not exists java_2211(
id INT,
name VARCHAR(20),
age int,
create_time date,
address VRACHAR(100)
);
修改
1.修改表名称
语法: alter table 表名 rename to 新的表名;
ALTER TABLE java_2211 RENAME TO java;
删除表
drop table 表名;
drop table if exists 表名;
数据类型
MySQL支出多种类型,大致分为三类:数值,日期/时间和字符类型.
- 日期和时间类型
表示时间值的日期和时间类型的DATETIME,DATE,TIMESTAMP,TIME和TEAR
- 字符串类型
- char(n)和varchar(n)中括号中n代表字符个数,并不代表字节数,比如说CHAR(30)就可以存储30个字符
💕DML
数据操作语句,用于添加,删除,更新和查询数据库记录,并检查数据完整性,常用的语句关键字包括insert,delete,udpate和select等.(0增添改查)
- DDL和DML的区别?
DDL对数据库 表结构 增加,修改,删除操作
DML表结构中的数据 增加(insert),修改(update),删除(delete),查询(select)
insert(添加)
INSERT INTO 语句用于向表格中插入新的行
语法格式:
INSERT INTO 表名称(列名1,列名2…) VALUES(值 1,值2…)
//插入数据列与值的顺序要一一对应.
INSERT INTO 表名称(列名1,…) VALUES(值1,…)
//插入数据与值的顺序需要一一对应
INSERT INTO表名称 VALUES(值1,值2…)
//向表中插入所有列
INSERT INTO student ( id, NAME, chinese, english, math )
VALUES
( 1, '行哥', 89, 78, 90 );
update(修改)
语法格式:
update 表名称 set 子段=值,…;
//直接修改整张表的所有行数据
update 表名称 set 子段=值, …where 条件
//根据条件查找对应行的数据 修改
UPDATE student SET `NAME` = '如花'
delete(删除)
语法格式
delete from 表名称 where 条件
//根据条件删除表中的数据
TEUNCATE java_2211
//清空表中所有数据
DELETE FROM student WHERE id =2
- TEUNCATE 与 delete 的不同?
truncate会清空表中所有的数据,速度快,不可滚动;实质是删除整张表包括数据再重新创建表;
delete逐行删除数据,每部删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
💖约束
- 什么是约束
用于限制表中的数据,为了保证表中数据的准确性和可靠性,不符合约束的数据,插入时就会失败,
约束条件在创建表时可以使用,也可以修改表的时候添加约束条件
约束作用
用于限制表中的数据,为了保证表中的数据的准确性和可靠性,不符合约束的数据,插入时就会失败.
约束分类
- NOT NULL:非空,用于保证该字段的值不能为空.
- DEFAULT: 默认值,用于保证该字段的有默认值.例如学生的性别
- PRIMARY KEY: 主键,用于保证该字段的值具有唯一性且非空,例如学生表的学生学号
- UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空.例如学生表的手机号等
- CHECK : 检查约束(MySQL)不支持,检查字段是否为指定的值
- FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,再从表添加外键约束,用于引用主表中某些的值.例如学生表的专业编号
主建约束
1.MySQL主建约束是一个列或者多列的组合,其值能唯一地标识表中的每一行,这样的一列或多列称为表的主建,通过它可以强制表的实体的完整性,同时可以方便根据主键查询该行数据
2.选取设置主建约束的子段 主建约束即在表中定义一个主建来唯一确定表中每一行数据的标识符,主键可是表中的某一列或者多列的组合,七种由多列组合的主键称为复合主键,主键应该遵循下面的规定
3. 每个表只能定义一个主键,主键值必须唯一标识表中的每一行,且不能为null,即表中不可能存在两行数据有相同的主键值,这是唯一性原则
4. 在创建表时设置主键约束 在CREATE TABLE语句中,主键是通过 PRIMARY KEY关键字来指定的
5. 当创建主键的约束时,系统会默认所在的列和列组合 建立对应的索引 方便提高查询效率
如果表中的 一列 主键-----单列主键
使用表中的 多个列 (id ,手机号码,身份证) 多列-多列主键(复合键)
条件: 一张表中只能够允许有一个主键,主键值 不能为空 主键保证 每行数据完整唯一
不允许重复的
mysql 查询高级知识 索引----索引 方便提高查询效率
- 添加单列主键
- 添加多列联合主键
使用主键约束 PRIMARY KEY
单列主键
- 定义字段时,指定单列主键
语法 :
CREATE TABLE 表的名称(
<字段名> <数据类型> PRIMARY KEY
)
CREATE TABLE `mayikt_users` (
`id` int PRIMARY KEY ,
`name` varchar(255) ,
`age` int
) ;
2.定义完字段之后,指定主键列(复合主键)
CREATE TABLE 表的名称(
…
CONSTRAINT 主键名称 PRIMARY key(主键列);
)
CREATE TABLE `mayikt_users` (
`id` int ,
`name` varchar(255) ,
`age` int,
CONSTRAINT pk1 PRIMARY key (id,phone)
) ;
联合主键
联合主键(复合主键) ,由多个列 (字段组成)
注意事项:
1.当主键是一个列组成时,不能够直接在字段名称后面声明主键约束;
2.一张表只能够允许一个主键
CREATE TABLE `mayikt_users` (
`id` int,
`name` varchar(255),
`age` int ,
`phone` varchar(11) ,
CONSTRAINT pk1 PRIMARY KEY (id,phone)
);
自定增长约束
设置自动增长
- 在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而又数据库系统根据定义自动赋值,没增加一条记录,主键自动增长
- 通过给字段添加AUTO_INCREMENT 属性来实现主键自增长
- 语法:
字段名 数据类型 AUTO_INCREMENT - 默认情况下,AUTO_INCREMENT的初始值是 1 每新增一条记录 字段值自动加1 一个表中只能有一个字段使用AUTO_INCREMENT约束,且该字段必须有唯一索引 一避免序号重复 (即为主键的一部分)
AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性
只能是整数类型(TINYINT SMALLINT INT BIGINT)
最大值受该字字段的数据类型约束,如果达到上限AUTO_INCREMENT就会失效
- 注意
- 一张表中只能有一个自动增长的字段
- 配合主键一起使用 并且值使用与整数类型
- 自动增长默认的初始值1,没增加一条记录 该字段的值就会增加1
drop table mayikt_users;
CREATE TABLE `mayikt_users` (
`id` int PRIMARY KEY AUTO_INCREMENT ,
`name` varchar(255),
`age` int ,
`phone` varchar(11)
);
自动增长设置初始值
默认自定增长初始值是从1开始
mysql指定自动增长字段初始值 1000-2000
1.创建表的时候指定
CREATE TABLE `mayikt_users` (
`id` int PRIMARY KEY AUTO_INCREMENT ,
`name` varchar(255),
`age` int ,
`phone` varchar(11)
)AUTO_INCREMENT=1000;
2.创建表之后修改自定增长开始值
alter table java_2211 AUTO_INCREMENT 2000;
delete与truncate删除数据的区别
delete删除数据后,自动增长还是会从最后一个删除数据的id基础上做自增;
truncate 清空数据后 自动增长是从初始值1开始
truncate 会清空表中所有数据 速度快 不可回滚 实质是删除整张包括数据再重新创建表
自动设定初始值 失效
delete 逐行删除数据 每步删除都是有日志的,可以回滚数据 实质是逐行删除表中的数据
非空约束
1.MySQL- not null 非空约束用于确保当前的值不为空; 在创建表时, 如果指定 not null 该字段在插入数据时 不允许 为空
2. 语法格式;
<字段名><数据类型> NOT NULL;
CREATE TABLE `mayikt_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int NOT NULL,
`phone` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
);
唯一约束
MySQL 唯一约束(Unique Key) 是指所有记录中该字段不能重复出现. 例如为 phone字段加上唯一性约束后 每条记录的 phone 值都是唯一的 不能出现重复的情况,唯一约束可以允许null
主键约束 满足唯一性且值不允许为null
一张表结构中只允许有一个主键约束 但是可以有多个唯一约束
例如手机号码是唯一约束,每条激励的手机号是不允许重复且保证 唯一
- 语法
UNIQUE KEY 约束名称(约束字段)
CREATE TABLE `mayikt_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`age` int DEFAULT NULL,
`phone` varchar(11) ,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_phone` (`phone`) -- 指定约束名称和约束字段
);
2.在修改表时添加唯一约束
语法
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
3.删除约束
ALTER TABLE java_2211 DROP INDEX unique_phone;
默认约束
默认值(Dafault) 的完整称呼是"默认值约束(Default Constraint)", 用来指定某列的默认值. 在表中插入一条新纪录时, 如果没有为某个字符段赋值 系统就会自动为这个字段插入默认值 其种, "默认值"为该字段设置默认值,如果字符类型的 要用单引号括起来
1.再创建表时设置默认值约束
<字段名> <数据类型> DEFAULT <默认值>;
CREATE TABLE `mayikt_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT 'mayikt',
`age` int DEFAULT 1,
`phone` varchar(11) ,
PRIMARY KEY (`id`)
);
2.在修改表时添加默认值约束
ALTER TABLE <数据名>
CHANGE CONLUMN<字段名> <数据类型> DEFAULT<默认值>;
零填充约束
定义了数据类型的长度 如果实际位数小于定义的长度 显示时会在左边用0填充
语法
id int(10)
id =1
0000000001
😘外键约束
foreign key 是表的一个特殊字段,经常与主键约束一起使用.
两表关联: 相关字段中主键所在表就是主表
外键所在表就是从表
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性
注意事项:
1.主表删除某条记录时,从表与之对应的记录也必须有相应的变化
2.一个表可以有一个或多个外键
3.外键可以为空值,若不为空值则必须等于主表中主键的某个值
定义外键时有下规定:
1.主表必须已经存在于数据库,(或是正在创建的表,则主表和从表是同一个表,这样的表称为自参考表,这种结构称为自参考完整性)
2.主键中不能包含空值,但允许在外键中有空值.
- 创建外键约束
[constraint <外建名>] foreign key 字段名
references<主表名> 主键列
💕DQL
1.DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息,在查询的过程中,需要判断所查询的数据与表之间的关,我们可以使用select语句来查询数据。
select * from 表的名称 where 查询的条件
DML与DDL区别?
DDL 对数据库 表结构 增加、修改 删除操作
DML 表结构中的数据 增加(insert)、修改(update) 删除(delete)
2.查询语句语法格式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] …
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]
[limit <数字或者列表>]
分页、分组、排序
select *(列名称) from 表名称 where 条件
1.查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件;
2.SELECT 命令可以读取一条或者多条记录;
3.使用星号()来代替其他字段,SELECT语句会返回表的所有字段数据
4.使用 WHERE 语句来包含任何条件。
5.使用 LIMIT 属性来设定返回的记录数。
6.OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
3.数据的初始化
-- 创建数据库 ddl
create DATABASE if not EXISTS mayikt;
-- 使用mayikt数据库
use mayikt;
drop table mayikt_student;
-- 创建mayikt_student学生表
CREATE TABLE `mayikt_student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(10) not null COMMENT '姓名',
`age` tinyint COMMENT '年龄',
`address` varchar(255) COMMENT '地址',
`class_id` int COMMENT '班级id',
PRIMARY KEY (`id`)
);
-- 新增测试数据 dml
INSERT INTO mayikt_student VALUES(NULL,'余胜军',28,'湖北武汉','01');
INSERT INTO mayikt_student VALUES(NULL,'小哈',21,'上海','01');
INSERT INTO mayikt_student VALUES(NULL,'张三',17,'北京','02');
INSERT INTO mayikt_student VALUES(NULL,'李四',22,'山东','02');
INSERT INTO mayikt_student VALUES(NULL,'王麻子',11,'四川','02');
基本查询
-- 1.查询所有的学生
SELECT * FROM `teststudent`; -- 查询全表
-- 2.查询学生的姓名和年龄
SELECT
`NAME`,age
FROM
teststudent
-- 3.别名称查询 使用关键字as
SELECT
`NAME` AS '姓名',age '年龄'
FROM
teststudent
-- 4.列别名称
SELECT
`NAME` AS '姓名',age '年龄'
FROM
teststudent
-- 5.去重复值
SELECT
DISTINCT age
FROM
teststudent
-- 6.查询结果是表达式(运算值);将所有的学生年龄+5岁
SELECT
age+5
FROM
teststudent
运算符
建索引:一般在 where 及 order by 中涉及到的列上建索引,尽量不要对可以重复的字段建索引。
尽量避免在 where 中使用 !(<>)或 or,也不要进行 null 值判断。
尽量避免在 where 中对字段进行函数操作、表达式操作。
尽量避免使用 like- %,在此种情况下可以进行全文检索。
- 算数运算符
/ 或 DIV 除法
% 或 MOD 取余 - 比较运算符
<> != 不等于
BETWEEN 在两值之间 >=min && <=max
not between 不在两值之间
in 在集合中
not in 不在集合中
<=> 严格比较两个null值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
like 迷糊匹配
regexp 或 rlike 正则式匹配
is null 空
is not null 不空 - 逻辑运算符
NOT 或者 ! 非
AND 与
OR 或
XOR 异或
排序
- order by 根据字段(数字,字母,汉字)升序或者降序,再返回结果;
- asc 升序(默认);
- desc 降序;
- 支持单字段,多字段
- 放在语句最后面,limit除外!
-- 1.根据学生年龄从小到大;
SELECT
*
FROM
teststudent
ORDER BY age;
-- 2.根据学生年龄从大到小;
SELECT
*
FROM
teststudent
ORDER BY age DESC;
-- 3.判断学生的年龄大于18岁,在从小到大排序
SELECT
*
FROM
teststudent
WHERE
age>18
ORDER BY age;
-- 4.根据学生的年龄从大到小排序,以班级id 从小到大排序 当年龄相同 则根据 班级id从小到大排序
SELECT
*
FROM
teststudent
ORDER BY age DESC,id;
-- 5.根据班级id去重,根据班级id从大到小排序
SELECT
DISTINCT age
FROM
teststudent
ORDER BY age DESC;
分页(limit)
格式:
select 字段1,字段2… from 表名 limit m,n
m: 整数,表示从第几条索引开始
计算方式: (当前页-1)*每页显示条数
n: 整数,表示一页查询多少条数据
1.查询用户表中前5条数据
SELECT * from mayikt_student limit 5;
2.从第6条开始显示 显示5条
SELECT * from mayikt_student limit 5,5;
聚合查询
对列的值计算,返回单一的值
聚合函数 | 作用 |
---|---|
count(age) | 统计指定不为null 的记录数行数 |
sum() | 指定列数据和 |
max() | 指定列数据最大值 |
min() | 指定列数据最小值 |
avg() | 指定列数据平均值 |
-- 1.查询学生表的总人数
SELECT count(*) FROM teststudent;
-- 2.查询学生年龄大于18的 总人数
SELECT count(*) FROM teststudent WHERE age>18;
-- 3.查询classid=1 所有学生年龄总和
SELECT sum(age) FROM teststudent WHERE id>1;
-- 4.查询学生最大年龄
SELECT max(age) FROM teststudent ;
-- 5.查询学生最小年龄
SELECT min(age) FROM teststudent ;
-- 6.求学生年龄的平均值
SELECT avg(age) FROM teststudent ;
对null 的处理
is null/is not null
-- 1.查询学生年龄为null总人数
SELECT count(*) from mayikt_student where age is null;
分组查询(group by)
格式:
select 字段1,字段2…from 表名称 group by 分组字段 having 分组条件
SELECT
`NAME` 姓名,
chinese 语文
FROM
student1
GROUP BY chinese
- 注意
返回列只能是分组字段或者聚合函数;
分组之后对统计结果筛选只能用having - 执行顺序
from----group by----count----having
😘多表关系
一对一
一个学生只有一张身份证
一对多
- 一个学生属于一个班级,学生信息表与班级表一一对应
- 在表中添加一个外键,指向另一方主键,确保一对一关系
多对多
学生和课程
一个学生可以选择多门课程,一个课程也可以被很多学生选择
联表查询
交叉连接查询(笛卡尔乘积)
查询结果是两张表的笛卡尔积,数据很冗余
很少使用
-- 语法
select * from 表1,表2
内连接查询
- 显示内连接
select * from A inner(可以省略) join B on 条件;
- 隐式内连接
select * from A,B where 条件;
外连接查询
** 外连接**
- 左外连接
SELECT
*
FROM
employee
LEFT JOIN dept ON employee.dept_id = dept.id UNION
SELECT
*
FROM
dept
RIGHT JOIN employee ON employee.dept_id = dept.id
查询结果是左边A的全部信息和A,B的交集
- 右外连接
select * from A right outer(可以省略) join B on 条件;
查询结果是右边B的全部信息和A,B的交集
- 全外连接
select * from A left join B on A.id=B.id
union
select * from A right join B on A.id=B.id;
union 操作符用于连接两个以上的select语句的结果组合返回一个集合中,两个表中的空值都会返回
子查询
基本子查询
子查询指查询语句嵌套,先做子查询,子查询的结果作为外层另一个条件的查询过滤条件
关键字
- all
关键字用于比较操作符的后面,表示查询结果的多个数据中所有满足该比较操作符才算满足(=,>,!=,>=,<=等) - any
底层多个and,多个or比较 - not in和in
in关键字 用于判断某个记录的值 是否在指定的集合中
not in 取反 - 关键字exists(推荐)
检查子查询是否至少会返回同一行数据,该子查询实际上不返回任何数据 而是返回ture或false
表自关联
自己关联自己
MySQL的事务
事务必须满足四个条件(ACID):
1.原子性(Atomicity): 一个事务中的操作,要么全部完成,要么不完成,不会结束在中间环节.事务执行过程中发生错误,会被回滚到事务开始前的状态.
2.一致性(Consistency): 在事务开始之前和结束之后,数据库的完整性没有被破坏.这表示写入的数据必须完全符合所有的预设规则,这包含数据的精确度,串联性以及以后续数据库可以自发性地完成预定的工作.
3.隔离性(Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致.事务的隔离性分为不同级别: 未提交(Read uncommitted), 读提交(Read committed), 可重复读(repeatable read)和串行化(Serializable)
4.持久性: 事务结束后,对数据的修改就是永久的,即便系统故障也不会丢失