【JavaWeb】

Javaweb

  • 数据库相关概念
  • MySQL数据库
  • MySQL数据模型
  • SQL
  • DDL--操作数据库
  • 图形化客户端工具
  • DML--操作数据
  • DQL
  • 数据库
    • 约束
  • 数据库设计
  • 多表查询
  • 事务

数据库相关概念

在这里插入图片描述

数据库
存储数据的仓库,数据是有组织的进行存储
英文:DataBase,简称DB

数据库管理系统
管理数据库的大型软件
英文:DataBaseManagementSystem,简称DBMS

SQL
英文:StructuredQueryLanguage,简称SQL,结构化查询语言
操作关系型数据库的编程语言
定义操作所有关系型数据库的统一标准

MySQL数据库

下载
点开下面的链接:
https://downloads.mysql.com/archives/community/
在这里插入图片描述

配置环境变量
在这里插入图片描述

在这里插入图片描述

新建配置文件
新建一个文本文件,内容如下:

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8
default-storage-engine=innodb
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在这里插入图片描述

初始化MySQL
在文件夹cmd中输入以下命令,出现data文件证明成功

mysqld --initialize-insecure

在这里插入图片描述

tips:如果出现如下错误
在这里插入图片描述

是由于权限不足导致的,去c:\windows\System32下以管理员方式运行cmd.exe

注册MySQL服务
在黑框里敲入mysqld -install,回车。

在这里插入图片描述
现在你的计算机上已经安装好了MySQL服务了。

启动MySQL服务

在黑框里敲入net start mysql,回车。

net start mysql    //启动mysql服务
net stop mysql    //停止mysql服务

修改默认账户密码
在黑框里敲入mysqladmin -u root password 1234,这里的1234就是指默认管理员(即root账户)的密码,可以自行修改成你喜欢的。

在这里插入图片描述

mysqladmin -u root password 1234

登录MySQL

在黑框中输入,mysql-uroot-p1234,回车,出现下图且左下角为mysq1>,则登录成功。

mysql -uroot -p1234

在这里插入图片描述
登录参数:

mysq1-u用户名-p密码-h要连接的mysq1服务器的ip地址(默认127.0.0.1)-P端口号(默认3306)

退出mysql

exit 
quit

MySQL数据模型

关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库

优点
1.都是使用表结构,格式一致,易于维护。
2使用通用的SQL语言操作,使用方便,可用于复杂查询。
3.数据存储在磁盘中,安全。
在这里插入图片描述

SQL

SQL简介

英文:StructuredQueryLanguage,简称SQL
结构化查询语言,一门操作关系型数据库的编程语言
定义操作所有关系型数据库的统一标准
对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为“方言"

SQL通用语法

1.SQL语句可以单行或多行书写,以分号结尾。
2.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
3.注释
在这里插入图片描述

SQL分类
DDL:操作数据库,表等
DML:对表中的数据进行增删改
DQL:对表中的数据进行查询
DCL:对数据库进行权限控制
在这里插入图片描述

DDL–操作数据库

1.查询

SHOW DATABASES;

2.创建

创建数据库

CREATE DATABASE 数据库名称;

创建数据库(判断,如果不存在则创建)

CREATE DATABASE IF NOT EXISTS 数据库名称;

3.删除

删除数据库

DROP DATABASE 数据库名称;

删除数据库(判断,如果存在则删除)

DROP DATABASE IF EXISTS 数据库名称;

4.使用数据库

查看当前使用的数据库

SELECT DATABASE();

使用数据库

USE 数据库名称;

DDL–操作表

1.查询表

查询当前数据库下所有表名称

SHOW TABLES;

查询表结构

DESC 表名称;

2.创建表
在这里插入图片描述

在这里插入图片描述

 create table 表名(
    -> 字段名1 数据类型1,
    -> 字段名2 数据类型2,
    -> ...
    -> 字段名n 数据类型n
    );

注意:最后一行末尾,不能加逗号

数据类型

MySQL支持多种类型,可以分为三类:

  • 数值
  • 日期
  • 字符串
    在这里插入图片描述

创建案例
在这里插入图片描述

在这里插入图片描述

删除表

1.删除表

DROP TABLE 表名;

在这里插入图片描述

2.删除表时判断表是否存在

DROP TABLE IF EXISTS 表名;

在这里插入图片描述

修改表
1.修改表名

ALTER TABLE 表名 RENAME TO 新的表名;

在这里插入图片描述

2.添加一列

