Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL从入门到精通

MySQL数据库从入门到精通超详细版本(看这一篇就够了!)

作者:笠码

这篇文章主要介绍了MySQL数据库从入门到精通超详细版本的相关资料,逐步深入到复杂的查询操作、优化技巧、事务处理等内容,帮助你全面掌握MySQL的使用,成为MySQL的高手,需要的朋友可以参考下

一、初识数据库

1. 数据库服务器、数据库与表之间的关系

2. SQL简介

2.1 什么是SQL

SQL(Structured Query Language)是结构化查询语言的简称,是一种数据库查询和程序设计语言,用于读取数据,以及查询、更新和管理关系数据库

2.2 SQL分类

3.MySQL架构

 二、库的操作

1.查看数据库

1.1 语法

show databases;

2.创建数据库

2.1 语法

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_option] ...
create_option: [DEFAULT] {
 CHARACTER SET [=] charset_name
 | COLLATE [=] collation_name
 | ENCRYPTION [=] {'Y' | 'N'}
}

3.字符集编码和校验规则

3.1 查看数据库支持的字符集编码

show charset;

3.2 数据库支持的排序规则

show collation;

4.查看创建库的语句

4.1 语法

show create database db_name

5.修改数据库

5.1 语法

ALTER {DATABASE | SCHEMA} [db_name]
 alter_option ...
alter_option: {
 [DEFAULT] CHARACTER SET [=] charset_name
 | [DEFAULT] COLLATE [=] collation_name
 | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'}
 | READ ONLY [=] {DEFAULT | 0 | 1}
}

6.删除数据库

6.1 语法

 DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

6.2 注意事项

三、数据类型

1.数据值类型

1.1 类型列表

2.字符串类型

2.1 类型列表

2.2 char与varchar的区别

3.日期类型

3.1 类型列表

 3.2 其他

四、表操作

1.查看所有表

1.1 语法

show tables;

2.创建表

2.1 语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
 field datatype [约束] [comment '注解内容']
 [, field datatype [约束] [comment '注解内容']] ...
) [engine 存储引擎] [character set 字符集] [collate 排序规则];

3.查看表结构

3.1 语法

desc 表名;

4.修改表

4.1 语法

ALTER TABLE tbl_name [alter_option [, alter_option] ...];
alter_option: {
 table_options
 | ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
 | MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
 | DROP [COLUMN] col_name
 | RENAME COLUMN old_col_name TO new_col_name
 | RENAME [TO | AS] new_tbl_name

5.删除表

5.1 语法

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

五、增删改查操作(CRUD)

1.Create 新增

1.1 语法

INSERT [INTO] table_name
 [(column [, column] ...)]
VALUES
 (value_list) [, (value_list)] ...
value_list: value, [, value] ...

1.2 单行数据全列插入

1.3 单行数据指定列插入

1.4 多行数据指定列插入

2.Retrieve 检索

2.1 语法

SELECT
 [DISTINCT]
 select_expr [, select_expr] ...
 [FROM table_references]
 [WHERE where_condition]
 [GROUP BY {col_name | expr}, ...]
 [HAVING where_condition]
 [ORDER BY {col_name | expr } [ASC | DESC], ... ]
 [LIMIT {[offset,] row_count | row_count OFFSET offset}]

2.2 全列查询

2.3 指定列查询

2.4 查询字段为表达式

2.5 为查询结果指定别名

2.6 结果去重查询

2.7 where条件查询

2.8 Order by 排序

-- ASC 为升序(从⼩到⼤)
-- DESC 为降序(从⼤到⼩)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC | 
DESC], ... ;

2.9 分页查询

-- 起始下标为 0
-- 从 0 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;
-- 从 start 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;
-- 从 start 开始,筛选 num 条结果,⽐第⼆种⽤法更明确,建议使⽤
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;

3.Update 修改

3.1 语法

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
 SET assignment [, assignment] ...
 [WHERE where_condition]
 [ORDER BY ...]
 [LIMIT row_count]

3.2 注意事项

4.Delete 删除

4.1 语法

DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]

4.2 注意事项

5.截断表

5.1 语法

TRUNCATE [TABLE] tbl_name

5.2 注意事项

6.插入查询结果

6.1 语法 

 INSERT INTO table_name [(column [, column ...])] SELECT ...

7.聚合函数

7.1 常用函数

8.Group by 分组查询

group by 子句的作用是通过一定的规则将一个数据集划分成若干的小的分组,然后针对若干个分组进行数据处理

8.1 语法

