文章目录

  • 【一】SQL的简介
  • 【二】SQL通用语法
  • 【三】SQL的分类
  • 【四】DDL操作数据库
    • 【1】创建数据库
    • 【2】删除数据库
    • 【3】使用数据库
  • 【五】DDL 操作表
    • 【1】查询表
    • 【2】创建表
    • 【3】删除表
    • 【4】修改表
  • 【六】navicat安装和使用
  • 【七】DML 操作数据
    • 【1】添加数据
    • 【2】修改数据
    • 【3】删除数据
  • 【八】DQL数据查询
    • 【1】基础查询
    • 【2】条件查询
    • 【3】排序查询
    • 【4】分组查询
    • 【5】分组查询
    • 【6】分页查询
  • 【九】约束
    • 【1】概念
    • 【2】分类
  • 【十】数据库设计
    • 【1】软件的研发步骤:
    • 【2】数据库设计概念:
    • 【3】数据库设计的步骤:
    • 【4】表关系:
  • 【十一】多表查询
    • 【1】内连接
    • 【2】外连接
  • 【十二】子查询
    • 【1】概念
    • 【2】例题
  • 【十三】事物
    • 【1】概述
    • 【2】语法
    • 【3】 事务的四大特征

【一】SQL的简介

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

【二】SQL通用语法

SQL语句可以单行或多行书写,以分号结尾。

MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。

注释:
单行注释:-- 注释内容 或 #注释内容(MySQL 特有)

使用-- 添加单行注释时,–后面一定要加空格,而#没有要求。

多行注释: /* 注释 */

【三】SQL的分类

DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。
DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
DML简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等。

【四】DDL操作数据库

【1】创建数据库

CREATE DATABASE 数据库名称;

–》而在创建数据库的时候,我们并不知道db1数据库是否已经存在,如果存在,再次创建db1数据库会报错误

为了避免以上错误,我们会在创建的时候先判断。
CREATE DATABASE IF NOT EXISTS 数据库名称;

【2】删除数据库

删除数据库
DROP DATABASE 数据库名称;
删除数据库(判断,如果存在则删除)
DROP DATABASE IF EXISTS 数据库名称;

【3】使用数据库

数据库创建好以后,要在数据库中创建表,需要先明确在哪个数据库中操作,此时就需要使用数据库。
使用数据库
USE 数据库名称
查看当前使用的数据库
SELECT DATABASE();

【五】DDL 操作表

操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。

【1】查询表

查询当下数据库下所有表名称
SHOW TABLES;
查询表的结构
DESC 表名称;

【2】创建表

CREATE TABLE表名(
字段名1 数据类型1,
字段名2 数据类型2,
字段名n 数据类型n
);
注意:最后一行末尾不加逗号
案例:创建一个学生表

create table student(id int,name varchar(10),gender char(1),birthday date,score double(5,2),email varchar(64),tel varchar(15),status tinyint
);



–》tinyint:小整数型,占一个字节
–》int:大整数类型,占四个字节
–》double:浮点类型
–》字段名double(总长度,小数点后保留的位数)
–》date:日期值。只包含年月日
–》datetime:混合日期和时间值。包含年月日时分秒
–》char:定长字符串。
–》varchar:变长字符串。

【3】删除表

删除表
DROP TABLE 表名;
删除表时判断是否存在
DROP TABLE IF EXISTS 表名;

【4】修改表

修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
添加一列
ALTERTABLE 表名 ADD 列名 数据类型;
修改数据类型
ALTERTABLE 表名 MODIFY 列名 新数据类型;
修改列名和数据类型
ALTERTABLE 表名 CHANGE 列名 新列名 新数据类型;
删除列
ALTERTABLE 表名 DROP 列名;

【六】navicat安装和使用

访问连接:点击进入 访问

【七】DML 操作数据

【1】添加数据

给指定的列添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
给全部列添加数据
INSERT INTO 表名 VALUES(值1,值2,…);
批量添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;

【2】修改数据