ALTER TABLE 表名 ADD 列名 数据类型;

在这里插入图片描述

3.修改数据类型

ALTER TABLE 表名 MODIFY 列名 新数据类型;

在这里插入图片描述

4.修改列名和数据类型

ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;

在这里插入图片描述

5.删除列

ALTER TABLE 表名 DROP 列名;

在这里插入图片描述

图形化客户端工具

Navicat
NavicatforMySQL是管理和开发MySQL或MariaDB的理想解决方案。
这套全面的前端工具为数据库管理、开发和维护提供了一款直观而强大的图形界面。
·官网:http://www.navicat.com.cn
在这里插入图片描述

DML–操作数据

在这里插入图片描述

添加数据
1.给指定列添加数据

INSERT INTO 表名(列名1,列名2,…)VALUES(值1,值2,..);

在这里插入图片描述

2.给全部列添加数据

INSERT INTO 表名 VALUES(值1,值2,.);

在这里插入图片描述

3.批量添加数据

INSERT INTO 表名(列名1,列名2,.)VALUES(值1,值2,….),(值1,值2,..),(值1,值2,…..;
INSERT INTO 表名 VALUES(值1,值2,.)),(值1,值2,.),(值1,值2,…..;

在这里插入图片描述

修改数据

1.修改表数据

UPDATE 表名 SET 列名1=值1,列名2=值2,….[WHERE 条件];

注意:修改语句中如果不加条件,则将所有数据都修改!
在这里插入图片描述

删除数据

1.删除数据

DELETE FROM 表名[ WHERE 条件 ];

注意:删除语句中如果不加条件,则将所有数据都删除!
在这里插入图片描述

DQL

查询语法

SELECT
    字段列表
FROM
    表名列表
WHERE    
    条件列表
GROUP BY    
    分组字段
HAVING    
    分组后条件
ORDER BY    
    排序字段
LIMIT    
    分页限定

基础查询

查询案例

-- 删除stu表
drop table if exists stu;

-- 创建stu表
CREATE TABLE Stu (
  id int, -- 编号
  name varchar(20), -- 姓名
  age int, -- 年龄
  sex varchar(5), -- 性别
  address varchar(100), -- 地址
  math double(5,2), -- 数学成绩
  english double(5,2), -- 英语成绩
  hire_date date -- 入学时间
);

-- 添加数据
INSERT INTO stu(id, name, age, sex, address, math, english, hire_date)
VALUES
(1, '马运', 55, '男', '杭州', 66, 78, '1997-09-01'),
(2, '马花疼', 45, '女', '深圳', 56, 77, '1998-09-01'),
(3, '马斯克', 45, '男', '湖南', 20, 87, '1996-09-01'),
(4, '小明', 45, '女', '香港', 96, 65, '1991-09-01'),
(5, '小红', 57, '男', '香港', 98, 65, '1992-09-01'),
(6, '鲁迅', 20, '女', '湖南', 99, 99, '1993-09-01'),
(7, '周树人', 22, '男', '湖南', 86, NULL, '1994-09-01'),
(8, '陌生人', 18, '女', '南京', 99, 99, '1995-09-01');




-- 查询数据
SELECT * FROM stu;

1.查询多个字段

SELECT 字段列表 FROM 表名;
SELECT * FROM 表名;--查询所有数据

2.去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

3.起别名

AS:AS也可以省略

在这里插入图片描述

条件查询

1.条件查询语法

SELECT 字段列表 FROM 表名 WHERE 条件列表;

2.条件
在这里插入图片描述
在这里插入图片描述

模糊查询
在这里插入图片描述

排序查询
1.排序查询语法

SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1[排序方式1],排序字段名2[排序方式2]...;

排序方式:
ASC:升序排列 (默认值)
DESC:降序排列
注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

在这里插入图片描述

聚合函数
1. 概念:
将一列数据作为一个整体,进行纵向计算。

2.聚合函数分类:
在这里插入图片描述
在这里插入图片描述

3.聚合函数语法:

SELECT 聚合函数名(列名)FROM 表;

注意:null值不参与所有聚合函数运算
在这里插入图片描述

分组查询

1.分组查询语法

SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名[HAVING 分组后条件过滤];

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

where和having区别:

  • 执行时机不一样:where是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
  • 可判断的条件不一样:where不能对聚合函数进行判断,having可以。

执行顺序:where>聚合函数>having

在这里插入图片描述

分页查询

1.分页查询语法

SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;

起始索引:从0开始

计算公式:起始索引 =(当前页码-1)*每页显示的条数

tips:

  • 分页查询limit是MySQL数据库的方言
  • Oracle分页查询使用rownumber
  • SQL Server分页查询使用top
    在这里插入图片描述

数据库

约束

约束的概念和分类
1.约束的概念

  • 约束是作用于表中列上的规则,用于限制加入表的数据
  • 约束的存在保证了数据库中数据的正确性、有效性和完整性
    在这里插入图片描述

2.约束的分类
在这里插入图片描述

Tips:MySQL不支持检查约束

约束案例

根据需求,为表添加合适的约束
在这里插入图片描述
演示:
在这里插入图片描述

在这里插入图片描述

外键约束

1.概念
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
在这里插入图片描述

2.语法
(1)添加约束

-- 创建表时添加外键约束
CREATE TABLE 表名(
    列名  数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名)REFERENCES 主表(主表列名)
);
-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名称)REFERENCES主表名称(主表列名称);

