前言: 大家好啊!😄 本文是我在准备Java八股时,想着系统的复习一下MySQL的知识。就从基础开始了,本文结合了我找到了八股内容和我自己的理解写的,后面会带上参考文章的链接,大家也可以直接去看大佬的文章。文章主要是MySQL的基础。后续文章会写一些深入一点的原理。下面我们一起开始学习吧,保证你看完会有质的提升!🫡
数据库基础
什么是数据库?
学习数据库之前想了解四个名词:数据库、数据库管理系统、数据库系统、数据库管理员。下面利用图书馆的例子来详细解释他们的意思和联系。
- 数据库(
DataBase-DB):它就像是图书馆里,书架上存放的所有书籍和资料。从技术上讲,数据库就是按照一定数据模型组织、描述和储存起来的、可以被各种用户共享的结构化数据的集合。它就是我们最终要存取的核心——信息本身。 - 数据库管理系统 (
Database Management System - DBMS): 它就像是整个图书馆的管理系统,包括图书的分类编目规则、借阅归还流程、安全检查系统等等。从技术上讲,DBMS 是一种大型软件,比如我们常用的 MySQL、Oracle、PostgreSQL 软件。它的核心职责是科学地组织和存储数据、高效地获取和维护数据;为我们屏蔽了底层文件操作的复杂性,提供了一套标准接口(如 SQL)来操纵数据,并负责并发控制、事务管理、权限控制等复杂问题。 - 数据库系统 (Database System - DBS): 它就是整个正常运转的图书馆。这是一个更大的概念,不仅包括书(DB)和管理系统(DBMS),还包括了硬件、应用和使用的人。
- 数据库管理员 (Database Administrator - DBA ): 他就是图书馆的馆长,负责整个数据库系统正常运行。他的职责非常广泛,包括数据库的设计、安装、监控、性能调优、备份与恢复、安全管理等等,确保整个系统的稳定、高效和安全。
我们经常使用的
MySQL其实就是一个DBMS,他可以管理多个数据库(DB)。
DBMS的主要功能
有四大核心功能
- 数据定义: 这是 DBMS 的基础。它提供了一套数据定义语言,让我们能够创建、修改和删除数据库中的各种对象。这不仅仅是定义表的结构(比如字段名、数据类型),还包括定义视图、索引、触发器、存储过程等。
- 数据操作:核心就是增删改查(
CRUD)操作, - 数据控制:保证数据正确、安全、可靠的关键,通常包含并发控制、事务管理、完整性约束、权限控制、安全性限制等功能。
- 数据库维护:这部分功能是为了保障数据库系统的长期稳定运行。它包括了数据的导入导出、数据库的备份与恢复、性能监控与分析、以及系统日志管理等。
数据库的类型
关系型数据库(RDBMS)
例如MySQL、PostgreSQL、ORacle
NoSQL数据库
它们的共同特点是为了极致的性能和水平扩展能力,在某些方面(通常是事务)做了妥协。
- 键值数据库:例如Redis(后面我会专门写一篇文章来讲Redis数据库);这种数据库就是
key-value,内存操作,性能高,速度快,适合做缓存。 - 文档数据库:例如MongoDB;它存储的是半结构化的文档,结构灵活,不需要预定义表节后,适合那些数据结构多变、快速迭代的业务。
- 列式数据库:例如HBase、Cassandra;
- 图形数据路:例如Neo4j。
这些简单了解就可以。
NewSQL数据库
由于 NoSQL 不支持事务,很多对于数据安全要去非常高的系统(比如财务系统、订单系统、交易系统)就不太适合使用了。不过,这类系统往往有存储大量数据的需求。这是就需要NewSQL了。
NewSQL就是:分布式存储+SQL+事务。
NewSQL数据库设计的特点:
- 横向扩展(Scale Out) : 通过增加机器的方式来提高系统的负载能力。与之类似的是 Scale Up(纵向扩展),升级硬件设备的方式来提高系统的负载能力。
- 强一致性(Strict Consistency):在任意时刻,所有节点中的数据是一样的。
- 高可用(High Availability):系统几乎可以一直提供服务。
- 支持标准 SQL(Structured Query Language) :PostgreSQL、MySQL、Oracle 等关系型数据库都支持 SQL 。
- 事务(ACID) : 原子性(Atomicity)、一致性(Consistency)、 隔离性(Isolation); 持久性(Durability)。
- 兼容主流关系型数据库 : 兼容 MySQL、Oracle、PostgreSQL 等常用关系型数据库。
- 云原生 (Cloud Native):可在公有云、私有云、混合云中实现部署工具化、自动化。
- HTAP(Hybrid Transactional/Analytical Processing) :支持 OLTP 和 OLAP 混合处理。
什么是元组、码、候选码等
- 元组:是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。
- 码:是能唯一标识实体的属性,对应表中的列。
- 候选码:若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是候选码。
- 主码:主码也叫主键。主码是从候选码中选出来的。 一个实体集中只能有一个主码,但可以有多个候选码。
- 外码:外码也叫外键。如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。
- 主属性:候选码中出现过的属性称为主属性。比如关系 工人(工号,身份证号,姓名,性别,部门). 显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。
- 非主属性:不包含在任何一个候选码中的属性称为非主属性。比如在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。
什么是ER图
ER 图 全称是 Entity Relationship Diagram(实体联系图),提供了表示实体类型、属性和联系的方法。
ER 图由下面 3 个要素组成:
- 实体:通常是现实世界的业务对象,当然使用一些逻辑对象也可以。比如对于一个校园管理系统,会涉及学生、教师、课程、班级等等实体。在 ER 图中,实体使用矩形框表示。
- 属性:即某个实体拥有的属性,属性用来描述组成实体的要素,对于产品设计来说可以理解为字段。在 ER 图中,属性使用椭圆形表示。
- 联系:即实体与实体之间的关系,在 ER 图中用菱形表示,这个关系不仅有业务关联关系,还能通过数字表示实体之间的数量对照关系。例如,一个班级会有多个学生就是一种实体间的联系。可以是1 对 1(1:1)、1 对多(1: N)、多对多(M: N)。
如图所示:

