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 函数

官方 https://www.mysql.com/

常用函数

数学运算

  • 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由MD4MD3、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)
    • 在特别数据库引擎下才有
    • 快速定位数据
  • 太重要 涉及知识面太广 先停停

讲索引的博客:https://blog.codinglabs.org/articles/theory-of-mysql-index.html

posted @ 2020-12-21 21:58  immortal_mode  阅读(75)  评论(0)    收藏  举报