MySQL

该笔记学习B站up主: 狂神说java 的mysql视频所得
链接 : https://www.bilibili.com/video/BV1NJ411J79W?from=search&seid=869715549617273125

数据库

概念 : 数据仓库,软件,安装在操作系统之上
作用 : 存储数据,管理数据

数据库分类

关系型数据库 (SQL)

通过表和表之间,列与行之间的关系进行数据存储

非关系型数据库 (NoSQL)

对象存储,通过对象的自身的属性决定

基本命令

-- 命令行连接
mysql -u用户名 -p密码
-- 修改密码
update mysql.user set authentication_string=password('新密码') where user='root' and HOST = 'localhost';
-- 刷新权限
flush privileges;
-- 查看所有的数据库
show databases;
--切换数据库
use 数据库名;
-- 查看所有的表
show tables;
-- 显示数据库中所有表的信息
describe 表名;
-- 创建数据库
create database 数据库名;
--退出连接
exit

DDL 定义
DML 操作
DQL 查询
DCL 控制

操作数据库

操作数据库>操作数据库中的表>操作数据库中的表中的数据

如果表名或者字段名是特殊字符的话,需要加上``符号
这个符号在tab键上面

-- 创建数据库(如果不存在则创建,判断条件可以加可不加)
create database if not exists 数据库名;
-- 移除数据库(如果存在则删除)
drop database if exists 数据库名;
-- 使用数据库
use 数据库名;
数据库列类型

数值

  • tinyint 十分小 1个字节
  • smalint 较小 2个字节
  • mediumint 中等 3个字节
  • int 标准的存储 4个字节
  • bigint 较大的 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • decimal 字符串形式的浮点数 金融计算的时候一般使用这个

字符串

  • char 字符串固定大小 0~255
  • varchar 可变字符串 0~65535
  • tinytext 微型文本 一般用于博客
  • text 文本串 保存大文本

时间日期

  • date YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
  • timestamp 时间戳 1970.1.1到现在的毫秒数
  • year 年份表示

null

  • 没有值或者未知的值
    注意:不要使用NULL进行运算,使用NULL运算的结果为NULL
数据库的字段属性

Unsigned :

  • 无符号整数
  • 声明了该列不能声明为负数

zerofill

  • 0填充的
  • 不足的位数使用0来填充

自增

  • 通常理解为自增,自动在上一条记录中的基础上+1
  • 通常用来设计唯一的主键,必须是整数类型
  • 可以自定义设置主键自增的起始值和步长

NULL 和 not NULL

  • 设置为非空的话,如果不填写值得话会报错
  • 设置为空的话,默认就是NULL

默认

  • 设置默认的值
  • 如果不指定该列的值,则会填充默认的值

拓展:一张表常用的字段

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

MySQL中数据类型的长度问题总结

  • int类型
    INT(1),你可以插数字1,也可以插100,1000。
    int(M)
    M最大显示宽度,最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关
    INT(10)、INT(11)是指定显示宽度,不是存储大小或者值的范围,再看一个例子:
    INT(3)的情况下 插入数字20,和数字2以及数字200,显示结果为:
    020;
    002;
    200;
    这样的话就是当你设置了宽度的时候,如果存的数值小于这个宽度的话.就会帮你默认用0填充.
  • varchar(M)
  • 括号里面的值就是可变长度,在这个范围内,可以随意写入范围内的字符,在mysql5.0后英文和中午都是同样的字符,但是低版本中汉字是占3个字符
  • char(M)
    char中的M是规定的固定长度
