• MySQL 基础知识点


    初识 MySQL

    • MySQL 是一种 关系型数据库管理系统RDBMS
    • 开源
    • 默认端口:3306

    数据库语言

    • DDL:Data Definition Language 数据定义语言
    • DML:Data Manipulation Language 数据管理语言
    • DQL:Data Query Language 数据查询语言
    • DCL:Data Control Language 数据控制语言

    MySQL 下载与安装

    https://www.cnblogs.com/blackBlog/p/12844709.html (详见笔者博客)

    MySQL 管理

    官方文档:https://dev.mysql.com/doc/refman/5.7/en/

    MySQL 命令

    1.查看数据库版本:

    SELECT VERSION();
    

    2.查看MySQL提供的所有存储引擎:

    SHOW ENGINES;
    

    image-20200725144252408

    • 默认使用 InnoDB

    3.查看库表的存储引擎

    SHOW TABLE STATUS LIKE 'tb_matrix';
    

    数据库的列类型

    • 数值

      1.tinyint

      2.smallint

      3.int 常用

      4.mediumint

      5.bigint

      6.float

      7.double

      8.decimal

    • 字符串

      1.char

      2.varchar

    • 时间

      1.date

      2.time

      3.datetime

      4.timestamp

    数据库字段属性(重点)

    • 自增

      通常用于设置唯一的主键,必须是整数类型

    • 非空

      NULL

      NOT NULL:不赋值就会报错

    • 默认

      设置默认值

    操作数据库

    • 数据库
    -- 创建数据库
    CREATE DATABASE `数据库名` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
    
    -- utf8: 字符集编码
    -- utf8_general_ci: 不区分大小写
    
    -- 使用数据库
    USE [数据库名];
    
    • 创建数据表
    -- 创建数据库表
    CREATE TABLE [IF NOT EXISTS] `表名`(
        `字段名` 列类型 [属性] [索引] [注释],
        `字段名` 列类型 [属性] [索引] [注释],
    	....
    	`字段名` 列类型 [属性] [索引] [注释]
    )[表类型][字符集设置][注释]
    
    -- 字符集设置
    CHARACTER SET utf8;
    
    • 修改数据表
    -- 修改表名
    ALTER TABLE [数据库表名] RENAME AS [新表名];
    -- 增加表字段
    ALTER TABLE [数据库表名] ADD [字段名] [列属性];
    -- 修改表字段
    ALTER TABLE [数据库表名] MODIFY [字段名] [列属性]; --修改约束
    ALTER TABLE [数据库表名] CHANGE [旧字段名] [新字段名]; --重命名
    -- 删除表字段
    ALTER TABLE [数据库表名] DROP [字段名];
    
    • 删除数据表
    DROP TABLE IF EXISTS [数据库表名];
    

    数据库表类型(引擎)

    -- 引擎
    INNODB: 默认使用
    MyISAM: 早期使用 
    

    InnoDBMyISAM 区别

    MyISAM InnoDB
    事务支持 不支持 支持
    数据行锁定 不支持 支持
    外键索引 不支持 不支持
    全文索引 支持 不支持
    表空间大小 较小 约为MyISAM的2倍

    MySQL 数据管理

    外键

    为什么不用外键?

    阿里巴巴规范:不得使用外键与级联,一切外键概念必须在应用层解决。
    

    DML

    • 数据库管理语言

    新增

    -- 语法
    insert into [表名] ([字段1], [字段2]...) values ([值1], [值2]...), ([值1], [值2]...);
    

    修改

    -- 语法
    update [表名] set [字段名] = [值], [字段名] = [值]... where [条件]; 
    

    删除

    -- 语法
    delete from [表名] where [条件];
    

    清空

    -- 语法
    TRUNCATE [表名];
    
    -- 计数器会归零,不会影响事务
    

    DQL

    • 数据库查询语言
    -- 查询全部信息
    SELECT * FROM [表名];
    -- 查询部分信息
    SELECT [字段名], ... FROM [表名];
    -- AS 给字段名和表名启 别名
    SELECT [字段名] AS [别名], ... FROM [表名] AS [别名];
    
    -- 整体语法格式
    SELECT * 
    FROM [表名]
    WHERE ...
    GROUP BY ... 【指定结果按照哪个字段来分组】
    HAVING ... 【过滤分组的记录必须满足的次要条件】
    ORDER BY ...
    LIMIT ...
    

    去重

    DISTINCT
    -- 作用:去除SELECT查询结果中重复的数据
    

    WHERE 条件子句 (等值查询)

    • 作用:检索符合条件的语句
    1.LIKE (模糊查询)
    -- ... WHERE [cloumn_name] like '%[value]%'
    说明:
    '%' 代表任意字符
    '_' 代表1个字符
    
    2.IN
    具体的1个或者多个值
    
    3.NULL 和 NOT NULL
    
    4.BETWEEN ... AND ...
    
    

    JOIN ON (连接查询)

    1.LEFT JOIN
    左连接
    2.INNER JOIN
    内连接
    3.RIGHT JOIN
    右连接
    
    操作 描述
    inner join 只要有一个匹配,就返回行
    left join 会从左表中返回所有的值,即使右表中没有匹配的值
    right join 会从右表中返回所有的值,即使左表中没有匹配的值

    分页

    ...
    LIMIT (N-1)*pageSize, pageSize;
    
    N: 代表当前页
    pageSize: 页面大小
    数据总数/页面大小: 总页数
    
    -- 说明:缓解数据库压力; 
    

    排序

    ORDER BY ... DESC / ASC
    DESC : 倒序排序
    ASC : 正序排序
    

    子查询(由里及外)

    ...
    WHERE
    (SELECT * FROM ...) 
    

    分组和过滤

    MySQL 函数

    常用函数

    -- 系统
    SELECT VERSION();
    SELECT USER();
    SELECT SYSTEM_USER();
    
    -- 
    

    聚合函数

    -- 统计:COUNT(*) / COUNT(1) / COUNT(column_name)
    SELECT COUNT(*) FROM TABLE_NAME;
    区别:
    1.COUNT(column_name)忽略所有的 NULL 值; COUNT(*) / COUNT(1) 不忽略 NULL 值
    2.COUNT(*) / COUNT(1) 本质计算行数
    
    -- 求合
    SELECT SUM(column_name) FROM TABLE_NAME;
    
    -- 平均值
    SELECT AVG(column_name) FROM TABLE_NAME;
    
    -- 最大值
    SELECT MAX(column_name) FROM TABLE_NAME;
    
    -- 最小值
    SELECT MIN(column_name) FROM TABLE_NAME;
    

    数据库级别的MD5加密

    MD5

    • MD5:信息摘要算法,不可逆性
    • MD5 破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值

    事务

    事务是逻辑上的一组操作,要么执行,要么都不执行。

    事务原则

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

    • 原子性 Atomicity
      事务要么都成功,要么都失败
    • 一致性 Consistency
      事务执行前后的数据完整性要保证一致.
    • 隔离性 Isolation
      事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启事务,不能被其他事务的操作数据干扰
    • 持久性 Durability
      事务一旦提交则不可逆,被持久化到数据库中

    并发事务会带来哪些问题?

    1.脏读:指一个事务读取到另外一个事务未提交的数据
    2.幻读:在一个事务内读取表中的某一行数据,多次读取结果不同
    3.不可重复读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
    4.数据丢失:两个事务都读取了同一数据,事务A修改提交了,事务B也修改提交了。这样对于第一个事务来说就是数据丢失

    事务处理

    MySQL 默认开启事务自动提交

    SET AUTOCOMMIT = 0 /* 关闭 */
    
    SET AUTOCOMMIT = 1 /* 开启 */
    
    START TRANSACTION /* 开启事务 */
    
    -- 提交
    COMMIT
    -- 回滚
    ROLLBACK
    

    事务的隔离级别

    InnoDB 存储引擎默认支持隔离级别的 REPEATABLE-READ (可重复读)已经可以完全保证事务的隔离性要求,即达到了 SQL标准 SERIALIZABLE(可串行化)隔离级别。

    • 读取未提交:可能会有脏读、幻读、可重复读

      READ-UNCOMMITTED

    • 读取已提交:有效避免了脏读

      READ-COMMITTED

    • 可重复读:可以阻止脏读和不可重复读

      REPEATABLE-READ

    • 可串行化:有些的避免了脏读、幻读、可重复读

      SERIALIZABLE

    索引

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

    提取句子主干,就可以得到索引的本质:索引是数据结构

    索引的分类

    • 主键索引 (PRIMARY KEY )
      • 唯一的标识,主键不可重复,只能有一列作为主键
    • 唯一索引 (UNIQUE KEY)
      • 避免重复的列,唯一索引可重复,多个列都可以标识为 唯一索引
    • 普通索引 (INDEX)
      • 默认的
    • 全文索引 (Fulltext)
      • 在特定的数据库引擎下才有,快速定位数据
    • 组合索引

    索引的使用

    索引的使用

    -- 显示所有的索引
    SHOW INDEX FROM [表名];
    
    -- 增加索引
    ALTER TABLE `TABLE_NAME` ADD INDEX INDEX_NAME(column_name) COMMENT '索引备注';
    ALTER TABLE `TABLE_NAME` ADD UNIQUE INDEX_NAME(column_name) COMMENT '索引备注';
    

    使用函数生成测试数据

    -- 函数生成百万数据
    
    /* 创建函数 */
    DELIMITER //
    CREATE FUNCTION mock_data()
    RETURNS INT
    BEGIN 
       DECLARE num INT DEFAULT 1000000;
       DECLARE i INT DEFAULT 0;
       WHILE i<num DO
         -- 插入语句
         INSERT INTO `TB_MATRIX`(`MATRIX_NAME`, `MATRIX_CODE`, `IS_DELETED`) VALUES (CONCAT('矩阵',i),          CONCAT('MATRIX-',i), 0);
         SET i = i+1;
       END WHILE;
    	 RETURN i;
    END;
    
    /* 执行函数 */
    SELECT mock_data();
    

    索引原则

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

    EXPLAIN

    EXPLIAN 输出

    含义
    id SELECT 标识符
    select_type SELECT 类型
    table 表名
    partitions 匹配的分区
    type 联接类型
    possible_keys 可能使用的索引
    key 实际选择的索引
    key_len 所选键的长度
    ref 与索引比较的列
    rows 估计要检索的行
    filtered 按条件过滤的行百分比
    extra 附加信息输出解析

    EXPLIAN 解析

    id

    SELECT 标识符。SELECT 查询中的序号。
    

    select_type

    SELECT 类型,可以是下表中显示的任何类型。
    
    SELECT_TYPE JSON NAME MEAN
    SIMPLE 简单查询(不使用 UNION 或 子查询)
    PRIMARY 最外层查询
    UNION SELECT 陈述中的第二个或之后的陈述 UNION
    DEPENDENT UNION
    UNION RESULT
    SUBQUERY 首先SELECT 在子查询
    DEPENDENT SUBQUERY 首先SELECT在子查询,取决于外部查询
    DERIVED 派生吧
    MATERIALIZED 物化子查询
    UNCACHEABLE SUBQUERY 子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估
    UNCACHEABLE UNION

    table

    table_name: 表名
    

    partitions

    查询将匹配记录的分区。
    

    type

    联接类型。
    
    -------------------------------------------------------------------------
    最佳类型->最差类型
    1.system
    该表只有一行
    
    2.const
    该表最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其他部分可以将这一行中列的值视为常量。const非常块,因为它只能读取一次。
    
    3.eq_ref
    
    4.ref
    从表中读取具有匹配索引值的所有行
    
    5.fulltext
    全文索引
    
    6.ref_or_null
    类似于 ref, 但除了 MySQL 会额外搜索包含 NULL 值的行。此连接类型优化最常用于解析 子查询。
    
    7.index_merge
    此连接类型指示使用索引合并优化。
    
    8.unique_subquery
    
    9.index_subquery
    
    10.range
    使用索引选择行,仅检索给定范围内的行
    
    11.index
    该index连接类型是一样的ALL,只是索引树被扫描
    
    12.ALL
    全表扫描
    

    possible_keys

    MySQL可以选择的查询表中的各行的索引
    

    key

    KEY 指示MySQL实际决定使用的索引。
    

    key_len

    MySQL 实际决定使用的索引的长度
    

    ref

    ref显示将哪些列或常量与该 key 列中命名的索引进行比较。
    

    rows

    rows 列指示 MySQL 执行查询必须检查的行数。
    对于 Innodb, 此数字是估计值,可能并不总是准确的。
    

    filtered

    filtered 列知识被表条件过滤的行的估计百分比,最大值 100;这表示未过滤行。值从100减小表示过滤量增加。
    

    extra

    包含有关 MySQL 如何解析查询的其他信息
    

    权限管理和数据库备份

    用户管理

    SQL 命令操作

    -- 用户表 mysql.user
    
    -- 创建用户
    CREATE USER 用户名 IDENTIFIED BY '密码';
    
    -- 修改密码
    SET PASSWORD = PASSWORD('密码'); -- 修改当前登录用户密码
    SET PASSWORD FOR 用户名 = PASSWORD('密码'); -- 修改指定用户密码
    
    -- 重命名
    RENAME USER 旧用户名 TO 新用户名;
    
    -- 用户授权
    GRANT ALL PRIVILEGES ON *.* TO 用户名;
    
    -- 查询用户权限
    SHOW GRANT FOR 用户名;
    
    -- 撤销用户权限
    REMOVE ALL PRIVILEGES ON *.* FROM 用户名;
    

    MySQL 备份

    为什么需要备份?

    1.防止数据丢失
    2.数据转移
    

    数据库备份方式

    1.直接拷贝物理文件
    2.可视化工具中手动导出
    3.命令行导出(mysqldump)
    
    -- mysqldump -hlocalhost -uroot -proot 数据库名 >磁盘位置
    mysqldump -hlocalhost -uroot -proot matrixdb >D:/theonedb.sql
    

    数据库的规约,三大范式

    三大范式

    为什么需要数据规范化

    1.信息重复
    2.更新异常
    3.插入异常:无法正确显示信息
    4.删除异常:丢失有效信息
    

    三大范式

    第一范式

    原子性。保证每一列不可再分。
    

    第二范式

    前提:满足第一范式
    每张表只描述一件事情,第二范式要求每一列都与主键相关
    

    第三范式

    前提:满足第一范式和第二范式
    每一列必须和主键相关,不可以间接相关
    

    规范性 和 性能问题

    阿里规范:关联查询的表不得超过三张表
    
    1.考虑商业化的需求和目标,数据库的性能更加重要
    2.在规范性能的问题的时候,需要适当的考虑一下 规范性
    3.故意给某些表增加一些多余字段
    4.增加一些计算列(从大数据量降低为小数据量的查询;增加索引)
    

    JDBC(重点)

    数据库驱动

    MySQL Driver:mysql-connector-java

    应用程序 -> JDBC -> MySQL 驱动 -> 数据库

  • 相关阅读:
    Shiro认证过程?
    使用过Redis做异步队列么,你是怎么用的?
    使用 Spring Boot有什么好处
    Spring Boot、Spring MVC 和 Spring 有什么区别?
    es
    python并发编程
    Go基础05
    Go04基础
    Go03基础
    Go基础02
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451716.html
Copyright © 2020-2023  润新知