修改表数据
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
注意:

  1. 修改语句中如果不加条件,则将所有数据都修改!
  2. 像上面的语句中的中括号,表示在写sql语句中可以省略这部分

【3】删除数据

删除数据
DELETE FROM 表名 [WHERE 条件] ;
注意:
修改语句中如果不加条件,则将所有数据都删除!

【八】DQL数据查询

复制代码创建一个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,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

【1】基础查询

语法
查询多个字段

 SELECT 字段列表 FROM 表名;SELECT * FROM 表名; -- 查询所有数据,不要使用

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

起别名

AS: AS 也可以省略

【2】条件查询

语法

SELECT 字段列表 FROM 表名 WHERE 条件列表;
SELECT * FROM stu;-- 查询表SELECT * FROM stu WHERE age BETWEEN 20 AND 30;-- 查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息SELECT * FROM stu WHERE age LIKE 18;SELECT * FROM stu WHERE age<>18; -- 查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age!=18;SELECT* FROM stu WHERE age=18 OR age=20 OR age=22; -- 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
SELECT* FROM stu where age in(18,20,22);SELECT * FROM stu WHERE english is null;-- 查询英语成绩为 null的学员信息select *from stu where english is not null;SELECT * FROM stu WHERE NAME LIKE '张%'; -- 查询姓'马'的学员信息
SELECT * FROM stu WHERE NAME LIKE '_花%';-- 查询第二个字是'花'的学员信息
SELECT * FROM stu WHERE NAME LIKE '%德%';-- 查询名字中包含 '德' 的学员信息

模糊查询使用like关键字,可以使用通配符进行占位:
(1)_ : 代表单个任意字符
(2)% : 代表任意个数字符

【3】排序查询

语法
ASC : 升序排列 (默认值)
DESC : 降序排列

SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …; 1
SELECT * FROM stu ORDER BY age ASC;-- 查询学生信息,按照年龄升序排列SELECT * FROM stu ORDER BY math desc;-- 查询学生信息,按照数学成绩降序排列SELECT * FROM stu ORDER BY math desc,english ASC;-- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列

【4】分组查询

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

函数名 功能
count(列名) 统计数量
max(列名) 最大值
min(列名) 最小值
sum(列名) 求和
avg(列名) 平均值

语法:

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

注意: null 值不参与所有聚合函数运算

SELECT COUNT(*) FROM stu;-- 统计班级一共有多少个学生SELECT MAX(math) FROM stu;-- 查询数学成绩的最高分SELECT MIN(math) FROM stu;-- 查询数学成绩的最低分SELECT SUM(math) FROM stu;-- 查询数学成绩的总分SELECT AVG(math) FROM stu;-- 查询数学成绩的平均分SELECT MIN(english) FROM stu;-- 查询英语成绩的最低分

【5】分组查询

** 语法:**

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

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

SELECT sex,AVG(math) FROM stu GROUP BY sex;
-- 查询男同学和女同学各自的数学平均分
SELECT sex,AVG(math) FROM stu GROUP BY sex;
-- 查询男同学和女同学各自的数学平均分,以及各自人数
SELECT sex,AVG(math),COUNT(*) FROM stu where math>70 GROUP BY sex;
-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
SELECT sex,AVG(math),COUNT(*) FROM stu WHERE math>70 GROUP BY sex having count(*)>2;
-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的

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

【6】分页查询

** 语法:**

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

注意: 上述语句中的起始索引是从0开始

-- 从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0,3;
-- 每页显示3条数据,查询第1页数据
SELECT * FROM stu LIMIT 0,3;
-- 每页显示3条数据,查询第2页数据
SELECT * FROM stu LIMIT 3,3;
-- 每页显示3条数据,查询第3页数据
SELECT * FROM stu LIMIT 6,3;

从上面的练习推导出起始索引计算公式: 起始索引 = (当前页码 - 1) * 每页显示的条数 1

提示:
1.分页查询limit是MySQL数据库的方言
2.Oracle分页查询使用rownumber
3.SQL Server分页查询使用top