创建数据库表格式
create table [if not exists] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
....
`字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集类型][注释]
数据库引擎
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持(表锁)支持(行锁)
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大(约为MYISAM的2倍)

常规使用操作

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,支持事务的处理,(因为是行级锁)多表用户操作

扩展 : 两大索引在物理空间的位置
所有数据文件都存放在数据库中的data目录下,一个文件夹对应一个数据库,
数据库的本质还是文件的存储

  • InnoDB在数据库表中只有一个*.frm文件,以及上级目录下的 ibdata1 文件
  • MYSIAM 对应的文件:
    1. *.frm 表结构文件
    2. *.MYD 数据文件
    3. *.MYI 索引文件

设置数据库表的字符集编码

CHARSET=utf8

不设置的话会采用mysql的默认字符集编码(不支持中文)

方式一:

在创建表的时候,加上 CHARSET=utf8

方式二:

直接在mysql的my.ini文件中加上 character-set-server=utf8

建议使用方式一,因为通用性较高

修改表
-- 修改表名
alter table 旧表名 rename 新表名
-- 增加表的字段
alter table 表名 add 字段名 列属性
-- 修改表的字段(修改约束)
alter table 表名 modify 字段名 列属性
-- 修改表的字段(重命名)
alter table 表名 change 旧字段名 新字段名 列属性
-- 删除表的字段
alter table 表名 drop 字段名
删除表
-- 如果该表存在就删除
drop table if exists 表名

MySQL数据管理

物理外键

方式一:在创建表的时候添加外键约束

方拾二:在创建表的时候没有添加外键约束,后期可以在修改表的时候进行添加约束

-- 由于用的不多,只记录方式二的方法
alter table 表名 add constraint 约束名 foreign key (作为外键的列) references 要关联的哪个表(哪个字段)

不建议使用物理外键,:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

操作符
操作符含义
=等于
<>或!=不等于
>大于
>小于
>=大于等于
<=小于等于
BETWEEN 数值1 and 数值2在数值1和数值2之间,包含数值1和数值2
AND
OR
insert

插入字段

-- 插入字段(添加)
insert into 表名(字段名1,字段名2,字段名3) values(1,2,3);
-- 简写insert (如果不写表字段的话,他就会一一对应)
insert into 表名 values(1,2,3)
-- 对字段插入多个多个值
insert into 表名(字段名) values(属性值1),(属性值2),(属性值3) --这样的话就会对和这个字段插入了三条属性值

注意事项:

  1. 字段和字段之间使用 英文逗号 隔开
  2. 字段是可以省略的,但是后面的数据必须是一一对应的,不能少
  3. 可以同时插入多条数据,values后面的值,需要使用 , 隔开
update

修改

-- 不带where条件的修改
update 表名 set 列名 = 属性值  -- 这样的话该表中的该列中的值都会发生改变
-- 带where条件的修改
update 表名 set 列名 = 属性值 where 列名 = 条件值
-- 多个属性修改 逗号隔开
update 表名 set 列名1 = 属性值1 , 列名2 = 属性值2  where 列名 = 条件值

注意:

  1. 写列名时候尽量加上``符号
  2. 如果没有加筛选的条件的话,就是修改该列下的全部的值
  3. value 是一个具体的值也可以是一个变量
  4. 多个设置的属性之间,使用英文逗号隔开
delete

删除

-- 删除语句不带条件就是把整个表中的数据全部删除
delete from 表名 
-- 带条件的删除语句
delete from 表名 where 列名 = 条件值

TRUNCATE 清空表数据

-- 清空表数据
truncate 表名	
delete truncate 和drop区别

delete和truncate都可以删除数据,但是都不会删除表结构,truncate不会影响事务,但是会重新设置自增列计数器归零
drop则删除整个表(结构和数据)

拓展: delete 删除的问题

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

查询

-- 查询所有字段
select * from 表名
-- 查询某些字段
select 字段1,字段2 from 表名
-- 使用别名 可以给字段和表起别名
select 字段1 as 别名1,字段2 as 别名2 from 表名 as 别名
distinct

去重

-- 去重查询 去除查询出结果中重复的数据,重复的数据只显示一条
select distinct 列名 from 表名
where 条件字句

检索数据中符合条件的值

联表查询

join

操作描述
inner join如果表中至少有一个匹配的,就会返回行
left join会从左表中返回所有的值,即使右表中没有匹配的数据
right join会从右表中返回所有的值,即使左表中没有匹配的数据
自连接

一张表的自连接核心:一张表拆分成两张一样的表即可

分页和排序

排序 order by 条件字段

-- desc 降序
select * from 表名 order by 条件字段 desc

-- asc 升序
select * from 表名 order by 条件字段 asc

分页

 limit 起始值 每页的大小

n : 当前页
pagesize : 页面大小
起始页 : (n-1)*pagesize
总页数 :

  • 数据总数%页面大小==0?数据总数/页面大小:数据总数/页面大小+1
  • totalPage= (size+ maxsize-1) / maxsize; (推荐)
  • totalPage= (int) Math.ceil(size/ maxsize);

MySql函数

常用函数

数学运算

select abs(-2) -- 绝对值
select ceiling(9.1) -- 向上取整
select floor(9.2) -- 向下取整
select rand() -- 返回一个0~1之间的随机数
select sign(19) -- 判断一个数的符号 负数返回-1 正数返回1 0的话返回0

字符串

select char_length('dadsaaaa') -- 返回字符串长度
select concat('ada','dada')  -- 将字符串拼接起来返回
select insert('ada',1,2,'qeq') -- 查询 替换 从某个位置替换字符  qeqa
select lower('qeq') -- 转为小写字母
select upper('wew') -- 转为大写字母
select instr('dads','d') -- 返回d第一次出现的字符串的索引
select substr('qeq')
count
count(字段)  -- 会忽略所有的null值
count(*) -- 不会忽略所有的null值   
count(1)  -- 不会忽略所有的null值
-- 都可以统计表中的数据
-- count(*)和count(1)本质都是计算行数
分组

group by

-- 语法
select 查询列表 from[where 筛选条件] group by 分组的字段 [order by 排序的字段];
数据库级别的MD5加密

MD5 : 主要增强算法复杂度和不可逆性
MD5()是一个函数,可以在增删改查时候进行使用

例如:

insert into usertable(password) values(md5('123'));
-- 这样插入的就是一个MD5加密后的密文
select 完整语法
select [all|distinct]
{*|table.*|[table.field1[as alias1][,table.field2[as alias2]][,...]]}
from table_name [as table_alias]
	[left | right | inner join table_name2] -- 联合查询
	[where ...] 指定结果查询
	[group by] -- 指定结果按照哪几个字段进行分组
	[having] -- 过滤分组的记录必须满足的次要条件
	[order by ...] -- 指定查询结果按照一个或多个条件排序
	[limit {[offset,]row_count | row_countOFFSET offset}];
	--指定查询的记录从哪条至哪条

事务

要么都成功要么都失败

事务原则: ACID
原子性 一致性 隔离性 持久性

原子性
针对同一个事务
原子性表示这两个步骤要么都成功,要么都失败

一致性
针对一个事务操作前后的状态一致
一致性表示事务完成后,符合逻辑运算
事务前后的数据完整性要保持一致

隔离性
针对多个事务操作,主要排除其他事务对本次事务影响,不能被其他事务操作数据所干扰

隔离失败导致的问题
脏读
指的是一个事务读到另外一个事务未提交的数据
不可重复读
在一个事务读取表中的一行数据,多次读取结果不同
幻读
值得是一个事务内读取到了别的事务插入的数据,导致前后读取的结果不一致

持久性
表示事务结束后的数据不会随着外界原因导致数据丢失
事务没有提交,数据恢复到原装
事务提交后,数据持久化到数据库
事务一旦提交就不可逆了

-- mysql默认开启事务自动提交
set autocommit = 0 -- 关闭事务自动提交
set autocommit = 1 -- 开启事务自动提交
-- 标记事务的开始,从这个之后的sql都在一个事务中
start transaction 
-- 提交事务
commit
-- 回滚事务
rollback

事务路程

在这里插入图片描述

索引

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

索引的分类
单列索引

指的是一个索引中只包含一个列,一个表中可以有多个单列索引

  • 主键索引 (primary key)
    唯一标识,主键不可以重复,不能为空,只有一个列可以作为主键索引
  • 唯一索引 (unique key)
    避免重复出现的值,唯一索引可以创建多个
  • 常规索引 (key/index)
    默认的,可以用index或者key关键字设置
  • 全文索引 (fulltext)
    在特定的数据库引擎下使用

组合索引

值得是一个索引中包含两个或两个以上的列

sql格式是:

create 索引类型 索引名 on 表名(字段名(length),字段名(length),…);

  CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

注意点:
1、需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引
3、如果where条件中是OR关系,加索引不起作用
4、符合最左原则
Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .
打破最左原则的话会导致组合索引失效
索引的使用

  1. 在创建表的时候给字段增加索引
  2. 创建完毕后,增加索引
-- 显示所有的索引
show index from 表名
-- 增加索引
alter table 表名 add 索引类型 `索引名`(字段名)
-- 分析sql执行的状况
explain sql语句	

索引原则

  1. 索引不是越多越好
  2. 要不要对经常变动的表加索引
  3. 小数据量的表不需要加索引
  4. 索引一般加在经常用来查询的字段上

数据库规范设计

  1. 分析业务需求
  2. 概要设计:设计关系图 E-R图
三范式

第一范式 : 要求数据库表的每一列都是不可分割的原子数据项
第二范式 : 满足第一范式前提下,每张表只描述一件事
第三范式 : 满足第一和第二范式的前提下,确保数据表中的每一列数据都与主键直接相关,而不是间接相关

反三范式

使用反三大范式的目的是为了,实现效率的提高,在字段类型中使用json的方式存贮多条数据,实现对数据的处理。

三范式的目的是为了以时间换空间,反三范式是以空间换时间

数据库连接池

池化技术 : 准备一些预先的资源,过来就连接预先准备好的资源,连接完毕后重新放回去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon20120331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值