SELECT {col_name | expr} ,... ,aggregate_function (aggregate_expr)
 FROM table_references
 GROUP BY {col_name | expr}, ... 
 [HAVING where_condition]

8.2 having子句

使用GROUP BY对结果进行分组处理之后,对分组的结果进行过滤时,不能使用where子句,而是要使用having子句

8.3 having与where的区别

六、数据库约束

1.概念

数据库约束是指对数据库表中的数据所施加的规则或条件,用于确保数据的准确性和可靠性。这些约束可以是基于数据类型、值范围、唯一性、非空等规则,以确保数据的正确性和相容性

2.约束类型

3.NOT NULL 非空约束

加了非空约束的列不能为NULL值,如果预见某个列不可能为空,则强烈建议加非空约束

4.DEFAULT 默认值约束

DEFAULT约束用于向列中插入默认值,如果没有为列设置值,则将会将默认值设置到该列

5.UNIQUE 唯一约束

指定了唯一约束的列,该列的值在所有记录中不能重复,如果确定当前列是唯一列,则强烈建议加唯一约束

6.PRIMARY KEY 主键约束

7.FOREIGN KEY 外键约束

8.CHECK 约束

可以应用于一个或多个列,由于限制列中可接受的数据值,从而确保数据的完整性和准确性

七、数据库设计

1.范式

数据库的范式是一组规则,不同的规范要求被称为是不同的范式

关系数据库一共有六种范式,一般只需要满足第三范式即可

1.1 第一范式

1.1.1 定义

1.1.2 实例

定义一个学生表,需要记录学生信息和学校信息

1.1.3 反例

学校是一个对象,可以继续进行拆分,所以不满足第一范式

在关系型数据库中,每一列都可以用基本数据类型表示,就天然满足第一范式

1.2 第二范式

1.2.1 定义

1.2.2 示例

需求:学生可以选修课程,课程有对应的学分,学生考试后会产生相应的成绩

1.2.3 反例

用一张表记录所有的信息,包括学号、姓名、年龄、性别、课程名、学分、成绩

1.2.4 不满足第二范式时可能出现的问题

1.3 第三范式

1.3.1 定义

在满足第二范式的基础上,不存在非关键字段,对任意候选键的传递依赖

1.3.2 反例

在一个表中出现了两个强相关的关系,而且这两个强相关的关系又存在传递现象,这种传递现象称为传递依赖,应该针对需求设计不同的表

2.设计过程

3.实体-关系图

3.1 E-R图的基本组成

3.2 关系的类型

3.2.1 一对一关系

3.2.2 一对多关系

 3.2.3 多对多关系

八、联合查询

 1.为什么使用联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询一个数据的完整信息,就要从多个表中获取数据,这是就需要使用联合查询,这里的联合指的是多个表的组合

2.多表联合查询时MYSQL内部是如何进行计算的

3.内连接

3.1 语法

1 select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件;
2 select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;

4.外连接

4.1 语法

-- 左外连接,表1完全显⽰
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显⽰
select 字段 from 表名1 right join 表名2 on 连接条件;

5.自连接

5.1 应用场景

自连接是自己与自己取笛卡尔积,可以把行转换为列,在查询的时候可以使用where条件对结果过滤,或者说实现行与行之间的比较,在做表连接时为表起不同的别名

# 不为表指定别名
mysql> select * from score, score;
ERROR 1066 (42000): Not unique table/alias: 'score'
# 指定别名
mysql> select * from score s1, score s2;

6.子查询

子查询是把一个SELECT语句的结果当作另一个SELECT语句的条件,也较嵌套查询

6.1 语法

select * from table1 where col_name1 {= | IN} (
 select col_name1 from table2 where col_name2 {= | IN} [(
 select ...)
 ] ...
)

6.2 单行子查询

嵌套的查询中只返回一行数据

6.3 多行子查询

嵌套的查询中返回多行数据,使用[NOT] IN 关键字

6.4 多列子查询

单行子查询和多行子查询都只返回一列数据,多列子查询可以返回多个列的数据,外层查询与嵌套的内层查询的列要匹配

6.5 在form子句中使用子查询

当一个查询结果产生时,MySQL自动创建一个临时表,然后把结果集放在这个临时表中,最终返回给用户,在from子句中也可以使用临时表进行子查询或表连接操作

7. 合并查询

在实际应用中,为了合并多个select操作返回的结果,可以使用集合操作符union,union all

7.1 Union

该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行

7.2 Union all

该操作符用于取得两个结果集的并集,使用该操作符时,不会去掉结果集中的重复行

8.插入查询结果