数据库范式
数据库有三种范式
- 1NF(第一范式):属性不可再分;第一范式主要是确保数据表中每个字段的值必须具有原子性,最小数据单元。
- 2NF(第二范式):1NF 的基础之上,消除了非主属性对于码的部分函数依赖;而且所有非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。
- 3NF(第三范式):3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。也就是说,要求数据表中的所有非主键字段不能依赖于其他非主键字段(即,不能存在非主属性A 依赖于非主属性 B,非主属性B依赖于主键C的情况,即存在“A一B一C”的决定关系)。通俗地讲,该规则的意思是所有 非主键属性 之间不能有依赖关系,必须 相互独立。
下面举个例子来帮助我们了解。
第一范式示例:user表存储id,username(用户名),password(密码),user_info(用户信息)。这样子设计违反了第一范式,user_info存储了两种信息,还可以再分,可以分为地址(address)和电话号码(phone)两个字段。

分开之后如下,符合第一范式。

第二范式示例:score表存储了student_id(学生id),course_id(课程id),course_name(课程名称),score(课程分数)这里面的联合主键是学生id和课程id。它们才可以确定一个学生的具体的一个课程的分数。score字段是完全依赖于主键的(学生id,课程id),才可以确定具体的分数,但是course_name不是完全依赖于主键的,它根据course_id就可以确定自己的课程名称。违反了第二范式。

修改后符合第二范式,分为两张表


第三范式示例:goods表,id是主键,category_id(分类id),category_name(分类名称),goods_name(商品名称),price商品价格。虽然非主键字段(category_id,category_name,goods_name,price)都依赖于主键(id),但是category_name还依赖于category_id(非主键id)不符合第三范式。

修改后:


主键和外键
- 主键(Primary Key):它的核心作用是唯一标识表中的每一行数据。因此,主键列的值必须是唯一的 (Unique) 且不能为空 (Not Null)。一张表只能有一个主键。主键保证了实体完整性。
- 外键(Foregin Key):它的核心作用是建立并强制两张表之间的关联关系。一张表中的外键列,其值必须对应另一张表中某行的主键值(或者是一个 NULL 值)。因此,外键的值可以重复,也可以为空。一张表可以有多个外键,分别关联到不同的表。外键保证了引用完整性。
主键的特点
- 唯一性:主键的值在表中必须是唯一的,不能重复。
- 非空性:主键字段的值不能为空,不能为空值被认为是一个无效的主键值。
- 稳定性:主键值一旦确定,就不应该被修改。
- 永久性:主键值在整个数据的生命周期中是唯一不变的。
主键的作用是确保表中每一行数据都能够被唯一地标识和访问。常见的主键选择是使用自增长的整数或具有唯一性的字段(如身份证号码、邮箱等)。
外键的特点
- 引用关系:外键字段关联到另一个表的主键字段,以建立两个表之间的关系。
- 数据一致性:外键用于保持表之间的数据一致性,确保引用的数据存在于被引用的表中。
- 可空性:外键字段可以允许为空(null),表示该行数据没有关联到其他表的数据。
外键的作用是实现表与表之间的关联,通过外键可以在关联表之间进行数据查询和操作。外键可以用来实现数据的完整性约束,例如实现级联更新或级联删除等操作
drop、delete和truncate区别
drop(丢弃数据):drop table 表名,直接将表都删除掉,在删除表的时候使用。truncate(清空数据) :truncate table 表名,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。delete(删除数据) :delete from 表名 where 列名=值,删除某一行的数据,如果不加 where 子句和truncate table 表名作用类似。
truncate 和不带 where子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结构也会删除,也就是执行drop 之后对应的表不复存在。
truncate 和 drop 属于 DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。而 delete 语句是 DML (数据库操作语言)语句,这个操作会放到 rollback segment 中,事务提交之后才生效。
DML 语句和 DDL 语句区别:
DML 是数据库操作语言(Data Manipulation Language)的缩写,是指对数据库中表记录的操作,主要包括表记录的插入、更新、删除和查询,是开发人员日常使用最频繁的操作。
DDL (Data Definition Language)是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。
SQL语法
基本概念
数据库属术语
- 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。
- 数据表(table): 某种特定类型数据的结构化清单。
- 模式(schema): 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。
- 列(column): 表中的一个字段。所有表都是由一个或多个列组成的。
- 行(row):表中的一个记录。
- 主键(primary key): 一列(或一组列),其值能够唯一标识表中每一行。
SQL语法要点
- SQL语句不区分大小写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。例如:
SELECT与select、Select是相同的。 - 多条 SQL 语句必须以分号(;)分隔
- 处理 SQL 语句时,所有空格都被忽略。
SQL 语句可以写成一行,也可以分写为多行。
-- 一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';
-- 多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
SQL 支持三种注释:
## 注释1
-- 注释2
/* 注释3 */
SQL分类
- 数据定义语言(DDL):数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。核心指令是:
CREATE、ALTER、DROP。 - 数据操作语言(DML):数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。DML 的主要功能是访问数据,因此其语法都是以读写数据库为主。DML 的核心指令是
INSERT、UPDATE、DELETE、SELECT。这四个指令合称 CRUD(Create, Read,Update, Delete),即增删改查。 - 事务控制语言(TCL):事务控制语言 (Transaction Control Language, TCL) 用于管理数据库中的事务。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。TCL 的核心指令是
COMMIT、ROLLBACK。 - 数据控制语言(DCL):数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。DCL 的核心指令是
GRANT、REVOKE。
下面介绍DML语法,主要是实现增删改查
增删改查
插入数据:
INSERT INTO语句用于向表中插入新记录。
插入完整的行
# 插入一行
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com');
# 插入多行
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com'), (12, 'user1', 'user1', 'xxxx@163.com'), (18, 'user2', 'user2', 'xxxx@163.com');
插入行的一部分
INSERT INTO user(username, password, email)
VALUES ('admin', 'admin', 'xxxx@163.com');
插入查询出来的数据
INSERT INTO user(username)
SELECT name
FROM account;
更新数据:
UPDATE语句用于更新表中的记录
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
删除数据
DELETE语句用于删除表中的记录。
TRUNCATE TABLE可以清空表,也就是删除所有行。说明:TRUNCATE 语句不属于 DML 语法而是 DDL 语法。
删除表中的指定数据
DELETE FROM user
WHERE username = 'robot';
清空表中的数据
TRUNCATE TABLE user;
查询数据
SELECT语句用于从数据库中查询数据。
DISTINCT用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。
LIMIT限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。ASC:升序(默认)DESC:降序
查询单列
SELECT prod_name
FROM products;
查询多列
SELECT prod_id, prod_name, prod_price
FROM products;
查询所有列
SELECT *
FROM products;
查询不同的值
SELECT DISTINCT
vend_id FROM products;
限制查询结果
-- 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
-- 返回第 3 ~ 5 行
SELECT * FROM mytable LIMIT 2, 3;
排序
排序
order by用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,可以使用desc关键字。
order by对多列排序的时候,先排序的列放前面,后排序的列放后面。并且,不同的列可以有不同的排序规则。
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
分组
group by 子句将记录分组到汇总行中。
group by 为每个组返回一个记录。
group by 通常还涉及聚合count,max,sum,avg 等。
group by 可以按一列或多列进行分组。
group by 按分组字段进行排序后,order by 可以以汇总字段来进行排序。
分组
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
分组后排序
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
having
having 用于对汇总的 group by 结果进行过滤。
having 一般都是和 group by 连用。
where 和 having 可以在相同的查询中。
SELECT cust_name, COUNT(*) AS NumberOfOrders
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) > 1;
where
- WHERE 子句用于过滤记录,即缩小访问数据的范围。
- WHERE 后跟一个返回 true 或 false 的条件。
- WHERE 可以与 SELECT,UPDATE 和 DELETE 一起使用。
- 可以在 WHERE 子句中使用的操作符。

