学习MySQL数据库的一些个人笔记
数据库是什么?
数据库 – 管理和存储数据的仓库
数据库的分类
DML是数据操纵语言 (insert ,update ,select delete)
DDL是指数据定义语言 (create table)
DCL是指数据控制语言 (权限控制语言,管理员)
DQL是指数据查询语言 (select)
数据库的使用细节 ?
1, 以字母开头,不要以数字开头
2, 不能使用保留字:select / from / update / delete / insert into
3, MySQL数据库不区分大小写,多个单词用下划线分开
字段约束?
非空约束 -- 字段给不能为空 not null
主键约束 自增 -- 唯一不能为空 primary key
唯一约束 -- 字段值不能重复 (unique)
检查约束 -- check CHECK (age>0 AND age<=200),
外键约束 -- foreign key
数据类型 -- 小数:double(不精确) / numeric(a,b) / decimal(a,b)–a是数字的位数b是小数位数auto_increment
基础函数的使用
lower–全转小写 upper–全转大写 length–求长度 substr–截取子串
concat–拼接字符串 replace–替换 去重distinct
对小数的函数
SELECT comm,ROUND(comm,1) FROM emp#四舍五入,保留1位小数
SELECT comm,CEIL(comm) FROM emp#ceil向上取整
SELECT comm,FLOOR(comm) FROM emp#floor向下取整
char类型和varchar类型
– char长度固定,不足使用空格填充,存储abc占11个字节,查询效率快,但浪费空间
– varchar 存储abc只占三位,查询稍慢,但节省空间,定义10位不足会交给下个字段使用
整数类型
tinyint,int整数类型
float,double小数类型
numeric(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数
decimal和numeric表示精确的整数数字
blob – blob 二进制数据,可以存放图片、声音,容量4g 缺点是数据库
事务的简单介绍
事务 – 将多条语句绑定在一起执行,要么全都成功,要末全都失败
四大特性
-- 原子性 : 指事物的所有操作要么全都成功,要么全都失败
-- 一致性 ; 事物只包含事务提交后的状态
-- 隔离性 : 并发 b事物如何要执行的话,要么在a事务结束后执行,要么在a事物开始执行就已经结束
-- 持久性 :事务执行成功后,提交啦,必须持久性保存到数据库中,
事务的隔离问题
-- 读以提交(脏读) 一个事务读取到另一个事务还没提交的事务
-- 不可重复读(Read Committed),一个事务读到另一个事务已提交的内容
(但是事务B能读到事务A提交的数据更新内容。)
-- 不可重复读(Read Committed),一个事务读到另一个事务已提交的内容(主要是数据更新)
-- 可串行化(Serializable):最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决 幻读问题。
事务锁 -- 读锁,也称为共享锁。某个事务A拿到该锁时,事务A只能进行读操作,此时其他事务也可以拿到这把 锁(共享)。
-- 写锁,也称为排它锁。某个事务A拿到该锁时,事务A能进行读、写操作,此时其他事务不能拿到这把 锁(排它)
索引
-- 单值索引 create index 索引名 on 表明(字段名)
-- 唯一索引 create unique index 索引名 on 表名(字段名)
-- 复合索引 create index 索引名 on 表明 (字段1,字段2)
-- 删除索引 alert table drop index 索引名
视图 – 可视化的表,视图当做是一个特殊的表,是指,把sql执行的结果,直接缓存到了视图中。
笛卡尔积现象
– :当进行多张表联合查询的时候,在没有任何条件进行限制情况下,最终查询结果条数是多张表记录条数的乘积!
sql执行顺序
f
r
o
m
−
o
n
−
j
o
i
n
−
w
h
e
r
e
−
g
r
o
u
p
b
y
−
聚合函数
−
h
a
v
i
n
g
(分组过滤)
−
d
i
s
t
i
n
c
t
(去重)
−
排序
−
分页
from - on -join -where -group by - 聚合函数 - having(分组过滤)- distinct(去重)-排序 -分页
from−on−join−where−groupby−聚合函数−having(分组过滤)−distinct(去重)−排序−分页
sql优化
– 查询时使用具体字段可以提高效率
-- 避免where子句中用or来连接 (# 分开两条sql写)使用or可能会使索引失效,从而全表扫描
对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫 描。也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描 就搞定。虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的
-- 使用varchar代替char
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间
char按声明大小存储,不足补空格
其次对于查询来说,在一个相对较小的字段内搜索,效率更高
-- 尽量使用数值替代字符串类型
-- 查询尽量避免返回大量数据 (使用分页)
-- 用explain分析你SQL执行计划
-- 创建name字段的索引
-- 优化like语句
反例 SELECT id,NAME FROM student WHERE NAME LIKE '%1%
正例 SELECT id,NAME FROM student WHERE NAME LIKE '1%'
-- 索引不宜太多,一般5个以内
-- 批量插入性能提升 大量数据提交,上千,上万,批量性能非常快,mysql独有