8.1 语法

INSERT INTO table_name [(column [, column ...])] SELECT ..

九、视图

1.什么是视图

视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询,更新和管理。视图本身并不占用物理储存空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据

2.创建视图

# 语法
CREATE VIEW view_name [(column_list)] AS select_statement

3.使用视图

视图是一张虚拟表,可能通过调用视图方便的获取想要的数据,视图可以理解为把一个复杂的SQL进行了包装,视图可以与真实表进行表关联查询

4.修改数据 

4.1 注意事项

以下视图不可更新

5.删除视图

# 语法
drop view view_name;

6.视图的优点

十、用户和权限管理

1.应用场景

2.用户

2.1 查看用户

MySQL的用户信息保存在MySQL系统数据库的user表中,可以通过Select语句查看

2.2 创建用户

2.2.1 语法

CREATE USER [IF NOT EXISTS] 'user_name'@'host_name' IDENTIFIED BY
'auth_string';

2.2.2 注意事项

2.3 修改密码

2.3.1 语法

# 为指定⽤⼾设置密码 【推荐】
ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';
# 为指定⽤⼾设置密码
SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string';
# 为当前登录⽤⼾设置密码
SET PASSWORD = 'auth_string';

2.4 删除用户

2.4.1 语法

DROP USER [IF EXISTS] 'user_name'@'host_name'[, ...];

一次可以删除多个用户

3.权限与授权

所有权限都会被赋予,是管理员

3.1 给用户授权

3.1.1 语法

grant priv_type[, priv_type ...] on priv_level
to 'user_name'@'host_name' [WITH GRANT OPTION]

3.2 回收权限

3.2.1 语法

REVOKE [IF EXISTS] priv_type[, priv_type] ... ON priv_level
 FROM 'user_name'@'host_name' [, 'user_name'@'host_name'] ...

十一、索引

1.简介

MySQL的索引是一种数据结构,是为了提升数据库的查询效率、更新表中的数据

2.索引的数据结构

2.1 HASH

时间复杂度为O(1),查询速度很快,但是不支持范围查找

2.2 二叉搜索树

最坏情况下时间复杂度为O(N)

节点个数过多无法保证树高

2.3 B+树特点

3.MySQL中的页

3.1 为什么要使用页

在.idb文件中最重要的结构体就是页,页是内存与磁盘交互的最小单元,默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样,是因为在使用数据的过程中,根据局部性原理,将来要使用的数据大概率与当前访问的数据在空间上是连续的,所以一次从磁盘中读取一页的数据放入内存中,下次查询时还在这个页中就可以直接查询,从而减少磁盘I/O提高性能

4. 索引分类

4.1 主键索引

4.2 普通索引

4.3 唯一索引

4.4 全文索引

4.5 聚集索引

4.6 非聚集索引

4.7 回表查询

4.8 索引覆盖

5.使用索引

5.1 自动创建

5.2 手动创建

5.2.1 主键索引

# 方式一,创建表时创建主键
create table t_test_pk (
 id bigint primary key auto_increment,
 name varchar(20)
);
# ⽅式⼆,创建表时单独指定主键列
create table t_test_pk1 (
 id bigint auto_increment,
 name varchar(20),
 primary key (id)
);
# ⽅式三,修改表中的列为主键索引
create table t_test_pk2 (
 id bigint,
 name varchar(20)
);
alter table t_test_pk2 add primary key (id) ;
alter table t_test_pk2 modify id bigint auto_increment;

5.2.2 唯一索引

# ⽅式⼀,创建表时创建唯⼀键
create table t_test_uk (
 id bigint primary key auto_increment,
 name varchar(20) unique
);
# ⽅式⼆,创建表时单独指定唯⼀列
create table t_test_uk1 (
 id bigint primary key auto_increment,
 name varchar(20),
 unique (name)
);
# ⽅式三,修改表中的列为唯⼀索引
create table t_test_uk2 (
 id bigint primary key auto_increment,
 name varchar(20)
);
alter table t_test_uk2 add unique (name) ;

5.2.3 普通索引

# 方式一,创建表时指定索引列
create table t_test_index (
 id bigint primary key auto_increment,
 name varchar(20) unique
 sno varchar(10),
 index(sno)
);
# ⽅式⼆,修改表中的列为普通索引
create table t_test_index1 (
 id bigint primary key auto_increment,
 name varchar(20),
 sno varchar(10)
);
alter table t_test_index1 add index (sno) ;
# ⽅式三,单独创建索引并指定索引名
create table t_test_index2 (
 id bigint primary key auto_increment,
 name varchar(20),
 sno varchar(10)
);
create index index_name on t_test_index2(sno);

