MySQL笔记

本文全面介绍了SQL基础知识,包括数据库操作、数据类型、字段属性等,并详细解析了DDL、DML、DQL及DCL的具体应用。此外,还深入探讨了MySQL数据管理、事务处理、索引优化及数据库设计规范等内容。

所有带 [ ] 表示可选

字段名用` `,属性用’ '

1. 操作数据库

1. 操作数据库(了解)

DDL 定义数据库

DML 操作数据库

DQL 查询数据库

DCL 控制数据库

create database [if not exist] xx;	[如果不存在]创建xx数据库

drop database [if not exist] xx;	[如果不存在]删除xx数据库

use `xx`;	切换到xx数据库

show databases;	查看所有数据库

show table;	查看数据库所有表

2. 数据类型

数值

  • int 常用整数 4字节
  • double 常用浮点数 8字节
  • decimal 字符串形式浮点数,无精度损失,金融计算用

字符串

  • varchar 可变字符串 0~65535
  • text 保存大文本 2^16-1

时间日期

  • date yyyy-mm-dd 日期格式
  • time hh:mm:ss 时间格式
  • datetime date+time 最常用时间格式
  • timestamp 时间戳 1970.1.1到现在的毫秒数

3. 数据库的字段属性(重点)

unsigned:

  • 无符号的整数
  • 声名不能为负数

zero fill:

  • 0填充
  • 不足位数,用0填充

auto_increament:

  • 自增(默认+1)
  • 设计唯一的主键
  • 必须整数
  • 可自定义起始值和增量

not null:

  • 必须赋值
  • 可以为空值(null占空间,空值不占)
  • 拓展:两个null比较结果还是null

default:

  • 设置默认值
  • 不设置值有默认值

comment

  • 对列进行备注

项目表必备字段:

  • id:主键
  • `version`:乐观锁
  • is_delete:伪删除
  • gmt_create:创建时间
  • gmt_update:修改时间

4. 数据库表格式

create table [if not exists] `xx`(
	'字段名' 列类型 [属性][索引][注释],
    ...
    '字段名' 列类型 [属性][索引][注释]
    [主键设置]
)[表类型][字符集设置][注释]

常用语句

show create database xx -- 查看创建xx数据库的语句
show create table xx -- 查看xx数据表的定义语句
describe xx -- 显示表结构

5. 数据表的类型

innodb 默认使用

myisam 早些年使用

myisaminnodb
事务支持不支持支持
数据锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,2倍

常规使用操作:

  • myisam 节约空间,速度较快
  • innodb 安全性高,支持事务处理,支持多表多用户操作

物理空间存在位置:data目录下,本质还是文件的存储

mysql引擎在物理文件上的区别

  • innodb在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
  • myisam:
    • *.frm 表结构的定义文件
    • *.myd 数据文件(data)
    • *.myi 索引文件(index)

设置数据库表的字符集编码:charset=utf8

6. 修改删除表

-- 修改表名
alter table 表名1 rename as 表名2

-- 增加表的字段
alter table 表名 add 字段名 字段类型

-- 修改表的字段
alter table 表名 modify 字段名 字段类型 -- 只能修改约束
alter table 表名 change 字段名1 字段名2 字段类型 -- 重命名,还能修改类型

-- 删除表的字段
alter table 表名 drop 字段名


-- 删除表
drop table if exists 表名

2. MySQL数据管理

1. 外键(了解)

方式一:创建表的时候增加外键(麻烦)

  1. 定义外键key

  2. 给外键添加约束,然后引用

key `约束名`(`作为外键的列`)
constraint `约束名` foreign key (`作为外键的列`) references `引用表`(`引用表字段`)

删除有外键关系的表,必须先删除引用别人的表(从表),再删除被引用的表(主表)

方式二:创建表之后增加字段

alter table `表名`
constraint `约束名` foreign key (`作为外键的列`) references `引用表`(`引用表字段`)

以上操作都是物理外键,数据库级别外键,不建议使用

2. DML语言

数据库意义:数据存储,数据管理

dml语言:数据操作语言

  • insert
  • update
  • delete

3. 添加

不写表字段,值会一一匹配

