文章目录
前沿
MySQL 是当前最受欢迎的关系型数据库管理系统之一,广泛应用于各种规模的企业和项目中。其受欢迎的原因主要在于其开源特性、稳定性、高性能以及广泛的社区支持。MySQL 提供了强大的数据管理和查询功能,支持多种存储引擎,如 InnoDB 和 MyISAM,满足不同应用场景的需求。随着云计算的普及,MySQL 也适应了云环境,许多云服务提供商如 AWS、Azure 和 Google Cloud 都提供托管的 MySQL 服务。此外,MySQL 的灵活性使其在各种应用程序中易于集成,无论是 web 应用、数据仓库还是数据分析。总之,MySQL 以其可靠性和强大的功能,在现代数据库管理系统中占据了重要位置
Mysql常用的存储引擎
Mysql5.6之前是MyISAM引擎,Mysql8.0之后就改为用InnoDB引擎。
show engines # 查看当前数据的引擎
SELECT VERSION() # 查看数据库的版本
set default_storage_engines=MyISAM # 修改数据的引擎,也可以通过配置文件的方式修改
# my.conf or my.ini文件的配置实现,需要先关闭mysql服务
[mysqld]
default_storage_engines=MyISAM # 修改完后重启mysql服务
1. InnoDB事务型
使用InnoDB引擎创建数据库时会自动生成个".ibd"文件,数据表的数据映射都会放在mysql/data下的ibdata1文件中,支持事务,支持外键,同时支持奔溃修复能力和并发控制,如果对事务的完整性要求比较高,要求实现并发控制,需要频繁的进行更新,删除操作的数据库,选择InnoDB,因为该存储类型可以实现事务的提交和回滚。
2. MyISAM查询型
MISAM存储引擎的出入数据快,空问和内存使用比较低,如果表主要是用于插入新记录和读取记录,那么选择MVISAM存储引擎能实现处理的高效率。如果应用的完整性,并发性要求很低,也可以选择MyISAM存储引擎。
3. MEMORY内存型
Memory存储引擎的所有数据都在内存中,数据的处理速度快,但是安全性不高,如果需要很快的读写速度,对数据的安全性要求低。那么可以选择Memory数据库存储引擎。
**总结**:这些选择存储引擎的建议,都是根据各种存储引擎的不同特点提出的,并不是绝对的,实际应用中还需要根据实际情况进行分析。一般来说,在同一个数据库中,不同的表可以使用不同的存储引擎,如果一个表要求较高的事务处理,可以选择imnnodb引擎,如果一个表会被频察的査询,可以选择myisam存储引擎,如果是一个用于査询的临时表,那么可以选择memory存储引擎。
数据库、表操作 DDL
- 列,也称之为栏位(column),在创建表的时候,必须指定列的名字和数据类型。
- 索引(Index) 根据指定数据表列建立起来的顺序,提供了快速访问数据的途径。
- 触发器(Trigger) : 用户定义的事务命令的集合,当一个表中数据进行了插入,更新或者删除时,这组命令就会自动执行,可以用来确保数据的完整性和安全性。
表的字符集
# 查看可设置的字符集
show character set
# 创建表时指定字符集
create table user(
id int(20),
name varchat(38)
) default character set utfb8mb4 collate utfbmb4_general_ci
# 修改表的字符集
alter table user default character set utf8mb4 collate utfbmb4_general_ci
常用命令
# 数据库操作
# 创建数据库
CREATE DATABASE xk-bbs
# 删除数据库
DROP DATABASE xk-bbs
# 查看所有数据库
SHOW DATABASES
# 使用数据库
USE xk-bbs
# 表的操作
# 创建表
CREATE TABLE user(
id int(11),
name varchat(28)
)
# 查看表
SHOW TABLES
# 查看表明细
DESC/DESCRIBE user
# 删除表
DROP TABLE user
01整数类型
02 浮点类型
FLOAT类型会造成精度的丢失,一般情况是选择DOUBLE,银行系统之类的建议使用DECIMAL
03 日期类型
04 字符串类型
varchat弹性伸缩。
05 JSON类型
MySQL8.0新特性
表的相关操作
-- 修改表名 rename
alter table user rename xk_user
-- 查看创建表的sql语句
show create table xk_user
-- 添加新字段 add
alter table xk_user add username varchar(100)
-- 删除字段 drop
alter table xk_user drop username
-- 更新字段的名字和数据类型 change
alter table xk_user change username name varchar(50)
-- 更新字段的数据类型和位置 modify
alter table xk_user modify name varchar(30) first/after field_name
表的约束
primary key -- 主键约束 非空且唯一
auto_increment -- 自增长约束
unique -- 唯一约束
default -- 默认约束
not null -- 非空约束
主外键约束
保证数据的一致性,一个表的主键是另外一个表的外键。当新增学生时,学生的教室编号不存在,新增会失败。
**student表中的classno和classroom表中的主键classno建立主外键关系,在student中foreign key (classno)referencest_classroom(classno)**
当在使用删除t_classroom语句,会报错,因为该表的数据被另外一个表所引用。需要将所引用的数据删除干净才能删除。
表操作之DML
-- 新增 insert
insert into xk_user(name,age) values ("msh",18),
("xy",16)
-- 删除 delete
delete from xk_user -- 删除全部数据,但是新增
-- 的索引不是从1开始。可以使用truncate
truncate table xk_user -- 进行重置索引
-- 修改 update
update xk_user set age = 22 , name = "sh" where uuid = 1
*DQL *
-- 查询某个表全部的数据
select * from user
-- 查询name字段在user表中并且去重
select distinct name from user
-- 查询某个表指定的字段
select age,name from user
-- in/not in查询
-- 查询user表中1,2,3班的所有数据
select * from user where classno in (1,2,3)
-- between and 范围查询,关键词类型只能是int
-- 在user表中查询年龄在16~25之间的所有数据
select * from user where age between 16 and 25
-- 聚合函数配合group by使用并且被group by的field
-- 不能具有唯一性
-- count 统计表中的数据有多少条 count(1/*)
-- avg 平均数
-- max 最大值
-- min 最小值
-- sum 总数
-- group_concat(name) 拼接name默认最大长度是1024
-- 可以设置 set group_concat_max_len = 10240
-- group by having 分组查询
-- 一个查询sql语句的执行 把前半段段sql执行完的结果
-- 再执行group by 语句,再将group by结果交给having执行
-- link模糊查询
-- % 匹配多个字符
select * from user where name link '%sh'
-- _ 匹配单个字符
select * from user where name link '_xy'
-- order by desc/asc 默认asc
-- 查询user表的数据按照年龄从大到小进行排序
select * from user order by age desc
-- 联合查询
-- inner join on 内联查询
-- 查询拥有班级的学生信息和班级信息
select s.*, c.* from student s inner join class c on
s.classno = c.classno
-- left [out] join on
-- 左外查询,左表是主表,如果条件中左表匹配不上从表的数据
-- 查询出来的结果,主表都会显示,只不过从表的数据都是空
-- right [out] join on
-- 右外查询 结论和左外查询类似。
-- 子查询
-- 统计分类栏目中的数据条数
select t1.id,t1.title,(select count() from xk_bbs. t2 where t2.id = t1.categoryid)
from xk_bbs_category t1
-- 分页 limit pageno - 1 * 每页显示的数量
select * from user limit 0(pageno) 5
-- union/union all 不去重
-- 查询班级里男和女的总数
select count(1) as '男的总数' from class where gender = 1
union
select count(1) as '女的总数' from class where gender = 0
索引
一种数据结构,b+tree + hash
- 主键索引 primary
- 唯一索引 unique
- 常规索引
- 全文索引
const - ref - range - index - all
-- 创建索引
create index name_idx on user(name)
-- 删除索引
drop index name_idx on user
-- 查询索引
show index from user
-- 复合索引 name是带头大哥
create index name_age_idx on user(name,age)
select * from user where age = 10 -- 因为大哥name不在此刻是不会命中索引的 type = all
-- 全文索引 只支持char varchar字符串类型
-- 添加全文索引
alter table user add fulltext index `name_full_idx`(`name`)
-- 使用全文索引进行查询
select * from user where match(name) against('love')
索引准则
- 索引不是越多越好,一张表最好控制在3个索引
- 不要对经常变动的数据加索引
- 数据量小时不需要加索引,一般10w条数据左右才考虑加索引(真和假,数字列,价格)
- 在设计表中经常看到isdelete字段是为了保护索引。
MySQL权限管理
-- 创建用户
create user feige@localhost identified 12345
-- 删除用户
drop user feige@localhost
-- 查看某个用户的权限
show grants for feige@localhost
-- 添加某个用户的权限
grants insert, select on *.* from feige@localhost
-- 删除某个用户的权限
rovoke insert,delete,update on *.* from feige@localbost
-- 修改权限/删除权限之后需要执行
flush privileges
-- 修改用户密码
alter user feige@loclshowt identified by
MySQL事务处理
-- set autocommit = 0 关闭 1 开启
-- 开启事务
start transaction
-- 提交事务
commit
-- 回滚事务
rollback
事务的ACID原则
- 原子性
- 一致性
- 隔离性
- 持久性
MySQL数据库备份
数据备份
sql#### 数据恢复
- source 命令
-- 登陆mysql中
source Document/backup/xk_bbs.sql
- mysql登陆命令
mysql -uroot -psanyueshi > Document/backup/xk_bbs.sql
数据库设计
第一范式
- 主键 每张表都要有主键
- 原子性 每个字段都要求不能在进行分割
第二范式
建立在第一范式之上,保证表的原子性,每张表只存储一种数据,例如:用户表保存用户数据,商品表保存
商品数据,订单表保存订单数据。
第三范式
第三范式数据表的数据都要和主键直接关联,不能说间接关联。主外键关联 一张表t1和另外一种表t2进行关联,t1的主键和t2的外键必须是一样的字段。
总结
本文给各位小伙伴们,带来了mysql的基础篇,本文有不足的多多包涵,望跟小伙伴们一起进步!