【mysql总结】

一、数据库引言
需求:存储一条数据 荆轲-18-1001

1. Java程序中:借助jvm内存的变量,对数据进行存储

(1) 将数据存储在对应的变量:局部变量、成员变量(对象)、数组、集合
栈空间(局部变量)、堆空间(对象)
(2) 缺点:利用jvm内存存储数据,jvm一旦关闭,则空间被回收,空间数据丢失;
这种存储方式为一种临时的存储方式

2. 利用io流技术,将数据存储在文件中:借助 io

(1) 利用io的输入流将内容读取到程序中,利用输出流将程序中数据写入到文件中
(2) 优点:数据可以持久化
(3) 缺点:
a. 数据不安全
b. 文件中的数据类型单一,统一的数据类型处理为 String
c. 文件存储的数据量小
d. 文件不支持多线程操作(不支持多用户)

二、数据库

1. 数据库: Database ,简称 DB ,是存储、管理数据的一种软件(提供对数据的增删改查等操作)
2. 数据库的工作模式:数据库服务端 (server)- 客户端 (client) ,简称为 C/S 工作模式
(1) 数据库的客户端:发送指令
(2) 数据库的服务端:接收指令并执行指令
注意:一个数据库的服务端同时可以对应多个数据库的客户端

3. 数据库的分类

(1) 关系型的数据库:
a. oracle:oracle公司(甲骨文),收费
b. mysql:mysql公司,被sun公司收购,后又被oracle收购,免费
c. db2:IBM
d. SqlServer:微软
(2) 非关系型的数据库:
Memcache 、 MogoDB redis

4. 数据库常见的概念:

(1) 表:table,用于存储数据
employees:员工表,存储员工的信息
dapartments:部门表,存储公司的部门信息
locations:位置表,存储了部门所在城市的信息
(2) 行:row,代表一条数据
(3) 列/字段:colum,代表当前列数据的含义
三、 mysql 数据库的安装
1. 安装 mysql 服务:
安装 Mysql 程序
安装路径必须是英文路
计算机名字名字不能是中文(先改为英文,再安装mysql)
安装需要用户数据密码,需要记住,后期用到
正常启动 mysql服务,可以接收外部访问
操作:计算机-->右键-->管理-->服务和应用程序-->服务-->mysql
关注的服务:mysql

2. mysql常用的客户端:

(1) 自带 :mysql数据库安装后自带的数据库客户端,作为了解的操作方式
(2)第三方客户端:navicat,简称大黄
四、 SQL
SQL:Structure Query Language ,结构化查询语言。
作用:操作(查询、修改)数据库中某个用户下表中的数据
五、 mysql 中的基本查询语句
select .... from 表名
a. 确定数据的来源:from
b. 确定查询的字段(列):select
1. 查询表中部分字段内容
(1) 语法:select 字段名1,字段名2,字段名3 from 表名
(2) 案例:-- 从员工表中查询员工工号、名、工资
select employee_id,first_name,salary from employees;
(3) 注意:每一个字段之间用逗号隔开,最后一个字段无需加逗号
2. 查询表中所有字段的内容
(1) 第一种解决方案,将表中所有的字段一一罗列进行查询
-- 查询员工表中所有字段内容(11列)
select employee_id,first_name,last_name,email, ... from employees
(2) 第二种解决方案:
select * from employees;
a. * 代表表中所有的字段
b. 使用*优缺点:
I. 方便查询所有字段内容
II. 使用*查询相对效率低
注意:实际开发时,*可读性不高,同时查询效率相对较低,不建议使用
3. 对列起别名 :as
(1) 语法:select 字段名,字段名2 as 别名,字段名3 别名 from 表名
(2) 注意:起别名时 as可以省略
(3) select employee_id 工号,first_name as 名,salary from employees
4. 字符串的拼接: concat
(1) 语法:select 字段名,concat(字段名1,字段名2,'常量字符串') from 表名
(2) 注意:mysql中的concat可以将多个字段拼接在一起;
字符串常量可以使用单引号或是双引号引起来
(4) -- 查询员工表中所有的员工 工号、姓名、工资信息
select employee_id,concat(first_name,"...",last_name) 姓名,salary from employees
5. 对查询的结果内容进行运算
(1) 常见的运算:+ - * / 等
(2) -- 查询员工的工号、名、工资、年薪
select employee_id,first_name,salary 月薪,salary*12 年薪,salary/30 日薪 from
employees
(3) 注意:
a. 在计算除法时,分母不能为0,否则结果为 null
b. 数值类型可以应用 + - * /等计算
6. 条件查询 ( 过滤查询 ) where 【开发重点】 不等值的判断
(1) 语法:select 字段名1,字段名2 from 表名 where 过滤条件
(2) 作用:对查询的每一条数据都进行条件判断,对符合过滤条件的数据存放到查询结果中
(3) 等值判断:
-- 查询工资是17000的员工工号、姓、收入。
select * from employees where salary=17000
注意:mysql中的判断是否等于 应用 =;区分于 java中等值判断(==)
-- 案例2:查询姓King的员工。
select * from employees where last_name='King'
(4) 不等值判断:!= > >= < <=
-- 查询工资 大于 10000的员工信息
select * from employees where salary>10000
(5) 多条件查询:and(并且) 、 or(或)
-- 查询工资在 10000到20000的员工信息
select * from employees where salary>10000 and salary <20000
等价于 java中的 &&(与) ||(或)
(6) 区间查询:between 起始值 and 终止值
a. 语法:select 字段名,字段名2 from 表名 where 字段 between 起始值 and 终止值
b. 案例:
-- 查询工资在 10000到20000的员工信息
select * from employees where salary>=10000 and salary <=20000
-- 第二种解决方案
select * from employees where salary between 10000 and 20000
注意:between 起始值 and 终止值是包含边界值;
较大数据在后面,小数据在前面
(7) 枚举查询(一一列举): in(值1,值2,值3)
a. 语法:select... from 表名 where 字段名 in(值1,值2,值3)
b. -- 查询60、70、80号部门员工的信息 - 40
select * from employees where department_id=60 or department_id=70 or
department_id=80 -- 代码冗余
select * from employees where department_id in(60,70,80)
(8) 对null值处理:is null 、 is not null
-- 查询员工表中没有提成员工信息 -- 72(commission_pct字段为 null)
select * from employees where commission_pct is null
-- 查询员工表中有提成员工信息-- 35
select * from employees where commission_pct is not null
(9) 模糊查询:like
a. 语法:select 字段1,字段名2 from 表名 where 字段名 like '字符串格式'
b. 常见的字符串格式为:字符串常量、通配符
select * from employees where last_name like 'King'
c. 常见的通配符:
_:代表任意一个字符 %:代表 0~n个任意的字符
d. 常见的通配符字符串:
以 a 开头 : like 'a%' haha(不符合) a(符合) ahah(符合)
以 a 结尾: like '%a' haha(符合) a(符合) ahah(不符合)
包含 a字符: like '%a%' haha(符合) a(符合) ahah(符合)
判断某个字符串是否为3位: like '___'
判断某个字符串中至少有3位: like '%___%'
判断某个字符串中包含 i字符,i字符前面有3位,后面有2位:like '___i__'
-- 查询姓以 K 开头的员工。
select * from employees where last_name like 'K%'
-- 案例2:查询员工表中姓长度为4的员工信息。(工号、名字、姓、薪资)
select * from employees where last_name like '____'
-- 查询员工表中姓的倒数第3个符号是a的员工信息
select * from employees where last_name like '%a__'
-- 查询员工表中姓长度为8,倒数第三个符号位a的员工信息。
select * from employees where last_name like '_____a__'
7. 排序: order by 【重点】
(1) 语法:select 字段名1,字段名2 from 表名 where 过滤条件 order by 字段名 排序规则
(2) 排序规则:
a.升序:asc , 默认(如果不指定排序的规则,则默认为升序)
b.降序:desc
(3) -- 查询所有的信息,按照工资从高到低进行排序 -- 降序(desc)
select * from employees order by salary desc
-- 查询员工工号,名字,薪资信息,按照salary升序排序,如果salary一样,按照工号降序展示
select employee_id,first_name,salary from employees
order by salary asc,employee_id desc
-- 查询工资大 10000 的员工信息,并且按照工资降序进行排列
select * from employees where salary>10000 order by salary desc
补充:dual哑表
(1) dual:不代表任何一张表,没有实际开应用业务,内部只有一行一列的一张表
(2) 查询当前系统时间
select now() from dual
(3) 出现的场景:当要查询的数据不来自于任何一张表时,为了补充select .. from语法完整性,
可以使用 dual哑表进行填充
六、函数
函数:执行特定功能的一段代码块
1. 单行函数:
(1) 单行函数:只要有一条数据,执行一次,同时会产生一个对应结果
注意:单行函数作用在每条数据上,有几条数据,就执行几次
(2) -- 查询每个员工的 名的长度
select employee_id,first_name,length(first_name) from employees
-- 查询当前系统时间
select now() from dual
(3) 常见的单行函数:
length('字符串')/length(字段名) 获取字符串长度
now():获取当前系统时间
2. 组函数:
(1) 组函数:作用在提前分好的一组数据上,只要有一个小组数据,则组组函数就执行一次
(2) 常见组函数:
sum(列名) :对指定列进行求和
avg(列名): 对指定列进行求平均
min(列名):对指定列求最小值
max(列名):对指定列求最大值
注意:如果使用组函数时,没有对表中数据进行分组,则整张表默认为一个小组
-- 查询员工表中最高工资
select max(salary) from employees
-- 查询员工表中的平均工资
select avg(salary) from employees
注意:这四个组函数在计算时,会忽略null值(null处理为0)
(3) 组函数:count(列名)
a. 作用:对查询结果中指定字段/列不为空数据进行统计(数据结果不为null)
b. 案例:
-- 查询员工表中的员工的人数
select count(employee_id) from employees
-- 查询 员工表中 有提成的员工的人数
select count(commission_pct) from employees
c. 统计数据产生条数:count(*)
select count(*) from 表名
注意:以上组函数可以应用在 having过滤中,但是不能使用在 where过滤条件中
七、分组: group by
1. 语法:
select 字段名1,字段名2 from 表名 where 过滤条件 group by 分组的依据 order by 排序规则
--> select ... from ... group by 分组的依据
2. 案例:
-- 查询各个部门的最高薪资
-- 1. 分组的依据:部门的id department_id
-- 2. 根据需求使用组函数:max(salary)
select max(salary) from employees group by department_id
-- 统计 各个岗位的人数
-- 1. 确定分组的依据:job_id
-- 2. 根据需求确定组函数:count(*)/count(employee_id)
select job_id, count(*) from employees GROUP BY job_id
注意:将查询依据字段写在 select后面,提高查询结果的可读性
-- 案例3:统计各个部门各岗位的平均工资
-- 1. 确定分组依据:department_id ,job_id
-- 2. 根据需求确定使用的组函数:avg(salary)
select department_id ,job_id, avg(salary) from employees
GROUP BY department_id ,job_id
语法:
select...from 表名 where 过滤条件 group by ... order by 字段名 asc|dedsc
执行顺序:
from:确定数据的来源
where:对原始数据进行条件过滤(判断),符合过滤条件留下
group by:根据需求进行分组
select :确定查询的内容
order by:根据指定的字段及规则进行排序
3. having
(1) 语法:
select... from... where 对分组之前数据过滤
group by ... having 对分组之后的数据过滤 order by...
(2) 作用:having对分组之后的数据进行过滤,作用在 group by的后面
(3) 注意:在having 中可以使用组函数
(4) -- 统计各部门的平均工资,只显示平均工资超出10000的。
-- 1. 确定分组的依据:department_id
-- 2. 根据需求确定使用组函数:avg(salary)
-- 3. 根据需求:需要过滤,avg(salary)>10000 where
select avg(salary) from employees GROUP BY department_id having avg(salary)>10000
-- 2. 统计 各个岗位的人数,显示人数小于3的结果
-- (1) 确定分组的依据:job_id
-- (2) 根据需求确定使用组函数:count(*)
-- (3) 过滤:根据需求确定使用 是having 过滤(对分组之后的结果过滤)
select job_id, count(*) from employees group by job_id having count(*)<3
-- 3. 统计部门80、90的总工资及部门id。
-- 1). 确定分组的依据:departemt_id
-- 2). 确定组函数:sum(salary)
-- 3). 过滤:根据需求确定使用 where?having
第一种解决方案:采用 having过滤
select department_id, sum(salary) from employees GROUP BY department_id
having department_id in(80,90)
第二种解决方案:采用 where过滤
select department_id, sum(salary) from employees where department_id in(80,90)
GROUP BY department_id
(5) 面试题目:简述 where和having的区别。
a. where 对分组之前的数据进行过滤
having对分组之后的数据进行过滤
b. having中可以使用组函数
where中不能使用组函数
c. 如果 进行过滤时,where和having过滤都可以时,建议使用where过滤,提高效率
d. 只有对分组之后的结果进行过滤时,才使用having
八、子查询
1. 子查询:在一个查询语句执行过程中,使用了另一个查询语句的结果
(1) 子查询:简单理解为在一个select语句中嵌套另一个select语句
(2) 定义在外面的 select称为主查询
定义在里面的 select称为子查询
2. 第一种情况:子查询的结果为单个值 ( 一行一列 ) 【关注】
(1) 如果子查询的结果为单个数值,可以直接将子查询的结果作为主查询的过滤条件
(2) 案例:
-- 查询工资大于平均工资的员工信息。
-- 1. 求平均工资
select avg(salary) from employees -- avgSalary
-- 2. 从employees表中过滤 salary>avgSalary 员工
select * from employees where salary> avgSalary
-- 3. 合成sql
select * from employees where salary>(select avg(salary) from employees)
-- -- 查询 工资 为最高的员工信息
-- 1. 获取最高工资
select max(salary) from employees -- maxSalary
-- 2. 从employees 过滤 salary= maxSalary
select * from employees where salary = maxSalary
-- 3. 合成sql
select * from employees where salary = (select max(salary) from employees)
3. 第二种情况:子查询的结果为 N 1 用枚举
(1) 如果子查询结果为多行1列时,可以将结果直接参与主查询的 in运算(枚举运算)
(2) -- 查询与姓‘King’在同一部门的员工信息(工号,名字,薪资,部门id)
-- 1. 查询 姓 'King'所在的部门 -- 80 和 90
select department_id from employees where last_name='King'
-- 2. 从 employees 表中查询部门编号 为 80 或 90
select employee_id,first_name,salary,department_id from employees where
department_id in(80,90)
-- 3. 合成sql
select employee_id,first_name,salary,department_id from employees
where department_id in(select department_id from employees where last_name='King')
4. 第三种情况:子查询的结果为 多行多列 (N N ) 【了解】
select *from
(select * from employees order by salary desc)e -- 查询结果为多行多列,虚表
limit 0,5
注意:需要对子查询的虚表进行起别名, 表名 别名
select * from employees empl
九、分页查询 【开发应用重点】
1. 应用场景:将数据库中查询的结果按照 每页显示的条数进行查询 ( 起始条数 )
2. 语法:
select...from 表名 where...group by..having..order by... limit m,n
参数说明:
m:代表查询的起始条数,默认为查询的结果进行编号,编号从0开始
n:代表 查询的条数
3. 案例
-- 查询工资最高的前5名员工信息 -- 第一页
select * from employees order by salary desc limit 0,5
select * from employees order by salary desc limit 5
注意:如果查询的起始条数从0开始,可以省略
-- 查询工资最高的前6~10名员工信息 -- 第二页
select * from employees order by salary desc limit 5,5
-- 查询工资最高的前11~15名员工信息 -- 第三页
select * from employees order by salary desc limit 10,5
select * from employees -- 员工表,共 107条数据,11列
select * from departments -- 部门表,共27条,4列
select * from locations -- 位置表,23条,6列
十、表连接
1. 表连接:查询的内容来源于 2 张表或是 N 张表时,需要将 2 张或是 N 张表连接成一张大表进行查询
注意:进行2张表或是多张表进行连接时,一定注意连接条件
2. 表连接的结果:
(1) 表连接之后的字段数等于所有字段数之和
(2) 连接之后的行数取决于 表连接类型
(3) 当表连接时,如果出现字段冲突,对表进行起别名处理
3. 表连接的 分类:内连接、外链接 ( 左外连接、右外连接 )
4. 内连接 【重点】
(1) 语法:
select 字段名1,字段名2 from
表名1 [inner] join 表名2 on 连接条件
where .... group by ... having... order by...
(2) 特点:
a. 必须指定合理的连接条件
b. 左表+右表同时符合连接条件的数据,留下 以join 划分
c. 不管左表还是右表,只要不符合连接条件,都不会被查询
(3) -- 查询员工的工号、姓、收入、所在部门编号、所在的部门名称。
select employee_id,last_name,salary,e.department_id,department_name
from employees e join departments d on e.department_id = d.department_id
注意: inner 可以省略;一定注意表别名
重名字段
5. 外连接
(1) 左外连接(left [outer] join) 【重点】 outer 可以省略不写
a. 语法:
select ... from
表名1 left join 表名2 on 连接条件
...
b. 特点:
I. 左外连接以左表为主,只要在左表中出现的数据,结果中会留下
II. 最终的数据:左表+右表同时符合连接条件的数据,再加左表中不符合条件的数据
III. 注意:右表如果没有匹配成功的数据,则不留
c. -- 左外连接
select employee_id,last_name,salary,e.department_id,department_name
from employees e left join departments d on e.department_id = d.department_id
(2) 右外连接(right [outer] join)
a. 语法:
select .. from
表名1 right join 表名2 on 连接条件
....
b. 特点:
I. 右外连接以右表为主,只要在右表中出现的数据,结果中留下
II. 最终的数据:左表+右表同时符合连接条件的数据,在加上右表中不符合连接条件的数据
III. 注意:左表如果没有匹配成功的数据,则不留
c. 案例:
select employee_id,last_name,salary,e.department_id,department_name
from employees e right join departments d on e.department_id = d.department_id
6. 多张表的连接
(1) 可以将3张及以上表进行连接,两两依次连接
(2) -- 查询员工的工号、姓、部门名称、所在位置
select employee_id,last_name,department_name,city
from employees e join departments d on e.department_id=d.department_id
join locations l on d.location_id=l.location_id
十一、创建数据库 [ 了解 ]
语法:create database 数据库名
案例:create database demo
注意:新建的数据库名为 demo
十二、创建表
1. 建表语法: 【了解】
create table 表名(
字段名 数据类型 [约束] [默认值],
字段名 数据类型 [约束],
字段名 数据类型
)
注意:最后一个字段后面不加 逗号
例如:自定义完成 表创建
create table aa(
ad_id int primary key,
adName varchar(50) not null,
privce double,
email varchar(255)
)
-- 通过navicat工具创建(会这种即可,能看懂以下库表)
CREATE TABLE `aa` (
`ad_id` int(11) NOT NULL,
`adName` varchar(50) NOT NULL,
`privce` double DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ad_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
为字段添加唯一约束:
为字段添加外键:
2. 常用数据类型:【了解】
(1) 数值类型:
int :整数,4B,存储数据的范围 -2147483648~2147483647
double:小数,双精度,8B
(2) 字符串类型
a. char(n):固定长度的字符串
char(5):字符串长度为,'abc'利用空进行填充,实际长度为5
b. varchar(n):不固定长度的字符串
varchar(5):'abc',实际长度为3
存储:手机电话(固定长度为11位,char(11))
账户用户名(字符个数不固定,varchar(50))
身份号(固定长度18位,char(18))
(3) 日期类型:
date:年月日,默认格式为 YYYY-MM-DD.
datetime:年月日时分秒,YYYY-MM-DD HH:MM:SS 精确到秒
TIMESTAMP: 年月日时分秒,时间戳
(4) 布尔类型:mysql中不支持
a. 利用 int 中 1代表 true; 0 false
b. 利用 char(1) 中'y' 代表 true, n 代表false
c. 利用 char(3) 中 '是' 代表 true, '否'代表 false
注意:utf-8中汉字占 2~3个字节
3. 默认值
(1) 作用:标识该字段不给数据时,系统会根据指定的内容默认赋值
(2) 语法:
字段名 数据类型 default 值
(3) 注意:
指定默认的值,必须和该字段的数据类型相一致
4. 约束 【理论重点:面试】
(1) 主键约束:primary key , pk 主键列
a. 作用:用于标识表中每一行数据,例如:学号|工号|id等
b. 特点:唯一、非空
c. 语法:字段名 数据类型 primary key
d. 注意:实际开发时,通常每一张表都会设置一个主键列
(2) 唯一约束:unique ,un
a. 作用:用于标识该字段中的内容不允许重复,例如身份号、电话
b. 特点:唯一、可以为空
c. 语法:字段名 数据类型 unique
(3) 非空约束:not null , nn
a. 作用:用于标识该字段的内容不能为空,必须有内容,例如:学生名
b. 特点:不能为空、可以重复
c. 语法:字段名 数据类型 not null
(4) 外键约束:简称 fk
a. 作用:用于标识当前字段的值不能随意输入,需要跟从于另一张表的 主键列 或是唯一列的值
b. 注意:设置外键列的表被称为从表;被从表指定的表称为主表
从表中的外键列数据 跟从于 主表中的指定列中的数据
c. 特点:可以重复、可以为空(null)
d. 语法:references 主表表名(主表中主键列名/唯一列列名)
十三、增删改 【开发应用重点】
1. 增:往数据库表中添加一条数据, insert into
(1) 语法:insert into 表名 (字段名1,字段名2,字段名3) values (值1,值2,值3) -- 部分字段赋值
(2) 注意:
a. 此种语法可以对表中的部分字段赋值,但是选择的字段中必须包含表中主键列和非空列
b. 后面给定值的顺序、数据类型、个数需要和前面字段一致
c. 给定值时,需要遵循对应字段约束(唯一、非空、主键、外键)
d. 前面指定字段的顺序和表中字段顺序没有强制要求
(3) 案例:
insert into t_student (stu_id,stu_name,sex,email,birthday,cardNum,cls_id)
values(13,'欢欢',2,'hh@qq.com','2000-10-27','6867868',3)
insert into t_student (stu_id,stu_name,sex,birthday,cardNum,cls_id)
values(14,'亮亮',1,'2001-10-27','68678643',4)
(4) 语法2:insert into 表名 values(值1,值2,值3) --给所有的字段赋值
a. 注意:此语法必须为表中所有的字段一一赋值
b. ()中给的值顺序、个数、数据类型取决于 表结构
c. insert into t_student values(15,'淋雨',2,'aa@qq.com','2010-8-12','9898892',4)
(5) 增强添加语法:
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true"
keyProperty="id">
insert into t_student(name,age,qq,phone,.....) values(#{name},.......)
</insert>
实际是两个操作,先找到id 再把找到的ID 和 学生的其他属性一起插入数据库
利用工具对主键自动维护唯一性:【开发阶段重点,实际开发还可以采用UUID等算法进行维护主键唯一性】
insert into t_student (stu_name,sex,email,birthday,cardNum,cls_id)
values('欢欢',2,'hh@qq.com','2000-10-27','6867868',3)
2. 删:从数据库表中删除指定的数据
(1) 语法:delete from 表名 where 过滤条件 -- 删除符合过滤条件的数据
(2) 注意:删除数据时,根据开发需求指定过滤条件,如果没有加过滤条件,删除表中所有的数据
(3) -- 给定一个删除指定id对应的数据
delete from t_student where stu_id=16 -- 采用唯一主键删除,等值判断最多删除一条
注意:如果没有符合过滤条件的数据,则不删除任何一条数据
-- 删除 性别为男的信息
delete from t_student where sex=1
-- 删除班级
delete from t_clazz where cls_id=3
如果被删除的主表中的数据被从表占用,则不能直接删除,解决方案分为以下两种:
-- 第一个解决方案:删除被占用的子项中的对应数据(直接删除调用当前班级的学生)
delete from t_student where cls_id=3
-- 第二种解决方案:先将占用的子项中对应的数据修改到其他的数据上
-- 先将学生调整其他班级中,清空当前班级学生
update t_student set cls_id = 1 where cls_id=3
delete .....
3. 修改: update, 将指定数据内容进行修改
(1) 语法:update 表名 set 字段名 = 新值,字段名2=新值2 where 过滤条件
(2) 案例:update t_student set sex=1,stu_name='浩浩' where stu_id=11
(3) 注意:
a. 修改的新值需要对应字段数据类型
b. 修改时需要遵循字段约束
扩充
(1) 如果 delete的过程没有加过滤条件,则将指定表中所有的数据删除
delete from 表名
注意:对表中的所有数据进行一条条删除(删除数据效率相对低);表结构依然存在
(2) 本质: 直接将存储表数据部分的空间,直接清除,进而删除数据[非DML]
语法:truncate table 表名
特点: 效率远远高于delete
(3) 删除表:drop table aa
将表中的数据删除的同时,表结构也被删除
十四、事务【理解重点】
1. 事务:通常由一条或是多条 sql 组成,这多条 sql 看成整体,如果执行所有事务中 sql 都执行,事务执行成功,提 交事务(commit); 只要有一条 sql 没有执行成功 ( 或是没有执行到 ) ,事务执行失败 ( 撤销已经执行过的 sql) ,回滚事 务(rollback)
事务在开发中是最小执行单元;
在navicat中以一条sql为一个事务,执行一条sql自动完成提交,需要设置为手动控制事务时,执行
set autocommit=false,可以利用 commit和 rollback让客户端应用者自己控制事务提交的时机
类似于 coreJava 原子操作。
2. 事务执行的原理
数据库会为每一个客户端都分配一个独有的回滚段,如果客户端发送的为insert/delete/update操作时,
先将操作的结果存储在客户端对应回滚段中,如果执行到 commit,将客户端对应回滚段中的数据同步到数
据库中,但是如果执行到 rollback(回滚),则将回滚段中的数据撤销,此时数据库不会被同步撤销结果,
被回滚的数据结果不会被其他客户端查询到。
1. 事务的大小:【开发理论重点】
由业务决定
(1) 事务的大小由业务决定,不同的业务下,需要事务sql数量不同
(2) 案例:
-- 开户业务:由1条sql组成 --> 事务
insert into accounts ....
-- 转账业务:由2条sql组成 --> 事务
update account set balance=balance-money where numId = 8298349
update account set balance=balance+money where numId = 8990909
(3)事务的边界
a. 开始:从第一条sql开始执行,事务开始
b. 结束:执行的sql为insert/delete/update时
第一种情况:commit:事务提交
第二种情况:rollback:事务回滚
注意:select查询语句无需控制事务
1. 事务的底层安全【理解即可】
(1) 事务底层基于锁对数据库安全进行保证
(2) 在一个事务中insert/update/delete数据时,会获取该数据的锁标记,直到该事务结(commit/rollback)才会
释放锁标记;在一个事务持有数据的锁标记时,多事务并发操作,其他事务不能对该数据进行 insert/update/delete操
作,直到获取到锁标记为止,但是可以进行select查询操作,查询操作默认不参与事务。
5. 面试题目:
事务的特点(ACID):
(1) 事务的原子性(Atomic):
事务中的多个sql语句是一个整体, 要么全部成功,要么全部失败.
(2) 事务的一致性(Consistency):
(数据的合理性),事务执行前后(无论失败还是成功),最终数据是合理的.
(3) 事务的隔离性(Isolation):
多个事务并发时,事务之间相互独立,互不影响
回滚端存在的原因
(4) 事务的持久性(Durability):
事务结束(成功或失败),对数据库的数据修改时永久性的.
总结重点:
增删改 --》必会熟
查:根据id查询、查所有信息、根据姓名和密码查询、分页查询、按照一定内容模糊查询
表连接(注意)
建表:利用 工具创建,同时能看懂工具生成sql表结构及语法
面试题目:增删改查不同面试题目中体现
事务的理解及特点
约束(唯一un、非空nn、主键pk、外键fk)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值