insert into `表名`([`字段名1`,`字段名2`...]) value ('值1','值2'...),('值3','值4'...)

4. 修改

不指定条件,会改变所有表!!!!

update `表名` set `字段名1`='修改后的值',`字段名2`='修改后的值' where 条件

=, <>(!=), >, <, >=, <=,

between…and 在某个范围内

and 和

or 或

5. 删除

不指定条件,会改删除所有表!!!!

delete from `表名` where 条件

完全清空一个数据库表,表结构索引不改变

truncate `表名`

delete和truncate:

  • 相同点:都能删除数据,但不删除表结构
  • 不同:
    • truncate 重新设置自增列,计数器归零
    • truncate 不会影响事务

【了解即可】delete删除问题,重启数据库,现象:

  • innodb 自增列会从1开始(存在内存中,断电即失)
  • myisam 继续从上一个自增量开始(存在文件中,不会丢失)

3. DQL查询数据(重点)

1. DQL

  • 所有查询都用select
  • 简单,复杂查询都能做
  • 数据库核心语言,最重要的语句
  • 使用频率最高的数据

select完整语法:

select
from
	[join] [on]	 -- 联合查询
	[where]		 -- 条件
	[group by]	 -- 按字段分组
	[having]	 -- 对分组后的数据筛选
	[order by]	 -- 排序
	[limit]		 -- 分页

2. 指定查询字段

-- 查询表全部数据
select * from 表名

-- 查询指定字段
select 字段名,字段名 from 表名

-- 起别名(表和字段都可以)
select 字段名1 as 别名1,字段名2 as 别名 
from 表名 as 别名 

-- 函数 concat(a,b)
select concat('姓名',name) as 新名字 
from 表名

去重:distinct

取出查询结果中重复的数据,只显示一条

select distinct 字段名 from 表名
select version() -- 查版本
select 100*3 -- 计算
select @@auto_inrement_increment -- 查询自增步长(变量)
select `num`+1 from 表名 -- 查询数据处理

3. where条件字句

逻辑运算符:

  • and &&:逻辑与
  • or ||:逻辑或
  • not !:逻辑非

模糊查询:比较运算符

  • is null:如果操作符为null,结果为true
  • is not null:若果操作符为not null,结果为true
  • between and:在两者之间,结果为true
  • like:sql匹配,匹配到为true
    • %:代表0到任意个字符
    • _:代表一个字符
    • like ‘a%z_’:匹配第一个字母为a,倒数第二个字母为z的字符,只能在like中用!
  • in (…):操作符是数组中的一个,结果为true

4. 联表查询 JOIN

3种join

  • inner join:只返回两表都匹配的行
  • left join:从左表返回所有值,即使右表中没有匹配
  • right join:从右表中返回所有的值,即使左表中没有

on和where

  • 在多表查询时,ON和where都表示筛选条件;on先执行,where后执行
  • 外连接时:
    • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
    • where条件是在临时表生成好后,再对临时表进行过滤的条件。

语法:

select b1.字段1, b2.字段2 ...
from 表1 as b1
inner join 表2 as b2
on 条件
left join 表3 as b3
on 条件
right join 表4 as b4
on 条件

自连接:

自己的表和自己的表连接

select a.字段1, b.字段2
from 表1 as a, 表1 as b
where 条件

5. 分页和排序

排序:order by

  • 升序:asc
  • 降序:desc
select *
from 表
order by 字段 asc -- 升序或降序

分页:limit a, b (a:起始位置,b:条数)

第n页:limit (n-1)*pageSize, pageSize

select *
from 表
limit 0,2 -- 第一条数据开始,总共查2条

6. 子查询

本质:在where语句中嵌套一个查询语句

原本的查询:

select *
from 表1 b1
inner join 表2 b2
on 条件
where 条件
order by 字段 desc

子查询

select *
from 表1
where 字段1 = (
	select 字段1
    from 表2
    where 条件
)
order by 字段 desc

7. 分组和过滤

select *
from 表1
left join 表2
on 条件
where 条件
group by 字段	-- 按字段分组
having 条件	-- 对分组后的数据筛选
	

4. MySQL函数

1. 常用函数