(2)删除约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

在这里插入图片描述
在这里插入图片描述

数据库设计

1.软件的研发步骤
在这里插入图片描述
2.数据库设计概念

  • 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
  • 建立数据库中的表结构以及表与表之间的关联关系的过程。
  • 有哪些表?表里有哪些字段?表和表之间有什么关系?

3.数据库设计的步骤

  1. 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
  2. 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
  3. 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
  4. 维护设计(1.对新的需求进行建表;2.表优化)
    在这里插入图片描述

表关系

  • 一对一:
    ---- 如:用户和用户详情
    ---- 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
    ---- 实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)

  • 一对多(多对一):
    ---- 如:部门和员工
    ---- 一个部门对应多个员工,一个员工对应一个部门
    ---- 实现方式:在多的一方建立外键,指向一的一方的主键

  • 多对多:
    ---- 如:商品和订单
    ---- 一个商品对应多个订单,一个订单包含多个商品
    ---- 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

多表查询

简介

  • 笛卡尔积:取A,B集合所有组合情况
  • 多表查询:从多张表查询数据
    • 连接查询
      • 内连接:相当于查询AB交集数据
      • 外连接:
        • 左外连接:相当于查询A表所有数据和交集部分数据
        • 右外连接:相当于查询B表所有数据和交集部分数据
    • 子查询
      在这里插入图片描述

在这里插入图片描述

内连接

1.内连接查询语法

-- 隐式内连接
SELECT  字段列表 FROM 表1,表2... WHERE 条件;

-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;

内连接相当于查询AB交集数据
在这里插入图片描述
在这里插入图片描述

外连接

1.外连接查询语法

-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;

-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;

左外连接:相当于查询A表所有数据和交集部分数据

右外连接:相当于查询B表所有数据和交集部分数据
在这里插入图片描述

在这里插入图片描述

子查询

1.子查询概念:

  • 查询中嵌套查询,称嵌套查询为子查询

2.子查询根据查询结果不同,作用不同:

  • 单行单列
  • 多行单列
  • 多行多列

子查询根据查询结果不同,作用不同:

  • 单行单列:作为条件值,使用=!=><等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 =(子查询);
  • 多行单列:作为条件值,使用in等关键字进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 in(子查询);
  • 多行多列:作为虚拟表
SELECT 字段列表 FROM(子查询)WHERE 条件;

在这里插入图片描述

多表查询案例

在这里插入图片描述

DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
DROP TABLE IF EXISTS job;
DROP TABLE IF EXISTS salarygrade;

-- 部门表
CREATE TABLE dept (
  id INT PRIMARY KEY PRIMARY KEY, -- 部门id
	dname VARCHAR(50), -- 部门名称
	loc VARCHAR(50) -- 部门所在地
);

-- 职务表,职务名称,职务描述
CREATE TABLE job(
  id INT PRIMARY KEY,
	jname VARCHAR(20),
	job_description VARCHAR(50)
);

-- 员工表
CREATE TABLE emp(
  id INT PRIMARY KEY, -- 员工id
	ename VARCHAR(50), -- 员工姓名
	job_id INT, -- 职务id
	mgr INT, -- 上级领导
	joindate DATE, -- 入职日期
	salary DECIMAL(7,2), -- 工资
	bonus DECIMAL(7,2), -- 奖金
	dept_id INT, -- 所在部门编号
	CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
	CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);

-- 工资等级表
CREATE TABLE salarygrade(
  grade INT PRIMARY KEY, -- 级别
	losalary INT, -- 最低工资
	hisalary INT -- 最高工资
);

