跳至主要內容
MySql-索引

这里有一点个人看法,我们理解数据库数据结构选型的时候,结合现实开发当中的情形,通常读占有大部分的情况,伴有数据新增,数据更新,数据删除的场景,那么一个数据库数据结构首先要满足我们对于查询速度的考量,其次插入数据,更新数据,删除数据也要有不俗的变现

  • 索引的出现是为了提高查询效率,类似一本书,查找内容,一种方式是通过目录来快速查看,一种是翻页从头到尾来检索,这里的目录就是索引

索引模型

  • 提高读写效率的数据结构有很多,有以下这些数据结构,分别是:
    • 哈希表
    • 有序数组
    • 二叉搜索树
    • 平衡二叉搜索树
    • 红黑树
    • B 树
    • B+ 树

HFwas...大约 4 分钟MySqlMySql
MySql-基础查询
  • 使用数据库
USE myemployees;
  • 查询表中单个字段
SELECT first_name FROM employees;

HFwas...大约 4 分钟MySqlMySql
MySql-函数查询

分组函数

  • 说明:分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数
  • 分组函数清单:
    • sum(字段名):求和
    • avg(字段名):求平均数
    • max(字段名):求最大值
    • min(字段名):求最小值
    • count(字段名):计算非空字段值的个数
  • 特点:
    • sum,avg一般用于处理数值类型, max,min,count可以处理任何类型,以上分组函数都忽略Null值,可以和distinct搭配实现去重的运算
    • count函数的单独介绍,一般使用count(*)用作统计行数
    • 和分组函数一同查询的字段要求是group by后的字段

HFwas...大约 4 分钟MySqlMySql
MySql-复杂查询

分组函数

  • 说明:分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数
  • 分组函数清单:
    • sum(字段名):求和
    • avg(字段名):求平均数
    • max(字段名):求最大值
    • min(字段名):求最小值
    • count(字段名):计算非空字段值的个数
  • 特点:
    • sum,avg一般用于处理数值类型,max,min,count可以处理任何类型,以上分组函数都忽略Null值
    • 可以和distinct搭配实现去重的运算
    • count函数的单独介绍, 一般使用count(*)用作统计行数
    • 和分组函数一同查询的字段要求是group by后的字段

HFwas...大约 4 分钟MySqlMySql
MySql-进阶查询

子查询

  • 说明:当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询外面的select语句称为主查询或外查询
  • 分类:
    • 按子查询出现的位置进行分类:
      • select后面,要求:子查询的结果为单行单列(标量子查询)
      • from后面,要求:子查询的结果可以为多行多列
      • where或having后面 ,要求:子查询的结果必须为单列,分为:单行子查询,多行子查询
      • exists后面,要求:子查询结果必须为单列(相关子查询)
    • 特点:
      • 子查询放在条件中,要求必须放在条件的右侧
      • 子查询一般放在小括号中
      • 子查询的执行优先于主查询
      • 单行子查询对应了 单行操作符:> < >= <= = <>
      • 多行子查询对应了 多行操作符:any/some all in

HFwas...大约 6 分钟MySqlMySql
MySql-连接查询
  • 说明:又称多表查询,当查询语句涉及到的字段来自于多个表时,就会用到连接查询

  • 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

    • 发生原因:没有有效的连接条件
    • 如何避免:添加有效的连接条件
  • 分类:

    • 按年代分类:
      • sql92标准:仅仅支持内连接
        • 内连接:
          • 等值连接
          • 非等值连接
          • 自连接
      • sql99标准
        • 【推荐】:支持内连接+外连接(左外和右外)+交叉连接
    • 按功能分类:
      • 内连接: 等值连接 非等值连接 自连接
      • 外连接:
        • 左外连接
        • 右外连接
        • 全外连接
      • 交叉连接
  • 内连接

    • 语法:

HFwas...大约 3 分钟MySqlMySql
MySql-DML语句

DDL语言

  • 说明:

    • Data Define Language数据定义语言,用于对数据库和表的管理和操作
  • 库的管理-

    • 创建数据库
    CREATE DATABASE stuDB;
    CREATE DATABASE IF NOT EXISTS stuDB;
    
    • 删除数据库
    DROP DATABASE stuDB;
    
    DROP DATABASE IF EXISTS stuDB;
    
  • 表的管理

    • 创建表

      • 语法:
      CREATE TABLE [IF NOT EXISTS] 表名(
          字段名  字段类型  【字段约束】,
          字段名  字段类型  【字段约束】,
          字段名  字段类型  【字段约束】,
          字段名  字段类型  【字段约束】,
          字段名  字段类型  【字段约束】
      );
      
    • 案例:没有添加约束

    CREATE TABLE IF NOT EXISTS stuinfo(
        stuid INT ,
        stuname VARCHAR(20),
        stugender CHAR(1),
        email VARCHAR(20),
        borndate DATETIME
    );
    
    • 案例:添加约束
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE IF NOT EXISTS stuinfo(
        stuid INT PRIMARY KEY,#添加了主键约束
        stuname VARCHAR(20) UNIQUE NOT NULL,#添加了唯一约束+非空
        stugender CHAR(1) DEFAULT '男',#添加了默认约束
        email VARCHAR(20) NOT NULL,
        age INT CHECK( age BETWEEN 0 AND 100),#添加了检查约束,mysql不支持
        majorid INT,
        CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id)#添加了外键约束
    );
    
  • 数据类型:

    • 整型
      • TINYINT SMALLINT INT BIGINT
    • 浮点型
      • FLOAT(m,n)
      • DOUBLE(m,n)
      • DECIMAL(m,n)
      • m和n可选
    • 字符型
      • CHAR(n):n可选
      • VARCHAR(n):n必选
      • TEXT
      • n表示最多字符个数
    • 日期型
      • DATE TIME DATETIME TIMESTAMP
    • 二进制型
      • BLOB 存储图片数据

HFwas...大约 6 分钟MySqlMySql
MySql-Sql 语句是如何执行

MySql基本架构图

  • MySql分为两部分
    • Server层
      • 连接器
      • 查询缓存
      • 分析器
      • 优化器
      • 执行器等
    • 存储引擎
      • 负责数据的存储和提取
      • 支持 InnoDB,MyISAM,MEMORY 等多个存储引擎
Snipaste_2023-10-12_23-32-49

HFwas...大约 3 分钟MySqlMySql
MySql-更新语句是如何执行
  • 更新语句与查询语句相比,分析器会通过词法和语法解析知道这是一个更新语句,

WAL技术

  • 在 MySql 当中如果每一次更新都要写磁盘,然后磁盘也要找到对应的那条更新的记录,然后再更新,整个过程当中IO技术,查找成本都比较高,然后使用到 WAL 技术,别名是 Write-Ahead Logging,关键点是先写日志,再写磁盘。
  • 详细介绍:当有数据更新时,InnoDB 引擎就会先把记录写到 redo log 当中,并且更新到内存当中,这个时候更新就算完成了。同时 InnoDB 引擎会在合适的时候,将这个操作更新到磁盘当中,而这个更新往往会在系统比较清闲的时候。

HFwas...大约 4 分钟MySqlMySql
MySql-事务

事务隔离级别

  • 隔离级别包含:
    • 读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到

    • 读提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到

    • 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

    • 串行化(serializable ):顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。


HFwas...大约 2 分钟MySqlMySql