-- 数学运算
select abs(-8)  	-- 绝对值	8
select ceiling(9.4) -- 向上取整	10
select floor(9.4) 	-- 向下取整	9
select rand() 		-- 返回一个0-1的随机数
select sing(10) 	-- 判断一个数的符号 -1/0/1	

-- 字符串函数
select char_length('asdsd') 	-- 字符串长度	5
select concat('i','love','u') 	-- 拼接字符串	'iloveu'
select insert('1234',2,2,'abc')	-- 替换	'1abc4'	
select lower('Abc')				-- 转小写字母	'abc'
select upper('Abc')				-- 转大写字母	'ABC'
select instr('abcd','c')		-- 返回第一次出现字符串的索引	3
select substr('abc',1,2)		-- 返回指定字符串	'ab'
select replace('1234','12','a')	-- 替换出现的指定字符串	'a34'
select reverse('123')			-- 反转	'321'

-- 时间和日期函数(重点)
select now()		-- 获取当前日期
select localtime()	-- 获取本地时间
select sysdate()	-- 系统时间
select year(now())	-- 获取年
...

-- 系统
select user()		-- 获取当前用户
select version()	-- 获取版本

2. 聚合函数(重点)

函数名称描述
count()统计行数
sun()求和
avg()平均值
max()最大值
min()最小值
select count(字段) from 表	-- 会忽略所有null
select count(*) from 表 -- 不会忽略null,本质:计算行数
select count(1) from 表 -- 不会忽略null,本质:计算行数

3. 数据库级别的md5加密(扩展)

算法复杂度高

不可逆性

不防碰撞

update `user` set password=md5(password) -- 密码全部加密

-- 用户传递的密码进行md5加密,然后比对加密后的值
select * from `user` where `name`='name' and password=md5(`123`)

5. 事务

事务:将一组sql放在一个批次中去执行

ACID:

  • 原子性
    • 要么都成功,要么都失败
  • 一致性
    • 事务前后的数据完整性一致
  • 隔离性
    • 隔离多个用户对同一数据的操作
  • 持久性
    • 断电事务没有提交,恢复到原状
    • 断电事务提交,持久化数据

隔离所导致的问题:

  • **脏读:**一个事务读取了另一个事务没有提交的诗句
  • **不可重复读:**一个事务内读取某个数据,多次读取结果不同(不一定错误,至少是某些场合不对)
  • 幻读::一个事务内读取到了别的事务插入的数据,导致读取前后不一致

mysql是默认开启事务自动提交的

set autocommit = 0 -- 关闭
set autocommit = 1 -- 开启

自定义事务:

set autocommit = 0 -- 关闭事务自动提交

start transaction -- 开启事务

insert 数据
update 数据
...

commit -- 提交:持久化(成功)
rollback -- 回滚:回到事务前的样子(失败)

set autocommit = 1 -- 结束后恢复默认

-- 了解
savepoint -- 设置一个事务的保存点
rollback to savepoint -- 回滚到保存点
release savepoint -- 撤销保存点

事务的隔离级别:

隔离级别脏读不可重复读幻读
read-uncommitted(读取未提交)
reda-conmitted(读取提交)×
repeatable-read(可重复读)××
serializable(可串行化)×××

MySQL innodb 默认隔离级别是repeatable-read(可重复读)

6. 索引

索引是帮助MySQL高效获取数据的数据结构。

索引是数据结构

