• MySQL基础内容的总结


    1.数据库类型

    • 关系型数据库 —— mysql oracle sqlite

    • 非关系型数据库 —— mongodb redis

    2.存储引擎

    • InnoDB
      • 数据存储持久化
      • 数据和索引存储在一起
      • 支持事务 行级锁 表级锁 外键
        事务:保证数据的完整性, 原子性操作
        行级锁:修改少量行的时候, 针对修改频繁的表
        表级锁:批量修改行的时候, 针对要大量修改数据的表
        外键:约束两张表中的关联字段不能随意的添加删除,降低数据删改的出错率
      • mysql 5.6 之后的默认存储引擎
    • Mysiam
      • 数据存储持久化
      • 数据和索引不存储在一起
      • 只支持表级锁
      • mysql 5.5 之前的默认存储引擎
    • Memory
      • 存储在内存中,断电消失
    • 查看存储引擎的操作
      查看所有存储引擎:show engines;
      查看当前默认存储引擎:show variables like 'default_storage_engine';

    3.MySQL数据类型

    数据类型主要有四种:数字、时间、字符串和单多选行为,这里只总结了比较常用的部分^ ^

    • 数字
      • 整数 int
      • 浮点数 float(a,b) 一共a位,小数点后占b位
    • 时间
      • 年月日 date
      • 时分秒 time
      • 年月日时分秒 datetime
    • 字符串
      • char
        • 定长存储, 节省时间
        • 最多存储255个字符
        • 适合手机号,身份证件号,银行卡号,用户名密码......
      • varchar
        • 变长存储, 节省空间
        • 最多存储65535个字符
        • 适合评论......
      • enum / set
        • enum 单选行为
        • set 多选行为(会自动去重)

    4.操作

    1.启动/关闭服务

    cmd管理员模式

    • 启动 —— net start mysql
    • 关闭 —— net stop mysql
    • 启动客户端
      • 连自己的 —— mysql -uroot -p
      • 连别人的 —— mysql -uroot -p 密码 -h ip
        • eg. mysql -uroot -p123 -h192.168.14.12

    2.和用户相关的操作

    • 查看当前用户:select user();
    • 创建一个用户:create user 用户名@ip identified by 密码
      • eg. create user 'guest'@'192.168.0.%' identified by '123456';
    • 给当前用户设置密码:set password = password('...');
    • 给用户授权
      • 权限类型: all / select / select, insert(所有权限/查看/查和增)
      • grand 权限类型 on 数据库名.* to 用户名@ip;

    3.库相关的操作

    • 查看所有数据库:show databases;
    • 创建库:create database 库名;
    • 切换到某个库:use 库名;
    • 查看当前库下的表:show tables;
    • 删除库:drop database 库名;(删库需谨慎!!!)

    4.表相关的操作

    • 创建表:

      在建表之前前还有一件重要的东西要提,那就是完整性约束,分为以下七种

      • 无符号:unsigned(只适用数字类型)
      • 唯一约束:unique
        • 联合唯一:unique(字段1,字段2)
      • 非空约束:not null
      • 主键约束:primary key
        • 联合主键:primary key(字段1,字段2)
        • 主键自带 unique + not null
        • 一张表只能有一个主键
      • 自增约束:auto_increment
        • 至少是unique约束才能用
        • 常见用于id字段
      • 外键约束:foreign key(字段) references 外表(字段)
        • 外表字段至少是unique约束
      • 默认值约束:default 'xxx'
    • 建表:

      create table 表名(
      id int,
      name char(18),
      字段名3 类型[(宽度) 约束条件]
      );
      # 放在中括号里的内容可以不写
      
    • 查看表结构

      • desc 表名;(结构清晰,但信息没有那么全)
      • show create table 表名;(信息更全,但显示没那么清晰)
    • 修改表结构

      • 改表名:alter table 旧表名 rename 新表名;
      • 增加字段:alter table 表名 add 字段名 数据类型 约束 (first / after 某字段);
      • 修改字段:
        • alter table 表名 modify 字段名 数据类型 约束;
        • alter table 表名 change 旧字段名 新字段名 数据类型 约束
      • 删除字段
        alter table 表名 drop 字段名;
    • 查整张表的数据:select * from 表名;

    5.数据相关的操作

    1.增

    • insert into 表名 values();
    • insert into 表名(字段1,字段2) values();

    2.删

    • 删除表中的某行数据:delete from 表名 where 条件;
    • 清空表中数据
      • delete from 表名(保留自增偏移量)
      • truncate 表名;(清空自增偏移量)

    3.改

    • update 表名 set 字段=新值 where 条件;

    4.查(重点)

    • 单表查询

      • 基础查询:

        • 查看表中全部数据:select * from 表名;
        • 查看表中某个字段数据:select 字段 from 表名;
      • 重命名字段:

        • select 字段 新字段名 from 表名;(仅显示数据的时候改变,并不会真的修改表结构)
      • 去重:

        • select distinct 字段名 from 表名;
      • 拼接:

        • concat():select concat(emp_name,':',salary) from employee;
        • concat_ws(), 以第一个参数为分隔符:concat_ws('|',cid,cname);
      • where条件语句:

        • 比较运算符:> < = <= >= !=
        • 范围:
          • between...and...(顾头顾尾)
          • in(a,b,c)
        • 模糊查询like:
          • % 任意长度任意内容
          • _ 一个字符长度任意内容
        • 逻辑运算:not > and > or
      • 分组和聚合函数

        • 分组:group by

        • 聚合

          • 求个数 count()
          • 求最大最小值 max(), min()
          • 求和 sum()
          • 求平均值 avg()
          # 在成绩表中,按学生学号分组,并他们的平均分
          mysql> select student_id,avg(num)  from score group by student_id;
          +------------+----------+
          | student_id | avg(num) |
          +------------+----------+
          |          1 |  10.0000 |
          |          2 |  38.0000 |
          |          3 |  82.0000 |
          |          4 |  73.0000 |
          |          5 |  73.0000 |
          |          6 |  38.0000 |
          |          7 |  38.0000 |
          |          8 |  38.0000 |
          |          9 |  79.0000 |
          |         10 |  66.5000 |
          |         11 |  66.5000 |
          |         12 |  66.5000 |
          |         13 |  87.0000 |
          +------------+----------+
          
        • 过滤语句 having:

          • 筛选符合条件的某一组数据,而不是某一行数据
          # 在成绩表中,按学生学号分组,并找出平均分大于60的数据
          mysql> select student_id,avg(num)  from score group by student_id having avg(num)>60;
          +------------+----------+
          | student_id | avg(num) |
          +------------+----------+
          |          3 |  82.0000 |
          |          4 |  73.0000 |
          |          5 |  73.0000 |
          |          9 |  79.0000 |
          |         10 |  66.5000 |
          |         11 |  66.5000 |
          |         12 |  66.5000 |
          |         13 |  87.0000 |
          +------------+----------+
          
      • 查询排列:order by

        • 默认升序asc, 可以修改desc为降序
      • 数量限制:limit m,n

        • 从m+1起取n个
    • 多表联查

      • 连表查询

        • 1.select * from 表1,表2 where 条件(了解)
        • 2.内连接:select * from 表1 inner join 表2 on 连接条件;
          • 保留双方都有的内容
        • 3.外连接
          • 左外连接:select * from 表1 left join 表2 on 连接条件;
            • 左表信息全部保留
          • 右外连接:select * from 表1 right join 表2 on 连接条件;
          • 全外连接
            • mysql不直接支持
            • 左外连接 union 右外连接
      • 子查询 -- 嵌套

        # 查看开发部员工姓名
        # 先查询技术部的部门id
            select id from department where name = '开发';
        #  再根据这个部门id找到对应的员工名
            select name from employee where dep_id =(select id from department where name = '技术');
        

    5.索引与存储数据的方式

    • 索引:
      • 创建:create index 索引名 on 表名(字段名);
        • 联合索引:create index 索引名 on 表名(字段1, 字段2);
      • 删除:drop index 索引名 on 表名;
      • 作用:加快查找速度
    • 存储数据方式:
      • b+树
      • 聚集索引 / 聚簇索引
        • 叶子节点存储具体数据
        • Innodb中的主键
      • 非集聚索引 / 非聚簇索引 / 辅助索引
        • 叶子节点不存具体的数据, 存储主键和索引列
        • Innodb Myisam

    6.正确使用MySQL

    • 操作库的角度
      • 搭建集群
      • 读写分离
      • 分库
    • 操作表的角度
      • 合理安排表与表之间的关系
      • 固定长度的字段放前面
      • 尽量用char代替varchar
    • 操作数据的角度
      • 在where就把范围缩小
      • 尽量用连表查询代替子查询
      • 删改数据尽量用主键
      • 正确使用索引
        • 创建索引
          • 选择区分度较大的字段, 重复率低于1/10
          • 选择短字段作为索引
          • 不要创建不必要的索引, 不用的索引及时删除
        • 使用索引
          • 查询的字段为索引字段
          • 条件范围越小越快
          • 条件列不参与计算和使用函数
          • 模糊查询 like 'a%' 而不是 like '%a'
          • and/or
            • and连接 有一个有索引就能名中
            • or连接 全部有索引才能命中
          • 联合查询(最左前缀原则)
            • create index ind_mix on t1(id,name,email);
            • 条件中带最左字段的都能命中, 否则不能
          • 条件中的数据类型和实际字段的类型必须一致
          • select 字段中应该包含 order by 中的字段

    7.补充

    • 覆盖索引
      • 查询过程不用回表 eg. select id from 表 where id > 10000;
    • 索引合并:分别创建的两个索引在某一次查询中临时合并成一条索引
    • 执行计划:explain select 语句
      • 查看sql语句有无按预期执行
      • 查看type等级
      • 查看索引使用情况
    • 慢查询优化
      • 首先优化sql语句
        了解业务场景, 适当创建索引
        连表查询代替子查询
        确认索引命中情况
      • 修改表的结构
        拆表
        固定长度字段往前移
      • 使用执行计划观察type等级
    • 慢日志
      • mysql的配置中开启, 并设置时间,在超过设定时间之后,这句sql总是会被记录下来,对被记录下来的 sql语句定期优化。

    自学两个半月了,希望通过写博客来复习回顾之前学的内容,同时记录自己的学习经历……

  • 相关阅读:
    搭建SSM框架 Demo
    Mybatis (ParameterType) 如何传递多个不同类型的参数
    IDEA如何将本地项目上传到码云
    VUE项目
    Oralce(三)特殊符号
    NodeJS and Intellij IDEA
    Handler
    Netty 框架 (一) channelDisconnected、channelClosed两个事件区别
    数据库索引
    Websocket
  • 原文地址:https://www.cnblogs.com/straightup/p/13409861.html
Copyright © 2020-2023  润新知