-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');

-- 添加4个职务
INSERT INTO job (id, jname, job_description) VALUES
(1,'董事长','管理整个公司,接单'),
(2,'经理','管理部门员工'),
(3,'销售员','向客人推销产品'),
(4,'文员','使用办公软件');

-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'岁贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李达',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);

在这里插入图片描述

DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
DROP TABLE IF EXISTS job;
DROP TABLE IF EXISTS salarygrade;

-- 部门表
CREATE TABLE dept (
  id INT PRIMARY KEY PRIMARY KEY, -- 部门id
	dname VARCHAR(50), -- 部门名称
	loc VARCHAR(50) -- 部门所在地
);

-- 职务表,职务名称,职务描述
CREATE TABLE job(
  id INT PRIMARY KEY,
	jname VARCHAR(20),
	job_description VARCHAR(50)
);

-- 员工表
CREATE TABLE emp(
  id INT PRIMARY KEY, -- 员工id
	ename VARCHAR(50), -- 员工姓名
	job_id INT, -- 职务id
	mgr INT, -- 上级领导
	joindate DATE, -- 入职日期
	salary DECIMAL(7,2), -- 工资
	bonus DECIMAL(7,2), -- 奖金
	dept_id INT, -- 所在部门编号
	CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
	CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);

-- 工资等级表
CREATE TABLE salarygrade(
  grade INT PRIMARY KEY, -- 级别
	losalary INT, -- 最低工资
	hisalary INT -- 最高工资
);

-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');

-- 添加4个职务
INSERT INTO job (id, jname, job_description) VALUES
(1,'董事长','管理整个公司,接单'),
(2,'经理','管理部门员工'),
(3,'销售员','向客人推销产品'),
(4,'文员','使用办公软件');

-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'岁贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李达',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);

-- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
/*
  分析:
	  1.员工编号,员工姓名,工资信息在emp员工表中
		2.职务名称,职务描述信息在job职务表中
		3.job 职务表 和emp 员工表 是一对多的关系emp.job_id= job.id
*/

-- 隐式内连接
select emp.id,emp.ename,emp.salary,job.jname,job.job_description from emp,job where emp.job_id = job.id;

select * from emp;
select * from job;
-- 显式内连接
select emp.id,emp.ename,emp.salary,job.jname,job.job_description from emp inner join job on emp.job_id = job.id;

-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/*
  分析:
	  1.员工编号,员工姓名,工资信息在emp员工表中
		2.职务名称,职务描述信息在job职务表中
		3.job 职务表 和emp 员工表 是一对多的关系emp.job_id= job.id
		
		4.部门名称,部门位置来自于部门表dept
		5.dept和emp一对多关系dept.id=emp.dept_id
*/

-- 隐式内连接
select emp.id,emp.ename,emp.salary,job.jname,job.job_description,dept.dname,dept.loc from emp,job,dept where emp.job_id = job.id and emp.job_id= job.id;

-- 显式内连接
select emp.id,emp.ename,emp.salary,job.jname,job.job_description,dept.dname,dept.loc from emp inner join job on emp.job_id = job.id inner join dept on dept.id = emp.dept_id;


-- 3.查询员工姓名,工资,工资等级
/*
  分析:
	1.员工姓名,工资信息在emp员工表中
	2.工资等级 信息在 salarygrade 工资等级表中
	3. emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
	
*/
select emp.ename,emp.salary,t2.* from emp,salarygrade t2 where emp.salary >= t2.losalary and emp.salary <= t2.hisalary


-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
/*
  分析:
	  1.员工编号,员工姓名,工资信息在emp员工表中
		2.职务名称,职务描述信息在job职务表中
		3.job职务表和emp员工表是一对多的关系emp·job_id=job.id
		4.部门名称,部门位置来自于部门表 dept
		5.dept和emp一对多关系dept.id=emp.dept_id
		6.工资等级信息在 salarygrade工资等级表中
		7. emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
*/
select emp.id,emp.ename,emp.salary,job.jname,job.job_description,dept.dname,dept.loc,t2.grade from emp inner join job on emp.job_id = job.id inner join dept on dept.id = emp.dept_id inner join salarygrade t2 on emp.salary between t2.losalary and t2.hisalary;



  
-- 5.查询出部门编号、部门名称、部门位置、部门人数
/*
  分析:
	  1.部门编号、部门名称、部门位置来自于部门dept表
		2.部门人数:在emp表中 按照dept_id进行分组,然后count(*)统计数量
		3.使用子查询,让部门表和分组后的表进行内连接
		4.
*/
select * from dept;