【九】约束

【1】概念

(1)约束是作用于表中列上的规则,用于限制加入表的数据
例如:我们可以给id列加约束,让其值不能重复,不能为null值。
(2)约束的存在保证了数据库中数据的正确性、有效性和完整性
添加约束可以在添加数据的时候就限制不正确的数据,年龄是3000,数学成绩是-5分这样无效的数据,继而保障数据的完整性

【2】分类


(1)非空约束
概念: 非空约束用于保证列中所有数据不能有NULL值
语法:

-- 创建表时添加非空约束
CREATE TABLE 表名( 列名 数据类型 NOT NULL,
…
);
-- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
-- 删除约束
ALTER TABLE 表名 MODIFY 字段名 数据类型;

(2)唯一约束
概念: 唯一约束用于保证列中所有数据各不相同
语法:

-- 创建表时添加唯一约束
CREATE TABLE 表名(
列名 数据类型 UNIQUE [AUTO_INCREMENT], -- AUTO_INCREMENT: 当不指定值时自动增长
…
);
CREATE TABLE 表名(
列名 数据类型, …[CONSTRAINT] [约束名称] UNIQUE(列名)
);
-- 建完表后添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
-- 删除约束
ALTER TABLE 表名 DROP INDEX 字段名;

(3)主键约束
概念: 主键是一行数据的唯一标识,要求非空且唯一
一张表只能有一个主键
语法:

-- 创建表时添加主键约束
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
…
);
CREATE TABLE 表名(
列名 数据类型,
[CONSTRAINT] [约束名称] PRIMARY KEY(列名)
);
-- 建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
-- 删除约束
ALTER TABLE 表名 DROP PRIMARY KEY;

(4)默认约束
概念: 保存数据时,未指定值则采用默认值
语法:

-- 创建表时添加默认约束
CREATE TABLE 表名( 列名 数据类型 DEFAULT 默认值,
…
);
-- 建完表后添加默认约束
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
-- 删除约束
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

(5)外键约束
** 概述: ** 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。
语法:

-- 创建表时添加外键约束
CREATE TABLE 表名(
列名 数据类型,
…
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-- 删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 重新添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);


【十】数据库设计

【1】软件的研发步骤:

【2】数据库设计概念:

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

【3】数据库设计的步骤:

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

【4】表关系:

(1)一对一
如:用户 和 用户详情
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能

(2)一对多
如:部门 和 员工
一个部门对应多个员工,一个员工对应一个部门

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

-- 订单表
CREATE TABLE tb_order(id int PRIMARY key auto_increment,payment double(10,2),payment_type TINYINT,status TINYINT);-- 商品表
CREATE TABLE tb_goods(id int PRIMARY KEY auto_increment,title VARCHAR(100),price DOUBLE(10,2)
);-- 订单商品中间表
CREATE TABLE tb_order_goods(id int PRIMARY KEY auto_increment,order_id int,goods_id int,count int
);-- 建完表后,添加外键
alter table tb_order_goods add constraint fl_order_id FOREIGN key(order_id) REFERENCES tb_order(id);
alter table tb_order_goods add constraint fl_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);

【十一】多表查询

多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。

【1】内连接

语法:

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

【2】外连接


概念:
左外连接:相当于查询A表所有数据和交集部分数据
右外连接:相当于查询B表所有数据和交集部分数据
语法:

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

【十二】子查询

【1】概念

查询中嵌套查询,称嵌套查询为子查询。
子查询根据查询结果不同,作用不同:
(1)子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断

select 字段列表 from 表 where 字段名=(子查询);

(2)子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断

select 字段列表 from 表 where 字段名 in (子查询);

(3)子查询语句结果是多行多列,子查询语句作为虚拟表

select 字段列表 from (子查询) where 条件;