1. 索引的分类

  • 主键索引(primary key
    • 唯一的表示,主键不可重复
    • 不允许空值
  • 唯一索引(unique key
    • 该字段列数据不重复,多个列都可以标识为唯一索引
    • 允许空值
  • 常规索引(key / index
    • 默认
  • 全文索引(fullkey
    • 特定数据库引擎才有,myisam
    • 快速定位数据

基础语法

-- 1.创建表的时候给字段增加索引
-- 2.创建完毕后,增加索引
-- 3.create index 索引名 on 表(列名)

-- 显示所有的索引信息
show index from 表

-- 增加一个全文索引		(索引名)列明=名
alter table 表.列名 add fulltext index `索引名`('列名')

-- explain:分析SQL执行情况
explain select * from 表 -- 非全文索引
explain select * from 表 where match(列名) against('数据') -- 全文索引 

2. 测试索引

索引在小数据量的时候,用处不大,但在大数据的时候,用处十分明显

3. 索引原则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的列(字段)上

索引的数据结构:

harsh类型的索引

Btree:innodb的默认数据结构

7. 权限管理和备份

1. 用户管理

用户表:mysql.user

本质:对这张表的增删改查

-- 创建用户
create user 用户名 identified by 密码
-- 修改密码(当前用户)
set password = password(新密码)
-- 修改密码(指定用户)
set password for 指定用户 = password(新密码)
-- 用户重命名
rename user 用户名 to 新用户名
-- 删除用户
drop user 用户名

-- 用户授权
-- all privileges,不能给别人授予权限
grant all privileges on 库.表 to 用户 
-- 查询指定用户权限
show grant for 用户
show grant for root@localhost
-- 撤销权限
remove all privileges on 库.表 from 用户 

2. MySQL备份

为什么要备份:

  • 保证重要的数据不丢失
  • 数据转移

MySQL数据库备份方式

  • 直接拷贝物理文件

  • 可视化工具中手动导出

  • 使用命令行(不是编辑器)导出 mysqldump

    # 导出
    mysqldump -h地址 -u用户 -p密码 数据库 表1 表2 表n > 位置(D:/a.sql)
    # 导入
    source D:/a.sql # 提前登录
    mysqldump -h地址 -u用户 -p密码 数据库 < 备份文件位置(D:/a.sql) #不建议!!!防止输错导致覆盖
    

8. 规范数据库设计

1. 为什么需要设计

糟糕的数据库设计:

  • 数据库冗余,浪费空间
  • 数据库的插入和删除都会麻烦、异常【处理:屏蔽使用物理外键】
  • 程序性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据的完整性
  • 方便我们开发系统

关于数据库的设计:

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图 E-R 图

设计数据库的步骤:(个人博客)

  • 收集信息,分析需求
    • 用户表 user(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表 category(文章分类,谁创建)
    • 文章表 blog(文章的信息)
    • 友链表 links(友链信息)
  • 标识实体(把需求落到每个字段)
  • 标识实体之间的关系
    • 写博客:user—>blog
    • 创建分类:user–>category
    • 关注:user–>user
    • 友链:links
    • 评论:user–>user–>blog

2. 三大范式

为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效的信息

专有名词:

  • 元组:二维表中的行
  • 属性:二维表中的列
  • 超键:能唯一标识元祖的属性集
  • 候选键:不含多余属性的超建
  • 主键:用户选作元组标识的候选键
  • 外键:对于当前模式而言,是另一模式下的主键。
  • 主属性:构成候选键的属性

三大范式:

  • 1NF
    • 原子性:保证每一列不可再分
  • 2NF
    • 满足1NF
    • 非主属性完全依赖于候选键
  • 3NF
    • 满足2NF
    • 消除非主属性对候选键的传递依赖
  • BCNF
    • 满足3NF
    • 消除每一属性对候选键的传递依赖

**部分依赖:**C可以通过AB得到,并且C也可以仅通过A得到,仅通过B得到, 那么就说C部分依赖AB。

**完全依赖:**C可以通过AB得到,并且C不可以仅通过A得到,也不可以仅通过B得到, 那么就说C完全依赖AB。

**传递依赖:**B可以通过A得到,C可以通过B得到,那么就称C传递依赖A。

规范和性能问题

关联查询的表不得超过三张表(阿里规范)

  • 考虑商业化的需求和目标(成本,用户体验),数据库性能更加重要
  • 在提高性能的时候,需要适当的考虑下规范性
  • 故意给某些表增加一些冗余手段。(多表查询变为单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量的查询)
<think>首先,用户的问题是关于“MySQL学习笔记教程”。根据系统指令,我需要使用中文回答,确保LaTeX语法正确,生成相关问题,并在回答中引用时添加引用标识。 回顾提供的引用: - 引用[1]:关于MySQL存储引擎的分类。 - 引用[2]:关于右连接的SQL示例。 - 引用[3]:关于索引的解释。 用户意图是获取MySQL相关的学习笔记或参考资料。我的回答应该基于这些引用,但也要确保内容真实可靠,结构清晰。 回答结构: 1. **开头**:简要介绍MySQL学习笔记,并自然地引用相关部分。 2. **主体**:分步解释关键概念,使用引用支持。 3. **代码块**:如果适用,展示SQL示例。 4. **结尾**:生成相关问题。 关键点: - 使用中文。 - 行内数学表达式用$...$,但MySQL主题可能不涉及数学,除非是计算或公式。 - 独立公式用$$...$$,但同样可能不适用。 - 生成相关问题在末尾。 可能的MySQL主题: - 存储引擎(来自引用[1])。 - 连接操作(来自引用[2])。 - 索引(来自引用[3])。 构回答: 1. **介绍MySQL学习笔记**:解释MySQL的基础知识。 2. **分步讲解**: - 存储引擎:解释分类,如InnoDB、MyISAM等,引用[1]。 - 连接操作:展示左连接、右连接示例,引用[2]。 - 索引:解释索引的重要性,如何工作,引用[3]。 3. **代码示例**:使用SQL代码块展示查询。 4. **生成相关问题**:在末尾添加相关问题。 确保引用: - 在相关段落末尾添加[^1], [^2], [^3]。 最终回答结构: - 标题或开头句。 - 分段讲解。 - 代码块。 - 相关问题。 生成相关问题: - 基于内容,如优化索引、存储引擎比较等。</think>### MySQL学习笔记教程 MySQL是一种广泛使用的关系型数据库管理系统,适用于各种规模的应用。本教程基于黑马程序员的视频教程和实际经验总结,涵盖核心概念如存储引擎、连接操作和索引优化。下面我将一步步解释关键知识点,确保内容真实可靠(参考自相关学习资料)。 #### 1. **MySQL存储引擎** 存储引擎是MySQL的核心组件,负责数据的存储、检索和管理。MySQL支持多种存储引擎,常见分类如下: - **InnoDB**:支持事务和行级锁,适合高并发写入场景(如电商系统)。 - **MyISAM**:不支持事务,但查询速度快,适合只读操作(如报表生成)。 - **Memory**:数据存储在内存中,速度快但易丢失,适合临时缓存。 - **Archive**:专为归档设计,压缩率高,但不支持索引。 存储引擎的选择取决于应用需求,例如事务性应用优先使用InnoDB[^1]。 #### 2. **连接操作** 在MySQL中,连接操作用于从多个表中关联数据。常见类型包括内连接、左连接和右连接。以下是一个右连接的SQL示例,它返回右表(score)的所有记录,即使左表(stu)没有匹配项: ```sql SELECT stu.id, `name`, math FROM stu RIGHT JOIN score ON stu.id = score.id; ``` 此查询会输出所有成绩记录,包括那些没有对应学生信息的成绩(如新添加的成绩数据)。这有助于处理数据缺失场景[^2]。 #### 3. **索引优化** 索引是提升查询性能的关键机制。它通过构数据模型(如B+树),避免全表扫描。例如: - **索引工作原理**:当执行`SELECT * FROM users WHERE id = 100;`时,如果有索引,MySQL直接定位到id=100的行,时间复杂度为$O(\log n)$;否则需扫描整个表,时间复杂度为$O(n)$。 - **创索引示例**: ```sql CREATE INDEX idx_name ON users(name); -- 在name列上创索引 ``` 索引能显著减少查询时间,尤其在大数据表中(如百万行以上)。但过度使用会降低写入速度,需权衡使用[^3]。 #### 4. **其他基础概念** - **事务处理**:使用`BEGIN TRANSACTION`, `COMMIT`, `ROLLBACK`确保数据一致性(ACID属性)。 - **数据类型**:如INT、VARCHAR、DATE等,选择合适类型节省存储空间。 - **性能调优**:结合`EXPLAIN`命令分析查询计划,优化慢查询。 本教程基于实际学习笔记整理,议结合视频教程([黑马程序员MySQL教程](https://www.bilibili.com/video/BV1Kr4y1i7ru))实践练习[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值