select dept_id, count(*) from emp group by dept_id;

select dept.id,dept.dname,dept.loc,t1.count from dept,(select dept_id, count(*) count from emp group by dept_id) t1 where dept.id = t1.dept_id

事务

事务简介

  • 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
  • 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
  • 事务是一个不可分割的工作逻辑单元
    在这里插入图片描述
    在这里插入图片描述
-- 开启事务
START  TRANSACTION;
或者  BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

MySQL事务默认自动提交

-- 查看事务的默认提交方式
SELECT @@autocommit;
-- 1  自动提交    θ  手动提交
-- 修改事务提交方式
set @@autocommit = 0;
DROP TABLE IF EXISTS aCCount;

-- 创建账户表

CREATE TABLE aCCount(
  id int PRIMARY KEY auto_increment,
	name varchar(10),
	money double(10,2)
);

-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);

select * from account;
UPDATE account set money = 1000;

-- 转账操作
-- 开启事务
BEGIN;
-- 1.查询李四的余额

-- 2.李四金额 -500
UPDATE account set money = money - 500 where name = '李四';

-- 出错了!

-- 3.张三金额 +500
UPDATE account set money = money + 500 where name = '张三';

-- 提交事务
COMMIT;
-- 回滚事务  :回到开启事务之前的状态
ROLLBACK;




-- 1.查询事务的默认提交方式
select @@autocommit;
-- 2.修改事务的提交方式手动提交
set @@autocommit = 0;

select * from account;
-- 2.李四金额-500
UPDATE account set money = money - 500 where name = '李四';
-- commit
commit;

事务四大特征

  • 原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(lsolation):多个事务之间,操作的可见性
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/414764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自然语言:信息抽取技术在CRM系统中的应用与成效

一、引言 在当今快速变化的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;已成为企业成功的关键因素。CRM系统的核心在于有效地管理客户信息&#xff0c;跟踪与客户的每一次互动&#xff0c;以及深入分析这些数据以提升客户满意度和忠诚度。在我最近参与的一个…

SpringBoot+Vue全栈开发-刘老师教编程(b站)(一)

课堂内容 Java EE企业级框架&#xff1a;SpringBootMyBatisPlusWeb前端核心框架&#xff1a;VueElementUI公共云部署&#xff1a;前后端项目集成打包与部署 B/S(Browser/Server):浏览器/服务器架构模式 C/S(Client/Server):客户端/服务器架构模式 Maven是一个项目管理工具&…

【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)

目录 1、锁的策略 1.1、乐观锁和悲观锁 1.2、轻量级锁和重量级锁 1.3、自旋锁和挂起等待锁 1.4、普通互斥锁和读写锁 1.5、公平锁和非公平锁 1.6、可重入锁和不可重入锁 2、synchronized 内部的升级与优化过程 2.1、锁的升级/膨胀 2.1.1、偏向锁阶段 2.1.2、轻量级锁…

为什么会造成服务器丢包?

随着云服务器市场的发展和网络安全问题&#xff0c;服务器丢包问题成为了一个普遍存在的现象。服务器丢包是指在网络传输过程中&#xff0c;数据包由于各种原因未能到达目标服务器&#xff0c;导致数据传输中断或延迟。那么&#xff0c;为什么会造成服务器丢包呢&#xff1f;下…

naive-ui-admin 表格去掉工具栏toolbar

使用naive-ui-admin的时候&#xff0c;有时候不需要显示工具栏&#xff0c;工具栏太占地方了。 1.在src/components/Table/src/props.ts 里面添加属性 showToolbar 默认显示&#xff0c;在不需要的地方传false。也可以默认不显示 &#xff0c;这个根据需求来。 2.在src/compo…

在SAP HANA中使用OData(二)

通常有两种方式通过OData来暴露SAP HANA中的数据库对象&#xff0c;一是直接使用Database Object&#xff0c;比如前一篇和本篇文章介绍的例子&#xff0c;这种方式针对于数据已经存在于SAP HANA中&#xff0c;在Repository中没有对应的设计时对象(Design-time Object)&#xf…

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…

Redis String 类型底层揭秘

目录 前言 String 类型低层数据结构 节省内存的数据结构 前言 Redis 的 string 是个 “万金油” &#xff0c;这么评价它不为过. 它可以保存Long 类型整数&#xff0c;字符串&#xff0c; 甚至二进制也可以保存。对于key&#xff0c;value 这样的单值&#xff0c;查询以及插…