【2】例题

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),
description VARCHAR(50)
);-- 员工表
CREATE TABLE emp(id INT PRIMARY KEY, -- 员工idename VARCHAR(50),-- 员工姓名job_id INT,-- 职务idmgr INT,-- 上级领导joindate DATE,salary DECIMAL(7,2), -- 工资 bonus DECIMAL(7,2), -- 奖金 dept_id INT -- 所在部门编号
);-- 添加外键
ALTER TABLE emp ADD CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job(id);
ALTER TABLE emp ADD 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, 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. 员工编号,员工姓名,工资 信息在emp 员工表中
2. 职务名称,职务描述 信息在 job 职务表中
3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id
4. */
-- 方式一 :隐式内连接
SELECT emp.id, emp.ename, emp.salary, job.jname, job.description FROM emp, job WHERE emp.job_id = job.id; -- 方式二 :显式内连接
SELECT emp.id, emp.ename, emp.salary, job.jname, job.description FROM emp INNER JOIN job ON emp.job_id = job.id;
--  查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/* 分析:
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.description, dept.dname, dept.loc FROM emp, job, dept WHERE emp.job_id = job.id and dept.id = emp.dept_id ;
-- 方式二 :显式内连接
SELECT emp.id, emp.ename, emp.salary, job.jname, 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
-- 查询员工姓名,工资,工资等级
/* 分析:
6. 员工姓名,工资 信息在emp 员工表中
7. 工资等级 信息在 salarygrade 工资等级表中
8. 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```
-- 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
/* 分析:
9. 员工编号,员工姓名,工资 信息在emp 员工表中
10. 职务名称,职务描述 信息在 job 职务表中
11. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id
12. 部门名称,部门位置 来自于 部门表 dept
13. dept 和 emp 一对多关系 dept.id = emp.dept_id
14. 工资等级 信息在 salarygrade 工资等级表中
15. emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
*/
SELEC Temp.id,emp.ename, emp.salary, job.jname, 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;
-- 查询出部门编号、部门名称、部门位置、部门人数
/* 分析:
1. 部门编号、部门名称、部门位置 来自于部门 dept 表
2. 部门人数: 在emp表中 按照dept_id 进行分组,然后count(*)统计数量
3. 使用子查询,让部门表和分组后的表进行内连接
*/
-- 根据部门id分组查询每一个部门id和员工数
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

【十三】事物

【1】概述

(1)数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。
(2)事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。
(3)事务是一个不可分割的工作逻辑单元。

【2】语法

1.开启事务

START TRANSACTION;
或者
BEGIN;

2.提交事务

commit;

3.回滚事务

rollback;

例子:

-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于500 -- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四'; 出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行 -- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三'; -- 提交事务
COMMIT; -- 回滚事务
ROLLBACK;

【3】 事务的四大特征

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

参考:黑马程序员、数据库系统概论第5版

文章目录

  • 【一】SQL的简介
  • 【二】SQL通用语法
  • 【三】SQL的分类
  • 【四】DDL操作数据库
    • 【1】创建数据库
    • 【2】删除数据库
    • 【3】使用数据库
  • 【五】DDL 操作表
    • 【1】查询表
    • 【2】创建表
    • 【3】删除表
    • 【4】修改表
  • 【六】navicat安装和使用
  • 【七】DML 操作数据
    • 【1】添加数据
    • 【2】修改数据
    • 【3】删除数据
  • 【八】DQL数据查询
    • 【1】基础查询
    • 【2】条件查询
    • 【3】排序查询
    • 【4】分组查询
    • 【5】分组查询
    • 【6】分页查询
  • 【九】约束
    • 【1】概念
    • 【2】分类
  • 【十】数据库设计
    • 【1】软件的研发步骤:
    • 【2】数据库设计概念:
    • 【3】数据库设计的步骤:
    • 【4】表关系:
  • 【十一】多表查询
    • 【1】内连接
    • 【2】外连接
  • 【十二】子查询
    • 【1】概念
    • 【2】例题
  • 【十三】事物
    • 【1】概述
    • 【2】语法
    • 【3】 事务的四大特征

