一、MySql学习路线
二、基础篇
2.1、MySql概述
1、下载安装
MySql下载官网
2、客户端连接数据库
常用操作语句:
show databases 查看有哪些数据库
use 数据库名 使用某数据库
show tables 查看数据库有哪些表
exit 退出MySQL的命令环境
3、配置环境变量使得任何地方都可访问到数据库
在path中加入Mysql的bin目录
4、数据模型及关系型数据库
2.2、SQl语言
1、SQL通用语法
2、SQL分类
1、图形化界面安装DataGrip
下载链接
1、连接数据库:
输入用户名密码,并下载驱动文件:mysql的驱动jar包
2、展示数据库:
3、创建数据库
4、创建表
5、修改表结构
6、自己通过Sql来操作
3、DDL(操作数据库,表,字段)
3.1数据库操作
1 、查询数据库:
show databases;
2、创建数据库:
create database ClientTest;
对于已经存在的数据库不能再创建:
如果不想出现上面的提示,可以加入
if not exists
表示只有当数据库不存在的时候才创建
3 设置字符集
4 删除数据库
5 切换使用数据库
当忘记当前使用的是哪个数据库时,可以查询当前数据库
3.3数据表操作
1、创建表create,查询表show,删除表drop
2、查看表内的结构:
DESC 表名
3、更改表字段
alter table 表名 Add 字段名 数据类型;
总结:
3.2数据表创建过程中的:数据类型
1、 数值类型
2、字符串类型
注意:char性能高,varchar性能差一些,因为要根据存储的内容计算存储空间
3、时间类型
3.4案例
CreateTable emptable(
id intCOMMENT'编号',
num VARCHAR(10)COMMENT'工号',
name VARCHAR(10)COMMENT'姓名',
gender char(1)COMMENT'性别',
age TINYINTUNSIGNEDCOMMENT'年龄非负',
idcard CHAR(18),
entdata DATECOMMENT'入职时间')COMMENT'员工表'
4、DML操作表数据(增删改)
1、插入数据
insertinto`database-bydatagrip`.uservalues(02,'Tom','男',21);select*fromuser;
2、修改数据Update
/*01、插入数据*/insertinto`database-bydatagrip`.uservalues(02,'Tom','男',21);insertinto`database-bydatagrip`.uservalues(03,'Mary','女',31);/*02、修改数据:updata 表名 set 字段=新值 where 条件*/updateuserset age=28where id=03;updateuserset age=18,name='Mary02'where id=03;updateuserset age=24;/*不写where条件的时候修改整张表*//*03、删除数据*/deletefromuserwhere id=2;/*04、查询表*/select*fromuser;
5、DQL查询数据
5.1、基本查询
先插入数据
INSERTINTO emptable (id, num, name, gender, age, idcard, entdata)VALUES(1,'001','张三','男',25,'110101199003078888','2022-01-01'),(2,'002','李四','F',30,'110101199003078889','2022-01-02'),(3,'003','王五','M',28,'110101199003078890','2022-01-03'),(4,'004','赵六','F',26,'110101199003078891','2022-01-04'),(5,'005','孙七','M',24,'110101199003078892','2022-01-05'),(6,'006','周八','F',27,'110101199003078893','2022-01-06'),(7,'007','吴九','M',23,'110101199003078894','2022-01-07'),(8,'008','郑十','F',29,'110101199003078895','2022-01-08'),(9,'009','冯十一','M',22,'110101199003078896','2022-01-09'),(10,'010','陈十二','F',31,'110101199003078897','2022-01-10'),(11,'011','褚十三','M',26,'110101199003078898','2022-01-11'),(12,'012','卫十四','F',24,'110101199003078899','2022-01-12'),(13,'013','蒋十五','M',27,'110101199003078900','2022-01-13'),(14,'014','沈十六','F',25,'110101199003078901','2022-01-14'),(15,'015','韩十七','M',28,'110101199003078902','2022-01-15'),(16,'016','杨十八','F',23,'110101199003078903','2022-01-16'),(17,'017','朱十九','M',29,'110101199003078904','2022-01-17'),(18,'018','秦二十','F',30,'110101199003078905','2022-01-18'),(19,'019','尤二十一','M',24,'110101199003078906','2022-01-19'),(20,'020','许二十二','F',27,'110101199003078907','2022-01-20'),(21,'021','何二十三','M',25,'110101199003078908','2022-01-21'),(22,'022','吕二十四','F',26,'110101199003078909','2022-01-22'),(23,'023','施二十五','M',28,'110101199003078910','2022-01-23'),(24,'024','张二十六','F',23,'110101199003078911','2022-01-24'),(25,'025','孔二十七','M',29,'110101199003078912','2022-01-25'),(26,'026','曹二十八','F',30,'110101199003078913','2022-01-26'),(27,'027','严二十九','M',24,'110101199003078914','2022-01-27'),(28,'028','华三十','F',27,'110101199003078915','2022-01-28'),(29,'029','金三十一','M',25,'110101199003078916','2022-01-29'),(30,'030','魏三十二','F',26,'110101199003078917','2022-01-30'),(31,'031','陶三十三','M',28,'110101199003078918','2022-01-31'),(32,'032','姜三十四','F',23,'110101199003078919','2022-02-01'),(33,'033','戚三十五','M',29,'110101199003078920','2022-02-02'),(34,'034','谢三十六','F',30,'110101199003078921','2022-02-03'),(35,'035','邹三十七','M',24,'110101199003078922','2022-02-04'),(36,'036','喻三十八','F',27,'110101199003078923','2022-02-05'),(37,'037','柏三十九','M',25,'110101199003078924','2022-02-06'),(38,'038','水四十','F',26,'110101199003078925','2022-02-07'),(39,'039','窦四十一','M',28,'110101199003078926','2022-02-08'),(40,'040','章四十二','F',23,'110101199003078927','2022-02-09'),(41,'041','云四十三','M',29,'110101199003078928','2022-02-10'),(42,'042','苏四十四','F',30,'110101199003078929','2022-02-11'),(43,'043','潘四十五','M',24,'110101199003078930','2022-02-12'),(44,'044','葛四十六','F',27,'110101199003078931','2022-02-13'),(45,'045','奚四十七','M',25,'110101199003078932','2022-02-14'),(46,'046','范四十八','F',26,'110101199003078933','2022-02-15'),(47,'047','彭四十九','M',28,'110101199003078934','2022-02-16'),(48,'048','郎五十','F',23,'110101199003078935','2022-02-17'),(49,'049','鲁五十一','M',29,'110101199003078936','2022-02-18');
/*查询所有字段信息:以下两种方式虽然结果相同,但是尽量使用下面的方法,方便知道返回的是那些字段*/select*from emptable;select id, num, name, gender, age, idcard, entdata from emptable;/*只查员工的日期,并将日期字段列名改为:参加工作时间*/select entdata as'参加工作时间'from emptable ;select entdata '参加工作时间'from emptable ;/*as可以省略*//*查询员工姓名,去重*/selectdistinct emptable.name from emptable;
5.2、条件查询
select*from emptable;/*更改第id是10的员工身份证信息是null*/update emptable set idcard=nullwhere id=10;/*查询身份证是null的人信息:要用is null 不能用等于号=null*/select*from emptable
where idcard isnull;/*查询身份证不是null的人信息:要用is not null*/select*from emptable
where idcard isnotnull;/*查询年龄在20到30之间的人员信息*/select*from emptable
where age>=20&&age<=30;select*from emptable
where age between20and30;/*包含20,30*//*查询年龄是27/28/29的人员信息*/select*from emptable
where age=27or age=28or age=29;/*等同于以下代码*/select*from emptable
where age in(27,28,29);/*查询名字是两个字的员工信息:模糊查询like:_占用一个字符,%不限制字符数*/select*from emptable
where name like'__';/*查询叫姓张的员工*/select*from emptable
where name like'张%';/*查询身份证最后一位是6的员工信息*/select*from emptable
where idcard like'%6';
5.3、聚合函数
/*聚合函数*//*查询整张表的员工数量*/selectcount(*)from emptable;/*求平均年龄*/selectavg(emptable.age)from emptable;/*求最大年龄*/selectmax(emptable.age)from emptable;
5.4、分组查询group by
/*分组查询*//*根据性别分组,分别统计每一组中员工数量*/select gender,count(*)from emptable groupby gender;/*根据性别分组,分别统计男性员工和女性员工平均年龄*/select gender,AVG(age)from emptable groupby gender;
5.5、排序查询order by
/*排序查询*//*根据年龄对公司的员工进行升序排序*/select*from emptable orderby age asc,entdata asc;/*age asc,entdata asc当第一个参考字段年龄相同的时候参考入职时间*/
5.6、分页查询Limit
/*分页查询,将查询结果进行分页*//*查询第一页员工数据,每页展示10条数据*/select*from emptable
limit0,10;/*查询第二页员工数据,每页展示10条数据*/select*from emptable
limit10,10;/*起始索引:(2-1)*10*/
5.7、案例
/*案例*//*01、查询您老是21,23,25的女性员工信息*/select*from emptable
where age in(23,24,25)and gender='F';/*02查询性别为男,年龄在20-40(含)之间的姓名为三个字的员工*/select*from emptable
where gender='M'and age between20and40and name like'___';/*03统计 表中年龄小于60岁的男性员工和女性员工 人数 */select emptable.gender ,count(*)/*查询的对象是分组对象才有意义*/from emptable
where age<60groupby gender;/*04查询所有年龄小于35岁的员工 姓名和年龄,并对查询结果按年龄排序,如果年龄相同按照入职时间降序排序*/select name,age
from emptable
where age<35orderby age asc,entdata desc;/*05查询性别为男 ,年龄在20-40(含)以内的5个员工信息,对查询结果按年龄升序排序,年龄相同按照入职时间升序排序*/select*from emptable
where gender='M'and age between20AND40ORDERBY age ASC,entdata ASCLIMIT0,5;
5.8、DQL语句(执行)顺序
6、DCL
6.1创建用户
1.只限制在本主机访问
2.任意主机均可访问:
/*创建用户:ithiema,且只能在本地主机localhost登录,密码123456*/createuser'itheima'@'localhost' identified by'123456';/*查询用户信息*/select*fromuser;/*创建用户:heima。可以在任意主机访问该数据库,密码123456*/createuser'heima'@'%' identified by'123456';
6.2修改密码
/*修改用户heima的密码为1234*/alteruser'itheima'@'localhost' identified with mysql_native_password by'1234';/*删除'itheima'@'localhost' 用户*/
6.3删除用户
6.4更改用户权限
自己创建的用户登录上去后只能访问一个自带的数据库,不像root可以访问所有数据库,因为权限不够。
root用户:
2.3、函数
1、字符串函数
案例:
update emptable set num=lpad(num,5,'0');select*from emptable;
2、数值函数
/*数值函数*/select rand();/*生成0-1之间的随机数*/select rand()*1000000;/*生成一个六位数的随机数*//*生成一个六位数整数的验证码*/selectround(rand()*1000000,0);/*round(num1,mun2):num1表示要四舍五入的对象,num2表示要保留的小数位*//*生成一个六位数整数的验证码,如果不够6位前面补零LPad*/select LPAD(round(rand()*1000000,0),6,'0');
3、日期函数
/*日期函数*/select curdate();/*返回当前日期:2024-08-27*/select curtime();/*返回当前时间10:29:48*/selectnow();/*返回日期+时间2024-08-27 10:31:50*//*Year(data),month(data),Day(data)*/selectYEAR(now());/*返回当前时间所在的年份:2024*/selectMONTH(now());/*8月*/selectday(now());/*27日*//**/select date_add(now(),interval10Day);/*当前时间往后推10天:2024-09-06 10:35:52*/select datediff(n
4、流程函数
/*流程函数*/# if(num,re1,re2);如果num为true返回re1,否则返回re2selectif(true,'ok','Err');# ifnull():如果第一个值为null返回第二个值,第一个值不为null返回第一个值select ifnull(null,10);/*返回10*/select ifnull(99,10);/*返回99*/
2.4、约束
1、普通约束
/*新建表,并添加约束*/use clienttest02;createtableuser(
id intPRIMARYKEYauto_increment,
name varchar(10)notnullunique,
age intcheck( age>0and age<=120),statuschar(1)default1,
gender char(1))comment'用户表';# 插入数据,由于id是自增的,所以不用管insertintouser(name, age,status, gender)values('Tom',20,1,'男'),('Mary',23,0,'女'),('Jack',30,1,'男')
2、外键约束
需要在sql中建立关联
1、添加外键约束
# 创建部门部门表use clienttest02;CREATETABLE dept (
id INTPRIMARYKEYauto_increment,
name VARCHAR(255)NOTNULL);INSERTINTO dept (id, name)VALUES(1,'人事部'),(2,'财务部'),(3,'市场部'),(4,'技术部'),(5,'运营部');
添加外键约束:一种是创建表时进行添加,一种时更改表约束
CREATETABLE emp (
id INTPRIMARYKEYAUTO_INCREMENT,
name VARCHAR(255)NOTNULL,
age INT,
job VARCHAR(255),
salary int,
entrydate DATE,
manager INT,
dep_id INT,#constraint:添加约束constraint dep_id_deptid FOREIGNKEY(dep_id)REFERENCES dept(id));INSERTINTO emp (name, age, job, salary, entrydate, manager, dep_id)VALUES('张三',30,'经理',15000.00,'2020-01-01',NULL,1),('李四',28,'助理',8000.00,'2020-02-01',1,1),('王五',35,'工程师',12000.00,'2020-03-01',1,4),('赵六',25,'设计师',9000.00,'2020-04-01',1,3),('孙七',32,'销售员',10000.00,'2020-05-01',1,2),('周八',29,'会计',7000.00,'2020-06-01',1,2),('吴九',31,'市场专员',9500.00,'2020-07-01',1,3),('郑十',27,'运营专员',8500.00,'2020-08-01',1,5),('陈十一',33,'技术主管',13000.00,'2020-09-01',1,4),('林十二',26,'行政助理',6500.00,'2020-10-01',1,1);/*删除外键*/altertable emp dropforeignkey dep_id_deptid;
2、外键约束行为
图形化界面设置:
2.5、多表查询
1、多表关系
use clienttest02;#创建学生表createtable student(
id intauto_incrementprimarykey,
name varchar(10)notnull,
non varchar(10)comment'学号')comment'学生表';insertinto student(name, non)values('Jack','202401'),('mary','202402'),('Tom','202403'),('Lucy','202404');#创建课程表createtable courses(
id intauto_incrementprimarykey,
name varchar(10)comment'部门名称')comment'课程表';insertinto courses(name)values('Java'),('Python'),('PHP'),('C#');
多对多关系需要建立中间表:将两个表的主键作为此表的外键
/*建立中间表*/createtable student_courses(
id intauto_incrementprimarykey,
student_id intnotnullcomment'学生ID',
course_id intnotnullcomment'课程ID',constraint fk_course_id foreignkey(course_id)references courses(id),constraint fk_student_id foreignkey(student_id)references student(id))comment'中间表';insertinto student_courses (student_id, course_id)values(1,1),(1,2),(2,1),(2,3),(3,3),(3,4),(4,1);
用户教育表中的外键userid添加unique的目的是让其保持唯一,防止出现用户基本表与用户教育信息表形成一对多的情况
2、多表查询语法
1、笛卡尔积查询
消除无效的笛卡尔积:
注:要消除笛卡尔积,只需要在查询语句的后面加一个where条件即可。
2、多表查询分类:连接查询、子查询
3、内连接查询
如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段
# 注意,一定得是连接的另一个表的主键才可以altertable emp addconstraint fk foreignkey(dep_id)references dep(id)onupdatecascadeondeletecascade;-- 内连接-- 1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)-- 表结构:emp, dep-- 连接条件:emp.dep_id = dep.idselect emp.name, dep.dep from emp, dep where emp.dep_id = dep.id;#如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段select e.name,d.dep from emp e, dep d where e.id = d.id ;-- 2、查询每一个员工的姓名,及关联的部门的名称(显示内连接实现) ---INNER JOIN ... ON ...-- 表结构:emp, dep-- 连接条件:emp.dep_id = dep.idselect e.name, d.dep from emp e innerjoin dep d on e.dep_id = d.id;select e.name, d.dep from emp e join dep d on e.dep_id = d.id;
4、外连接查询
-- 外连接-- 1、查询emp表所有的数据,和对应的部门信息(左外连接)-- 表结构:emp, dep-- 连接条件:emp.dep_id = dep.idselect e.*, d.dep from emp e leftjoin dep d on d.id = e.dep_id;-- 2、 查询dep表所有的数据,和对应的员工信息(右外连接)select e.*, d.*from emp e rightjoin dep d on d.id = e.dep_id;
5、自连接查询
-- 自连接-- 1、查询员工及其所属工作地址-- 表结构: empselect a.name, b.name from emp a, emp b where a.manageid = b.id;-- 2、查询所有员工 emp 及其 领导的 名字,如果员工没有领导,也要查询出来select a.name '员工', b.name '领导'from emp a leftjoin emp b on a.manageid = b.id;
1、联合查询
-- union all ,union-- 1、将地址在北京的, 和年龄大于 20 岁的员工全部查询select*from emp where workaddress ='北京'# union all # 查询结果直接合并union#查询结果合并并去重select*from emp where age >20;# 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
6、子连接查询
1、标量子查询
-- 标量子查询-- 1、查询“管理部门”的所有员工信息-- a. 查询“管理部门”的IDselect id from dep where dep ='管理部门';-- b. 根据管理部门ID查询员工信息select*from emp where dep_id =3;select*from emp where dep_id =(select id from dep where dep ='管理部门');-- 2、 查询在“小昭”入职之后的员工信息-- a. 查询“小昭”入职日期select entrydate from emp where name ='小昭';-- b. 查询指定入职日期之后的员工信息select*from emp where entrydate >'2002-01-01';select*from emp where entrydate >(select entrydate from emp where name ='小昭');
2、列子查询
(1)在基础查询语句时,用来简化or,已经用到了in(num1,num2,num3)表示只要是括号内的值就满足。
-- 列子查询-- 1、 查询“销售部” 和“研发部” 的所有员工信息select*from emp where dep_id in(select id from dep where dep ='销售部'or dep ='研发部');-- 2、 查询比销售部所有人工资都高的员工信息select*from emp where salary >all((select salary from emp where dep_id =(select id from dep where dep ='销售部')));# all 返回回来的结构都需要满足-- 3、查询比研发部其中任意一人工资高的员工信息select*from emp where salary >any(select salary from emp where dep_id =(select id from dep where dep ='研发部'));# any = some
3、行子查询
-- 行子查询 一行多列-- 1、查询与“刘艳”的薪资及直属领导相同的员工信息select*from emp where salary =1000and manageid='刘东';#我们进行的正常写法#改进select*from emp where(salary,manageid)=(1000,'刘东');#一一对应写法#子查询的结果正好是行数据:(薪资,领导名)实现了一一对应select*from emp where(salary,manageid)=(select salary,manageid from emp where name ='刘艳');
如何确定是列子查询还是行子查询?
1.看条件-》拆解:内层,外层,内层的字段是否属于一个对象的属性?如对象:张伟可以有姓名,年龄,性别等属性,这些属性都是以行的形式排列,而以列进行排序的只是不同的对象。
我们将一个对象所拥有的信息(姓名,年龄…)称为属性,所拆分出来的内层字段如果都是属性那么久用行子查询,因为这些属性以行的形式进行排序。
条件:查询与(“刘艳”的薪资及直属领导)相同的(员工信息)
内层:(“刘艳”的薪资及直属领导):内层字段都是属性所以用行查询,返回的是一个行信息,可以用(属性1,属性2)=(属性1,属性2)方式一一对应内部的值
外层:(员工信息)
4、表子查询
由于返回的结果是一张表,表的每一行数据作为一个对象:
(职位,薪资)in((职位1,薪资1)(职位2,薪资2))
#类似于
age in(2000,1000)
-- 表子查询-- 1、 查询与“李四”,“杨工”的工作地点和薪资相同的员工信息select*from emp where(workaddress,salary)in(select workaddress,salary from emp where name ='李四'or name ='杨工');-- 2、 查询入职日期是 “2002-01-01” 之后的员工信息,及其部门信息select e.*, d.dep from(select*from emp where entrydate >'2002-01-01') e leftjoin dep d on e.dep_id = d.id;
7、案例
涉及到的表信息:
-- 案例-- 1、查询员工姓名、年龄、部门信息(隐式内连接)-- 表:emp , dept-- 连接条件 : emp.dep_id = dep.idselect e.name,e.age, d.dep from emp e,dep d where e.dep_id = d.id;-- 2、查询年龄大于20的员工姓名、年龄、部门信息 (显示内连接)-- 表:emp , dept-- 连接条件 : emp.dep_id = dep.idselect e.name,e.age,d.dep from emp e join dep d on d.id = e.dep_id where e.age >20;#查询语句放在where后面-- 3、查询拥有员工的部门ID、部门名称 (部门表和员工表交集的部分)-- 表:emp , dept-- 连接条件 : emp.dep_id = dep.id-- distinct 去重selectdistinct d.id, d.dep from emp e,dep d where e.dep_id = d.id;-- 4、查询所有年龄大于25的员工及其归属的部门名称,如果没有分配部门,也要展示出来-- 表:emp , dept-- 连接条件 : emp.dep_id = dep.id-- 外连接select e.name,d.dep from emp e leftjoin dep d on d.id = e.dep_id where e.age >25;-- 5、查询所有员工工资等级-- 表:emp , salgrade-- 连接条件 : emp.salary >= salgrade.losal && emp.salary <= salgrade.hisalselect*from emp e ,salgrade s where e.salary >= s.losal && e.salary <= s.hisal;select*from emp e ,salgrade s where e.salary between s.losal and s.hisal;-- 6、查询"研发部"所有员工信息及工资等级-- 表:emp , salgrade, dep-- 连接条件 :e.salary between s.losal and s.hisal; emp.dep_id = dep.id-- 查询条件:dep.dep = '研发部'select e.*, s.grade
from emp e,
dep d,
salgrade s
where(e.salary between s.losal and s.hisal)and e.dep_id = d.id
and d.dep ='研发部';-- 7、查询"研发部"员工的平均工资-- 表:emp , dep-- 连接条件 : emp.dep_id = dep.idselectavg(e.salary)from emp e,
dep d
where e.dep_id = d.id
and d.dep ='研发部';-- 8、查询工资比李四高的员工信息-- 表:empselect*from emp e
where salary >(select e.salary from emp e where e.name ='李四');-- 9、查询比平均工资高的员工信息-- 表:empselect*from emp e
where salary >(selectavg(salary)from emp);-- 10、查询低于本部门平均工资的员工-- 表:emp , dept-- 连接条件 : emp.dep_id = dep.idselect*from emp e2
where e2.salary <(selectavg(e1.salary)from emp e1 where e1.dep_id = e2.dep_id);-- 11、查询所有部门的信息,并统计部门的员工人数select d.id,d.dep ,(selectcount(*)from emp e where e.dep_id = d.id)'人数'from dep d;
8、总结
1.多表查询先消除笛卡尔级,通过表连接条件消除,n张表需要n-1个来凝结条件,多个条件之间通过and连接
2.6、事务
1、简介
- 一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
- 默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
2、应用
1、自动提交事务
2、手动提交事务:方法1
先设置@@autocommit = 0,再使用commit提交事务和rollback回滚
select @@autocommit;set @@autocommit=0;-- 张三给李四转账1000select*from account where name ='张三';update account set monney = monney -1000where name ='张三';update account set monney = monney +1000where name ='李四';-- 提交事务commit;-- 回滚事务;rollback;
3、手动提交事务:方法2
直接调用函数开启事务:不用设置@@autocommit = 0,提交与回滚类似
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/054156de113e49d59b07aab893356968.png
-- 张三给李四转账1000starttransaction;select*from account where name ='张三';update account set monney = monney -1000where name ='张三';update account set monney = monney +1000where name ='李四';commit;rollback;
3、事务的四大特性
4、并发事务引发的问题
1、读脏数据
指的是一个事务读取了另一个事务尚未提交的数据
2、不可重复读
指的是在同一个事务中,两次读取同一行数据得到的结果不一致,这种情况通常是因为在事务执行期间,另一个事务对相同的数据进行了修改或删除,导致了读取结果的不一致性。
3、幻读
它指的是在同一个事务中,两次查询相同条件的数据得到的结果集不一致。与不可重复读类似,幻读是由于其他事务对数据进行了插入、更新或删除操作而导致的结果不一致性。下
5、事务的隔离级别:解决并发事务引发的问题
Serializable:可串行化,安全性高,但是并发性比较低,有时会因为等待事务锁而阻塞。
2.7、SQL语句中Delete与Drop的区别
- 需要删除表中的某些记录或者清空表时,但希望保留表结构用于后续数据插入,选择DELETE
- 需要彻底删除表或数据库,不再需要其结构和数据时,选择DROP
1、DELETE与DROP使用语法格式
- delete格式:
//删除特定条件所在的行deletefrom 表名 where 条件
//删除整张表deletefrom 表名
- DROP格式
-- 删除一个表DROPTABLE employees;-- 删除一个数据库DROPDATABASE company_db;
2、DELETE与DROP主要特点
DELETE特点:
- 保留表结构:仅删除表中的数据,不影响表结构和索引
- 可选条件:可以使用 WHERE 子句来指定删除哪些记录
- 事务支持:可以在事务中进行,可以回滚(ROLLBACK)以撤销操作
- 性能考虑:删除大量记录时,DELETE 可能比较慢(逐行删除数据,并在每行删除时记录在日志中)
DROP特点:
- 删除表及其数据:DROP TABLE 会删除整个表以及表中的所有数据
- 删除其他数据库对象:可删除索引、视图等其他数据库对象
- 不可恢复:无法回滚,一旦执行,所有数据和表结构都会被永久删除
- 性能:通常比 DELETE 更快,因为它直接删除表及其内容,而不逐行记录删除操作
版权归原作者 泰勒今天想展开 所有, 如有侵权,请联系我们删除。