[足式机器人]Part2 Dr. CAN学习笔记-Ch00-2 - 数学知识基础

本文仅供学习使用 本文参考: B站:DR_CAN 《控制之美(卷1)》 王天威 《控制之美(卷2)》 王天威 Dr. CAN学习笔记-Ch00 - 数学知识基础 Part2 4. Ch0-4 线性时不变系统中的冲激响应与卷积4.1 LIT System:Linear Time Invariant4.2 卷积 Convolution4.3 单位冲激 Unit Impulse—…

Linux安装Nginx详细步骤

1、创建两台虚拟机&#xff0c;分别为主机和从机&#xff0c;区别两台虚拟机的IP地址 2、将Nginx素材内容上传到/usr/local目录&#xff08;pcre,zlib,openssl,nginx&#xff09; 附件 3、安装pcre库   3.1 cd到/usr/local目录 3.2 tar -zxvf pcre-8.36.tar.gz 解压 3.3 cd…

matlab 方向向量约束的PCA快速粗配准

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 该方法由本人原创,目前尚未见有相关论文用到。具体原理看代码即可。 二、代码实现 clc;clear; %% ------…

在Arcgis中删除过滤Openstreetmap道路属性表中指定highway类型道路

一、导出道路类型并分析 1. 导出道路类型 选中highway属性列&#xff0c;选择汇总→确定 2. 分析 用Excel打开输出表&#xff0c;包含的道路类型如下 0.空值’’ 车辆可行驶道路&#xff08;和bfmap的并集&#xff09; 空值&#xff08;无定义道路&#xff09; 二、…

数据分析(二):学生成绩预测分析报告

目录 摘要 一、引言 二、 数据源介绍 三、 数据清洗和预处理 3.1 缺失值处理 3.2 异常值处理 3.3 数据编码 四、 探索性数据分析 4.1 可视化相关统计量 4.2 目标数据的分布情况 4.3 Pearson 相关性分析 五、 特征工程 5.1 特征构造 5.1.1 总饮酒量 5.1.2 整体关…

【前端知识点】

虚拟 dom&#xff1a; 虚拟 dom 就是 vue 通过 js 对象渲染虚拟 dom 的&#xff0c;虚拟 dom 的 js 对象包含节点的类型、属性、子节点等信息&#xff0c;这些虚拟 dom 节点会构成一棵树形结构&#xff0c;用来表示整个页面的结构。 当 vue 组件更新时&#xff0c;会通过 diff…

牛客前端八股文(每日更新)

1.说说HTML语义化&#xff1f; 得分点&#xff1a;语义化标签、利于页面内容结构化、利于无CSS页面可读、利于SEO、利于代码可读 1&#xff0c;标签语义化是指在开发时尽可能使用有语义的标签&#xff0c;比如header&#xff0c;footer&#xff0c;h&#xff0c;p&#xff0c…

Linux学习之system V

目录 一&#xff0c;system V共享内存 快速认识接口 shmget(shared memory get) shmat(shared memory attach) shmdt(shared memory delete) shmctl (shared memory control) 编写代码 综上那么共享内存与管道通信有什么区别&#xff1f; system v消息队列 system v信号…

浅谈 Linux fork 函数

文章目录 前言fork 基本概念代码演示示例1&#xff1a;体会 fork 函数返回值的作用示例2&#xff1a;创建多进程&#xff0c;加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉"&#xff0c;在这里就是 …

web安全学习笔记【15】——信息打点(5)

信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

非线性优化资料整理

做课题看了一些非线性优化的资料&#xff0c;整理一下&#xff0c;以方便查看&#xff1a; 优化的中文博客 数值优化|笔记整理&#xff08;8&#xff09;——带约束优化&#xff1a;引入&#xff0c;梯度投影法 (附代码)QP求解器对比对于MPC的QP求解器 数值优化| 二次规划的…

day02_前后端环境搭建(前端工程搭建,登录功能说明,后端项目搭建)

文章目录 1. 软件开发介绍1.1 软件开发流程1.2 角色分工1.3 软件环境1.4 系统的分类 2. 尚品甄选项目介绍2.1 电商基本概念2.1.1 电商简介2.1.2 电商模式B2BB2CB2B2CC2BC2CO2O 2.2 业务功能介绍2.3 系统架构介绍2.4 前后端分离开发 3. 前端工程搭建3.1 Element-Admin简介3.2 El…