一、MySQL数据库简介
MySQL是一个关系型数据库管理系统,它的前世是瑞典MySQL旗下的产品。
MySQL是最好的RDBMS(Relational Database Management System)关系型数据库管理系统应用软件之一的开源的数据库软件
二、数据库的列类型
1、数值
tinyint | 十分小的数据 | 1个字节 |
smallint | 较小的数据 | 2个字节 |
int | 标准的整数 | 4个字节 |
bigint | 较大的数据 | 8个字节 |
float | 浮点数 | 4个字节 |
double | 浮点数 | 8个字节 |
decimal | 字符串形式的浮点数 | 用于金融计算 |
2、字符串
char | 字符串固定大小的0~255 | |
varchar | 可变字符串0~6535 | 常用的string |
tinytext | 微型文本2^8-1 | |
test | 文本传2^16-1 | 保存大的文本 |
三、数据库字段的属性
1、Unsigned:
无符号的整数,声明该列不能为负数
2、zerofill:
0填充的,不足的位数用0来填充
3、自增(AUTO_Increment)
通常用来设计唯一的主键
4、非空
Null not null
四、数据库表的类型
1、数据库引擎:
InnoDB | 默认使用 | 安全性高,支持事务处理,多表操作 |
MyISAM | 早些年使用 | 节约空间,速度快 |
2、InnoDB和MyIsAM的区别
×:不支持 √ :不支持
MyIsAM | InnoDB | |
事务支持 | × | √ |
数据行锁定 | × | √ |
外键约束 | × | √ |
全文索引 | √ | × |
表空间的大小 | 较小 | 约为MyIsAM的2倍 |
五、数据库CRUD(增删改查)
1、增删改查的SQL语句
增加的SQL语句:
insert into 表名(字段名) values(?,?,?)
修改的SQL语句:
update 表名 set 字段名 where 条件
删除的SQL语句:
delete from 表名 where 条件
查询语句
select 字段名 from 表名 where 条件
六、模糊查询(比较运算符)
比较运算符 | 语法 | 描述 |
is null | a is null | 如果操作符为null,则结果为真 |
is not null | a is not null | 如果不为null,则结果为真 |
between | a between b and c | 若在a,b之间,则结果为真 |
like | a like b | sql匹配,如果a配置b 则为ture |
in | a in(a1,a2,a3...) | a在a1或a2某个中则为ture |
like结合 %代表到0到任意个字符 _(一个字符)
例:
查询某表中姓名开头为A 的信息
select * from 表名 where name like 'A%'
查询某表中姓名开头为A 后面只有一个字符
select * from 表名 where name like 'A_'
查询某表中姓名中间有A的
select * from 表名 where name like '%A%'
in(具体的一个或多个值)
例:
查询地址为,江苏或河南的人
select * from 表名 where address in ('江苏','河南')
七、联表查询
操作 | 描述 |
inner join | 如果表中至少有 一个匹配,就返回 |
lift join | 会从左表返回所有值,即使右表中没有匹配 |
right join | 会从右表中返回所以值,即使左表中没有匹配 |
执行SQL语句
例:
比如现在有两个表 一个是学生表(student) 另一个是老师表(teacher)
现在要查询学生的信息和对应老师的信息
select s.name,s.age,s.t_name,t.age
from `student` as s
inner join teacher as t
on s.name=t.name
as 是给表起别名 用来识别你用的不同表的字段
七、数据库的分页和排序
1、排序
升序:ASC 降序: DESC
要在where后面使用 Order By 字段名 ASC/DESC
例:
比如要查询学生的成绩并把成绩以升序的形式展现出来
select name,report from student
Order By report ASC
2、排序
排序一般在sql语句的最后写
语法为: limit 页数,页面大小
例 limit 0,5 查询第一个页面,页面大小为5,可以查询数据库中前5个数据
limit 1,3 查询第二个页面,页面大小为3,可以查询数据库中4~6的数据
select * from student
limit 0,5
n : 当前页面数
pagesize : 页面大小
起始值(数据从第几个开始查询):(n-1)*pagesize
总页数:数据总数/页面大小 如有余数 总页数+1
3、子查询和嵌套式查询
它的本质是: 在where语句中在嵌套一个子查询语句
where(select * from 表名)
由里即外:先查询里面的sql,在查询外面的sql
例:
要查询学生表的信息,和老师表的信息
select * from teacher
where(select * from student)
八、Mysql的函数
常用函数:
select | ABS(-8) | 绝对值 |
select | ceiling(9.4) | 向上取整 |
select | floor(9.4) | 向下取整 |
select | rand() | 返回一个0~1之间的随机整数 |
select | sign(10) | 判断一个数的符号 |
字符串函数:
select | Char_length() | 字符串长度 |
select | Concat | 拼接字符串 |
select | lower(``) | 小写字母 |
select | upper(``) | 大写字母 |
聚合函数:
函数名称 | 描述 |
count() | 计数 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
九、数据库级别的MD5加密(扩展)
什么是MD5呢?
1991年,Rivest开发出技术上更为趋近成熟的MD5算法。它在MD4的基础上增加了"安全带"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。
主要增强算法复杂度,和不可逆性,MD5不可逆,具体的值md5是一样的
SQL语句
insert into md5(`id`,name.pwd)
values(1,"1","123456")
加密:
update md5 set pwd=md5(pwd)
where id = 1
全部密码加密
update md5 set pwd=MD5(pwd)
插入的时候加密
insert into md5 values(4,"1",MD5('123456'))
十、select语法总结
注: 注意前后顺序,不能颠倒
select 去重(distinct) 字段名 from 表名 (表名和字段名可以用as取别名 as也可省略不写)
XXX join 表名
on 等值判断
where(具体的值,子查询语句)
Group By 字段名(通过某个字段来分组)
Having (过滤分组后的信息,条件和where一样,只是位置不同)
Order By 字段名(ASC 升序,DESC 降序)
limit 当前页,页面大小
十一、数据库的事务
1、什么是事务呢?
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
总结成一句话:要么都执行,要么都不执行。
2、事务有哪些呢?
ACID
A、原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事物有任何影响。
C、一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
I、隔离性(Isolation)
隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰,多个并发事务之间,应当相互隔离。
D、持久性(Durability)
持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
十二、隔离所导致的问题
1、脏读
读未提交是最低的隔离等级,一个事务能够读到其他事务尚未提交的修改,存在脏读问题。
2、不可重复读
比读未提交高一个等级。一个事务未提交或者回滚时,对这个事务涉及的数据加上了读锁和写锁。写锁在这个事务结束时才释放;读锁在这个事务完成SELECT操作之后立即释放。由于释放读锁时,这个事务还未提交,此时如果其他事务来读取这个值,会导致不可重复读问题和幻读问题。
在“读已提交”隔离等级下,能够确保读到的数据,都是经过提交(COMMITTED)的数据,不可能是某种临时性的数据,所以避免了脏读问题。但不能够保证当重复读取这个数据时,这个数据不变,即不可重复读。
3、幻读
当一个事务对所有涉及的数据加上了读锁和写锁之后,如果另一个事务此时插入了一条数据也满足第一个事务的筛选条件,这样就会导致最后结果不满足第一个事务,而是两个事务的混合结果,即幻读问题。
4、串行化
这是最高的隔离等级。在事务完成之前,对这个事务涉及的数据加上读锁和写锁,而且加上了范围锁(range-locks),使得当这个事务未提交时,其他事务无法插入满足这个事务筛选条件的新数据。这样避免了幻读问题。
5、数据库的隔离等级
级别 | 脏读 | 不可重复读 | 幻读 | 中文名称 |
READ_UNCOMMITTED | 允许 | 允许 | 允许 | 读未提交 |
READ_COMMITTED | 阻止 | 允许 | 允许 | 读已提交 |
REPETABLE_READ | 阻止 | 阻止 | 允许 | 可重复读 |
SERIALIZABLE | 阻止 | 阻止 | 阻止 | 序列化 |
可重复读是mysql默认的数据库隔离等级
十三、数据库的索引
1、什么是索引
索引(index)是帮助mysql数据库高效读取数据的数据结构。
2、什么是数据结构
是以某种特地的布局方式存储数据的容器
3、主键索引
唯一的标识,主键不可重复,只能有一个列作为主键
4、唯一索引
避免重复的列出现,唯一索引不可重复,列都可以设置
5、常规索引
默认的
6、全文索引
在特定的数据库引擎才有,MyISAM
FullText index(索引名) 列名。
7、索引原则
1、索引不是越多越好
2、不要对进程变动的数据库加索引
3、小数据量的表不需要索引
4、索引一般加在常用字段
十四、数据库三大范式
1、为什么需要数据规范化
信息重复 、更新异常 、 插入异常 、 删除异常
2、第一范式
原子性:保证每一列都不可再分
3、第二范式
前提:满足第一范式
每张表只描述一件事情
4、第三范式
前提:满足第二范式
需要确保数据库表中的每一列数据都和主键直接相关而不是间接相关
5、规范性和性能问题
1、关联查询的表不能超过三张
2、规范性越好,会影响性能
3、故意结表增加冗余字段,计算列