MySQL基础必会,简单易懂相关推荐

  1. mysql基础(全,必看)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

  2. mysql 基础(学习mysql必看)

    Mysql基础 Mysql是一种cs架构的系统. 其中s是:存放mysql数据库的机器,上面运行着mysqld服务,用来监听客户端的访问,并把结果返回给客户端 c是:客户端机器,用来访问mysql服务 ...

  3. php与mysql基础教程第二版_PHP 和 MySQL 基础教程(二)

    本篇文章给大家带来的内容是关于PHP 和 MySQL 基础教程(二),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据验证 清理空格 trim 函数将清除数据头尾的空格,它的语法是 ...

  4. MySQL 基础 ———— 分组查询

    引言 承接上一篇<MySQL 基础 ----高频函数总结>,本篇单独针对分组查询进行简单的总结和归纳,并为后续更为复杂的DQL 语句做好铺垫. 查询语句: SELECT AVG(salar ...

  5. 最全MySQL基础篇

    文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...

  6. MySQL基础学习笔记(带目录)

    MySQL学习笔记 MySQL产品的介绍和安装 MySQL服务的启动和停止 MySQL服务的登陆和退出 MySQL的常见命令 MySQL的语法规范 MySQL基础查询 1.起别名 2. 去重disti ...

  7. Mysql 中 “必知” 的单行处理函数

    Mysql 中必知的单行函数 每博一文案 钱钟书就曾感慨道,在我一知半解的几国语言中,没有比中国古语 所谓的素交,更能表现出友谊骨髓,素是一切颜色的基础,同时也是 一切颜色的调和,像白日包含了基色,真 ...

  8. MySQL基础(二十八)索引优化与查询优化

    都有哪些维度可以进行数据库调优?简言之: 索引失效.没有充分利用到索引--索引建立 关联查询太多JOIN (设计缺陷或不得已的需求)--SQL优化 服务器调优及各个参数设置(缓冲.线程数等)---调整 ...

  9. 《MySQL知必会》第一章了解SQL

    大家好! 我是小黄,很高兴又跟大家见面啦 ! 今天更新的是: <MySQL知必会>第一章了解SQL. 往期检索:程序设计学习笔记--目录 创建时间:2020年12月5日 软件版本: Min ...

最新文章

  1. 固定资产的完全报废接口
  2. 无法读取内存属于错误吗_深入了解 JavaScript 内存泄露
  3. 实战:搭建CA认证中心,使用CA证书搭建HTTPS
  4. [导入]对iis写权限的利用
  5. android openGl纹理的使用
  6. ftp服务器需要什么系统,ftp服务器需要什么系统
  7. 内联函数和宏定义的区别
  8. Git工作笔记003---Git常用命令总结
  9. ubuntu16 下 源码配置Lnmp环境
  10. input输入框只能输入正整数
  11. Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图
  12. uva - Broken Keyboard (a.k.a. Beiju Text)(链表)
  13. verilog语法基础
  14. web前端开发面试题(七)
  15. 【C语言】深度剖析数据在内存中的存储
  16. 新冠病毒研究进展:维生素D或许能挽救新冠患者
  17. PTA 校选拔 7-10 宇航员的寻宝图(BFS)
  18. 【解题报告】2014ACM/ICPC亚洲区广州站
  19. Cloudera Manager —— 端到端的企业数据中心管理工具
  20. 3Dmax Script 自动减面

热门文章

  1. Taro下拉刷新,上拉加载更多
  2. Android studio中使用NumCpp最新开源库
  3. c语言scanf_s函数详解,scanf_s()函数
  4. Flutter 中 GestureDetector 的使用误区
  5. [AS日记]MacOS的Android Studio卡在Building Gradle Project info走不动 的处理方法
  6. 微信域名防封跳转系统的原理,微信域名防封的注意点
  7. 在Linux终端中自定义Bash配色和提示内容
  8. 华为openEuler系统-虚拟机(VMware)安装
  9. 最新的单片机_涨势比深圳的房价还快!研究了39个ST单片机热门型号后,我发现了这些特点!...
  10. 【电脑使用】修改注册表——让有密码的电脑开机自动登录