SELECT * FROM Customers
WHERE cust_name = 'Kids Place';
UPDATE Customers
SET cust_name = 'Jack Jones'
WHERE cust_name = 'Kids Place';
DELETE FROM Customers
WHERE cust_name = 'Kids Place';
IN和BETWEEN
IN操作符在WHERE子句中使用,作用是在指定的几个特定值中任选一个值。
BETWEEN操作符在WHERE子句中使用,作用是选取介于某个范围内的值。
SELECT *
FROM products
WHERE vend_id IN ('DLL01', 'BRS01');
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
AND、OR、NOT
AND、OR、NOT 是用于对过滤条件的逻辑处理指令。
AND 优先级高于 OR,为了明确处理顺序,可以使用 ()。
AND 操作符表示左右条件都要满足。
OR 操作符表示左右条件满足任意一个即可。
NOT 操作符用于否定一个条件。
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
LIKE
LIKE 操作符在 WHERE 子句中使用,作用是确定字符串是否匹配模式。
只有字段是文本值时才使用 LIKE。
LIKE 支持两个通配符匹配选项:% 和 _。
不要滥用通配符,通配符位于开头处匹配会非常慢。
% 表示任何字符出现任意次数。
_ 表示任何字符出现一次。
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '%bean bag%';
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '__ inch teddy bear';
连接
JOIN 是“连接”的意思,顾名思义,SQL JOIN 子句用于将两个或者多个表联合起来进行查询。
select table1.column1, table2.column2...
from table1
join table2
on table1.common_column1 = table2.common_column2;
table1.common_column1 = table2.common_column2 是连接条件,只有满足此条件的记录才会合并为一行。您可以使用多个运算符来连接表,例如 =、>、<、<>、<=、>=、!=、between、like 或者 not,但是最常见的是使用 =。


对于 INNER JOIN 来说,还有一种隐式的写法,称为 “隐式内连接”,也就是没有 INNER JOIN 关键字,使用 WHERE 语句实现内连接的功能
# 隐式内连接
select c.cust_name, o.order_num
from Customers c, Orders o
where c.cust_id = o.cust_id
order by c.cust_name;
# 显式内连接
select c.cust_name, o.order_num
from Customers c inner join Orders o
using(cust_id)
order by c.cust_name;
组合
UNION 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 UNION 中参与查询的提取行。
UNION 基本规则:
- 所有查询的列数和列顺序必须相同。
- 每个查询中涉及表的列的数据类型必须相同或兼容。
- 通常返回的列名取自第一个查询。
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
JOIN vs UNION:
- JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。
- UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。
函数
文本处理

日期时间处理
日期格式:YYYY-MM-DD
时间格式:HH:MM:SS

数值处理

汇总

SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable
数据定义
数据库
创建数据库
CREATE DATABASE test;
删除数据库
DROP DATABASE test;
选择数据库
USE test;
数据表
创建数据表
# 普通创建
CREATE TABLE user (
id int(10) unsigned NOT NULL COMMENT 'Id',
username varchar(64) NOT NULL DEFAULT 'default' COMMENT '用户名',
password varchar(64) NOT NULL DEFAULT 'default' COMMENT '密码',
email varchar(64) NOT NULL DEFAULT 'default' COMMENT '邮箱'
) COMMENT='用户表';
# 根据已有的表创建新表
CREATE TABLE vip_user AS
SELECT * FROM user;
删除数据表
DROP TABLE user;
修改数据表
# 添加列
ALTER TABLE user
ADD age int(3);
#删除列
ALTER TABLE user
DROP COLUMN age;
#修改列
ALTER TABLE `user`
MODIFY COLUMN age tinyint;
#添加主键
ALTER TABLE user
ADD PRIMARY KEY (id);
#删除主键
ALTER TABLE user
DROP PRIMARY KEY;
视图
视图是基于 SQL 语句的结果集的可视化的表。视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。
作用:
- 简化复杂的 SQL 操作,比如复杂的联结;
- 只使用实际表的一部分数据;
- 通过只给用户访问视图的权限,保证数据的安全性;
- 更改数据格式和表示
创建视图
CREATE VIEW top_10_user_view AS
SELECT id, username
FROM user
WHERE id < 10;
删除视图
DROP VIEW top_10_user_view;
索引
**优点:**使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
**缺点:**创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。索引需要使用物理文件存储,也会耗费一定空间。
但是,使用索引一定能提高查询性能吗?
大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
#创建索引
CREATE INDEX user_index
ON user (id);
#添加索引
ALTER table user ADD INDEX user_index(id)
#创建唯一索引
CREATE UNIQUE INDEX user_index
ON user (id);
#删除索引
ALTER TABLE user
DROP INDEX user_index;
参考
JavaGuide
数据库三大范式详解(图文详解清晰易懂)
MySQL基础:什么是主键和外键?它们之间有什么区别?外键有什么问题?
&spm=1001.2101.3001.5002&articleId=156059520&d=1&t=3&u=f10535273abe4548850bcb88bdbaf0b4)
1808

被折叠的 条评论
为什么被折叠?