5.3 创建复合索引

5.4 查看索引

# ⽅式⼀
show keys from 表名
# ⽅式⼆
show index from t_test_index6;
# ⽅式三,简要信息:desc 表名;
desc t_test_index6;

5.5 删除索引

5.5.1 主键索引

# 语法
alter table 表名 drop primary key;

5.5.2 其他索引

# 语法
alter table 表名 drop index 索引名;

5.6 创建索引的注意事项

十二、事务

1. 什么是事务

事务是把一组SQL语句打包成为一个整体,在这组SQL执行过程中,要么全部成功,要么全部失败,这组SQL语句可以是一条也可以是多条。

2. 事物的ACID特性(面试高频)

事物的ACID特性指的是Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。

3. 为什么要使用事务

事务具备的ACID特性,是使用事务的原因,支持事务的数据库能够简化我们的编程模型,不需要考虑其他的错误和并发问题,我们接触的事务本质上是数据库对ACID模型的一个实现,是为应用层服务的

4. 如何使用事务

4.1 查看支持事务的存储引擎

4.2 语法

# 开始⼀个新的事务
START TRANSACTION;
# 或
BEGIN;
# 提交当前事务,并对更改持久化保存
COMMIT;
# 回滚当前事务,取消其更改
ROLLBACK;

4.3 保存点

在事务执行的过程中设置保存点,回滚时指定保存点可以把数据恢复到保存点的状态

# 开启事务
mysql> START TRANSACTION;
# 设置保存点
mysql> SAVEPOINT savepoint1;
# 设置第⼆个保存点
mysql> SAVEPOINT savepoint2;
# 回滚到第⼆个保存点
mysql> ROLLBACK TO savepoint2;
# 回滚到第⼀个保存点
mysql> ROLLBACK TO savepoint1;
# 回滚时不指定保存点,直接回滚到事务开始时的原始状态,事务关闭
mysql> ROLLBACK;

4.4 自动/手动提交事务

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON | # ON 表⽰⾃动提交开启
+---------------+-------+
# 设置事务⾃动提交
mysql> SET AUTOCOMMIT=1; # ⽅式⼀
mysql> SET AUTOCOMMIT=ON; # ⽅式⼆
# 设置事务⼿动提交
mysql> SET AUTOCOMMIT=0; # ⽅式⼀
mysql> SET AUTOCOMMIT=OFF; # ⽅式⼆

5. 事物的隔离性和隔离级别

5.1 什么是隔离性

MySQL服务可以同时被多个客户端访问,每个客户端执行的DML语句以事务为基本单位,那么不同的客户端在对同一张表的同一条数据进行修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执行的过程中不受影响,那么事务之间就需要相互隔离,这种特性就是隔离性

5.2 隔离级别

事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全性方面做了取舍,在MySQL的InnoDB引擎中事务的隔离级别有四种,分别是:

5.2.1 READ YNCOMMITED,读未提交

在事务中,事务A对数据进行了修改,事务B可以访问到,事务B访问到了事务A还没有提交的数据(可能发生回滚),这个现象叫做“脏读”

5.2.2 READ COMMITED,读已提交

事务A在一个事务对同一条记录查询了两次,在两次查询之间事务B对数据进行了修改并且提交了事务,当A第二次查询数据的时候,发现与第一次查到的结果不一样,这个现象叫“不可重复读”

5.2.3 REPEATABLE READ,可重复读

事务A第一次查询到的结果集,与第二次查询到的结果不一样,这个现象叫“幻读”

在InnoDB引擎中,使用了next-key锁,锁住了目标行与之前的间隙,解决了部分的幻读问题

5.2.4 SERIALIZABLE,串行化

可以解决所有的数据安全问题,所有的事物是一个接一个的执行,一个事务必须等待上一个事务执行完成后才能执行

5.3 查看和设置隔离级别

# 全局作⽤域
SELECT @@GLOBAL.transaction_isolation;
# 会话作⽤域
SELECT @@SESSION.transaction_isolation;
# 可以看到默认的事务隔离级别是REPEATABLE-READ(可重复读)
+---------------------------------+
| @@SESSION.transaction_isolation |
+---------------------------------+
| REPEATABLE-READ | # 默认是可重复读
+---------------------------------+
1 row in set (0.00 sec)

总结 

到此这篇关于MySQL数据库从入门到精通超详细版本的文章就介绍到这了,更多相关MySQL从入门到精通内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文