Mysql
Mysql
1. 数据库
概念:数据仓库
作用:存储数据,管理数据
2.数据库xxx语言 crud
DDL 定义语言
DML 操作语言
DQL 查询语言
DCL 控制语言
2.1 操作数据库
操作数据库--->操作表--->操作数据
-
创建数据库
-
# 如果不存在就创建 create database if not exists immortal; -
删除数据库
-
# 如果存在则删除 drop database if exists immortal; -
使用数据库
-
# 使用数据库 use mybatis; -
查看数据库
-
# 查看数据库 show databases;
2.2 数据库的列类型
数值
-
tinyint 十分小的数据 1个字节
-
smallint 较小的数据 2个字节
-
int 标准的整数 4个字节 常用的
-
bigint 较大的数据 8个字节
-
float 浮点数 4个字节
-
double 浮点数 8个字节(精度问题)
-
decimal 字符串形式的浮点数 金融计算的时候,一般使用decimal
字符串
- char 字符串固定大小 0-255
- varchar 可变字符串 0-65535
- tinytext 微型文本 2^8 -1
- text 文本 2^16-1
时间跟日期
- date YYYY-MM-DD
- time HH:mm:ss
- datetime YYYY-MM-DD HH:mm:ss 常用
- timestamp 时间戳 1970.1.1 到现在的毫秒数
- year 年份
null
- 没有值
- 不要用null进行计算
2.3 数据库库的字段属性(重点)
Unsigned
- 无符号整数
- 声明了该列,不能声明为负数
Zerofill
- 0填充
- 不足的位数,使用0填充 int (3) 5---->(005)
自增
- 通常理解为自增,自动在上一条的记录上+1(默认)
- 通常用来设计唯一的主键,必须是整数类型
- 可以自定义设计主键的起始值和步长
Null 和 Not Null
- 假设设置为Not Null,如果不给赋值,就会报错
- Null 如果不填写值 默认就是Null
默认 Default
- 设置默认的值
- 如果不设置值,会有默认的值
2.4 每一个表都必须要有的字段
id 主键
verison 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
2.5 创建表
创建一个学生表
字段
- 学号int
- 密码 varchar(20)
- 姓名 varchar(20)
- 出生日期 datatime
- 家庭住址 varchar(50)
- 性别 varchar(2)
- email varchar(20)
- AUTO_INCREMENT 自增
- DEFAULT 默认
- PRIMARY KEY 主键
CREATE TABLE if not exists `NewTable` (
`id` int(3) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`name` varchar(20) NOT NULL DEFAULT '懒得一笔' COMMENT 'name' ,
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT 'password',
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci COMMENT='student';
-
格式
-
CREATE TABLE if not exists 表名( `字段名` 列类型 属性 索引 注释, `字段名` 列类型 属性 索引 注释, `字段名` 列类型 属性 索引 注释, `字段名` 列类型 属性 索引 注释, )[表类型][表字符集][注释] -
查看创建数据库 表的语句
-
# 查看数据库创建语句 show create database mybatis; # 查看数据表创建语句 show create table student; -
# 查看表结构 description desc student; -
新手的坑
-
``用这个符号 不要用 ‘ ’ 这个 他们不一样 我找了30分钟 --_--
-
删除修改表
-
# 修改表名 alter table teacher rename as student; -
# 增加表的字段 alter table student add age int(3); -
# 修改表的字段 约束 alter table student modify age varchar(10); -
# 修改表字段的名字 alter table student change age address varchar(20);# 删除表 drop table if exists student;所有的创建和删除尽量加上判断 报错影响心情
2.6 数据库引擎 engine
- INNODB 是默认的
- MYISAM 是早些年使用的
| INNODB | MYISAM | |
|---|---|---|
| 事务支持 | 支持事务 | 不支持事务 |
| 数据行锁定 | 支持 | 不支持 |
| 外键约束 | 支持 | 不支持 |
| 全文索引 | 不支持 | 支持 |
| 表空间的大小 | 较大 约为2倍 | 较下小 |
常规使用操作
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户的操作
所有的数据文件都是存储到data目录下的
本质上还是文件存储
3. Mysql数据管理
3.1 外键(了解)
数据库级别的外键,我们不建议使用,有太多的关联关系(数据库过多造成困扰)
阿里开发手册上有这么一条
【强制】 不得使用外键于级联,一切外键概念必须在应用层解决问题
坦白来说
每次删除或修改都要考虑外键因素,导致开发特别的痛苦
最佳实现
- 数据库就是单纯的表,只用来存储数据
- 我们想使用多张表的数据,想使用外键(用程序去实现)
3.2 DML语言(重要)
数据库意义,存储,管理
DML = 数据操作语言
- insert
- update
- delete
| 操作符 | 含义 | 范围 | 结果 |
|---|---|---|---|
| = | 等于 | 5=8 | false |
| <> 或 != | 不等于 | 5=8 | true |
| < | 小于 | ||
| > | 大于 | ||
| <= | 小于等于 | ||
| >= | 大于等于 | ||
| BETWEENT....and | 在某范围内 | 5~8 | |
| AND | && 和 | 5>8 and 1>2 | |
| OR | || 或 | 5>1 or 1>2 |
3.2.1 插入
# 插入语句格式 insert into 表名(字段1,字段2,字段3)values('值1'),('值2'),('值3');
insert into `student`(`name`)values('immortal');
3.2.2 修改
# 修改语句格式 update 表名 set column_name = 值 where 条件 多个数据逗号隔开
update student set name = '666' where id = 1;
3.2.3 删除
# 删除语句格式 delete from 表名 where 条件
delete from `student` where id = 4;
清空 TRUNCATE
- 作用:完全清空一个数据库的表,表的结构和索引约束不会变
- TRUNCATE 会重新设置自增列 ,不会影响事务
3.3 DQL语言 查询数据
使用频率最高的语句 语法

3.3.1 指定查询字段
select * from 表名;
-- 别名 alias as
select studentName as name from student;
-- 函数 字符串拼接concat(str1, str2,...)
select CONCAT('name:',studentname) as 'new name' from student;
-- 去重 distinct 去除重复的数据
select DISTINCT studentno from result;
-- 查看当前版本
select version();
-- 还可以用来计算
select 1000*3-1 as result;
-- 学员的成绩+1
SELECT studentno,studentresult,studentresult+1 AS '加分后' FROM result;
-- 模糊查询 重点 like 通配符%
select studentno,studentname from student WHERE studentname LIKE '张%';
-- 模糊查询 重点 in 区间
SELECT studentno,studentname,address from student WHERE address IN ('广东','深圳');
3.3.2 连表查询
join 对比

7种join理论

| 操作 | 描述 |
|---|---|
| inner join | 如果表中有一个匹配,就返回行 |
| left join | 会在左表返回所有的值,即使右表里没有匹配 |
| right join | 会在右表返回所有的值,即使左表里没有匹配 |
思路
- 分析需求,分析字段来自于那些表(连接查询)
- 确定使用哪一种查询 inner left right
- 确定交叉点(两个表那些数据是相同的) ON
- 判断的条件
格式
-
SELECT 想要查询的字段 表1 连接方式 表2 ON 交叉点 Where 条件
-
SELECT s.studentno,studentname,subjectno,studentresult FROM student s LEFT JOIN result r ON s.studentno = r.studentno WHERE studentresult IS NULL;
3.3.3 自连接

把一个表想象成两个一模一样的表就好理解了
图片理解能好一点

3.3.4 分页和排序
排序
-
ASC升序 DESC 降序
-
-- 格式 ORDER BY 用于排序的字段 排序方法 SELECT * FROM `result` ORDER BY studentresult DESC;
分页 缓解数据库压力,给用户更好的体验
-
Limit LIMIT 起始数据点,显示数据条数
-
-- 格式 SELECT * FROM `result` ORDER BY studentresult ASC LIMIT 0,5;分页实现

百度图片使用 瀑布流实现 是刷不完的一直在加载
3.3.5 函数
常用函数
数学运算
-
select ABS(-8); --绝对值 SELECT CEILING(9.4); --先上取整 SELECT FLOOR(9.4); --向下取整 SELECT RAND(); --随机数
字符串
-
SELECT CHAR_LENGTH('hello world!') --字符串长度 SELECT CONCAT('hello',' ','world'); --合并字符串 SELECT LOWER('Hello World'); --小写 SELECT UPPER('Hello World'); --大写
时间 日期
-
SELECT CURRENT_DATE(); --获取当前日期 SELECT NOW(); --获取当前时间 SELECT SYSDATE(); -- 系统时间
3.3.6 聚合函数
| 函数名称 | 描述 |
|---|---|
| COUNT() | 计数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大 |
| MIN() | 最小 |
| ...... | ....... |
COUNT();
SELECT COUNT('id') FROM student; --Count(字段) 会忽略null值
SELECT COUNT(*) FROM student; --Count(*) 不会忽略null值
3.3.7 Group By Having

.....
3.4 MD5 加密 (扩展)
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的加密保护领域 [2] 。
-- 加密
UPDATE student SET pwd=MD5(pwd);
3.5 事务
要么都成功,要么都失败
将一组sql 放在一个批次去执行
参考链接
事务原则ACID
- 原子性(Atomicity)
- 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)
- 事务前后数据的完整性必须保持一致。
- 隔离性(Isolation) 事务提交
- 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability)
- 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
隔离性 产生的问题
-
脏读:
- 指一个事务读取了另外一个事务未提交的数据。
-
不可重复读:
- 在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
-
虚读(幻读)
- 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响,多了一行)
- 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
# Mysql 是默认开启事务自动提交的
# 关闭自动提交
SET autocommit = 0;
# 开启 默认
SET autocommit = 1;
# 手动处理事务
SET autocommit = 0;
# 开启事务
start transaction;
insert into grade(gradename)values('研究生');
# 提交: 持久化
commit;
# 回滚: 回到原来的位置
rollback;
# 事务结束
SET autocommit = 1;
3.6 索引
索引的分类
- 主键索引(primary key)
- 唯一的标识,主键不可重复,只能有一个
- 唯一索引(unique key)
- 避免重复的列出现,多个列都可以标识 唯一索引
- 常规索引 (key)
- 默认的 index 和key 关键字来设置
- 全文索引 (FullText)
- 在特别数据库引擎下才有
- 快速定位数据
- 太重要 涉及知识面太广 先停停

浙公网安备 33010602011771号