• Mysql


    1.约束
    2.数据库设计
    3.多表查询
    4.事物
    5.新增/删除/修改语句
    6.单表条件查询
    7.函数
    8.创建数据库/数据表
    9.索引概述
    10.存储引擎
    11.设计表

    执行顺序

    第一步:from 指定要操作的表

    第二步:join 连接表生成一个笛卡尔积

    第三步:on 对笛卡尔积进行筛选

    第四步:where 筛选条件

    第五步:group by 对数据进行分组

    第六步:max min avg count sum 执行分组函数

    第七步:having 对分组后的数据进行过滤

    第八步:select 选取结果

    第九步:distinct 去除重复结果

    第十步:order by 将结果进行排序

    第十一步:limit 取结果集中的部分数据

    约束

    • 非空约束,保证列表中数据,不能为null (NOT NULL)
    • 唯一约束,保证列中所有数据各不相同 (UNIQUE)
    • 主键约束,主键字段是唯一标识,非空且唯一,一张表只有一个 (PRIMARY KEY)
    • 检查约束,保证列中值满足某一条件(mysql不支持) (CHECK)
    • 默认约束,保存数据时,未指定值采用默认值 (DEFAULT)
    • 外键约束,外键约束让两个表之间建立连接,保证数据的一致性和完整性 (FOREIGN KEY)
    • 自动增长,auto_increment

    约束运用

    -- 员工表
    CREATE TABLE emp (
    id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
    ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
    joindate DATE NOT NULL , -- 入职日期,非空
    salary DOUBLE(7,2) NOT NULL , -- 工资,非空
    bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    添加非空约束

    --新建:
    -- 创建表时添加非空约束
    CREATE TABLE 表名(
    列名 数据类型 NOT NULL,);
    -- 建完表后删除
    ALTER TABLE 表名 MODIFY 字段名 数据类型;
    -- 建完表后添加非空约束
    ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
    -- 删除非空约束
    ALTER TABLE emp MODIFY ename VARCHAR(50);
    -- 新建非空约束
    ALTER TABLE emp MODIFY ename VARCHAR(50) NOT NULL;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    添加唯一约束

    -- 创建表时添加唯一约束
    CREATE TABLE 表名(
    列名 数据类型 UNIQUE [AUTO_INCREMENT],
    -- AUTO_INCREMENT: 当不指定值时自动增长);
    CREATE TABLE 表名(
    列名 数据类型,[CONSTRAINT] [约束名称] UNIQUE(列名)
    );
    
    -- 删除唯一约束
     ALTER TABLE emp DROP INDEX ename;
    -- 新建唯一约束
     ALTER TABLE emp MODIFY ename VARCHAR(50) UNIQUE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    默认约束

    -- 创建表时添加默认约束
    CREATE TABLE 表名(
    列名 数据类型 DEFAULT 默认值,);
    
    --  删除默认
    ALTER TABLE emp ALTER bonus DROP DEFAULT;
    --  新建默认约束
    ALTER TABLE emp ALTER bonus SET DEFAULT 0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    主键约束

    -- 删除主键约束,要先删除自增
    alter table emp modify id int;
    -- 删除主键约束
    ALTER TABLE emp DROP PRIMARY KEY;
    -- 添加主键约束
    ALTER TABLE emp ADD PRIMARY KEY(id);
    -- 添加自增
    alter table emp modify id INT  auto_increment;
    -- 设置自增默认值
    alter table emp  auto_increment=3; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    外键约束
    添加外键约束,当主表想要删除关联从表的数据时,需要看从表有没有关联的数据,如果有的话,不能删除,需要删除从表的数据后,才可以删除主表的数据
    在这里插入图片描述

    -- 部门表
    CREATE TABLE dept(
    id int primary key auto_increment,
    dep_name varchar(20),
    addr varchar(20)
    );
    -- 员工表
    CREATE TABLE emp(
    id int primary key auto_increment,
    name varchar(20),
    age int,
    dep_id int,
    -- 添加外键 dep_id,关联 dept 表的id主键
    CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
    -- CONSTRAINT fk_emp_dept(别名) FOREIGN KEY(dep_id)->从表连接id  REFERENCES dept(id)->主表连接id
    );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    数据库设计

    需求分析-设计-编码-测试-安装部署
    一对多:在多的一方建立外键,指向主表
    多对多:中间表包含两个外键
    一对一:在任意一方建立外键,关联主键,设置唯一

    多表查询

    多表查询
    内连接:相当于查询A B的交集数据
    外连接:(左外连接/右外连接)查询A表所有的数据和与B表有交集的数据
    内连接
    select 字段 from 表1,表2 where 条件
    select 字段 from表1 join 表2 on 条件

    -- 隐式内连接
    SELECT a1.NAME,a1.gender,a2.dname FROM emp as a1, dept as a2 WHERE a1.dep_id = a2.did
    -- 显示内连接
    SELECT a1.NAME,a1.gender,a2.dname FROM emp as a1 JOIN dept as a2  ON a1.dep_id = a2.did;
    
    • 1
    • 2
    • 3
    • 4

    外连接
    左外连接
    在这里插入图片描述右外连接
    在这里插入图片描述子查询

    语法:

    单行单列->作为作为值 使用 > < = != 作为判断:

    SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE name = '猪八戒')
    
    • 1

    多行单列 ->当查询的结果存在多个时:

    SELECT * from emp WHERE dep_id in (SELECT did FROM dept WHERE dname ='财务部' or dname = "市场部"); 
    
    • 1

    多行多列 作为虚拟表 -> 查询出的表为结果集时,将当前当作虚拟表来看:
    跟在from后面:

    SELECT * FROM (SELECT * FROM emp WHERE join_date > '2011-11-11')  t1 , dept where  t1.dep_id = dept.did
    
    • 1

    事物

    事物:事物把所有命令看作一个整体提交或撤销,即一组数据要么同时成功,要么同时失败. 开启事物时,先进性虚拟存储,成功或回滚后,才能持久化操作.
    1.开启事物 begin / start Transaction
    2.操作
    3.提交事物 commit 或者 回滚事物 Rollback

    事物的四大特征:
    ACID
    1.原则性(Atomicity)事物要么同时成功,要么同时失败
    2.一致性 (Consistency)事物完成时,必须保持一致
    3.隔离性 (Isolation)多个事物之间,可以同时操作数据
    4.持久性 (Durability)事物一旦提交或回滚,数据库中的数据永久保存

    mysql事物是默认提交的
    select @@autocommit 查看事物的提交方式
    set @@autocommit = 0; 修改事物的提交方式

    新增语句

    INSERT INTO 表名(字段) VALUES (字段对应的值)
    INSERT INTO 表名 VALUES (字段对应的值)
    
    • 1
    • 2

    删除语句

    -- 删除单条数据
    DELETE FROM 表名 WHERE 字段 = 条件 ;
    -- 删除多条数据
    DELETE FROM 表名
    
    • 1
    • 2
    • 3
    • 4

    更新语句

    -- 更新一条数据
    UPDATE user  SET 字段 = 将要修改的值 WHERE 字段 = 修改的条件; 
    -- 更新全部数据
    UPDATE user  SET  字段 = 将要修改的值  更新表中的全部数据
    
    • 1
    • 2
    • 3
    • 4

    单表条件查询

    字段去除重复

    查看当前去除重复的字段
    SELECT DISTINCT 字段 FROM 表名;
    
    • 1
    • 2

    WHERE 条件判断

    SELECT * FROM 表名 WHERE 字段 <   >  =    <=   >=   !=
    • 1

    BETWEEN AND 在xx 与 xx之间

    当前字段的数据  值1 <= 字段数据 <=2
    SELECT * FROM 表名 WHERE 字段 BETWEEN1 AND2 
    
    • 1
    • 2

    Like 模糊查询

    Select * from emp where 字段 like 'M%';    M开头的
    案例
    Select * from 表名 where 字段 like '5%';       以为5开头的数据
    Select * from 表名 where 字段 like '%1';       结尾以1开始数据
    Select * from 表名 where 字段 like '%5%';      中间为5的数据
    Select * from 表名 where 字段 like '_5%';      任意数据开头+5的数据
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    in 多条件查询

    SELECT * FROM 表名 WHERE 字段 IN (1,值2...)
    
    • 1

    REGEXP 当前字段数据是否在指定范围

    SELECT * FROM 表名 WHERE 字段 REGEXP   '[a-e]';      字段包含a-e的全部数据
    SELECT * FROM 表名 WHERE 字段 REGEXP   '[^a-e]';     字段不包含a-e的全部数据
    
    • 1
    • 2

    OR 或者 AND 而且

    语法 
    select * from 表名 where 字段 (条件表达式=<>) 字段值  AND/or  字段 (条件表达式=<>-- 用法
    userid = 2 并且 username = b
    select * from user1 where userid = 2 AND username = 'b';
    userid = 2 或者 username = a
    select * from user1 where userid = 2 or username = 'a';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    LIMIT分页每页显示的数据

    select * from 表名 LIMIT 每页显示的数据;
    使用:
    查询10条数据,索引从09,第1条记录到第10条记录
    select * from 表名 LIMIT 10; 
    查询8条数据,索引从512,第6条记录到第13条记录
    select * from 表名 LIMIT 5,8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    表/字段起别名

    表起别名
    select a.字段,b.字段 from 表名 as a, 表名 as b where  xxxxxxxx;
    字段起别名
    SELECT 字段 AS 别名, 字段 AS 别名  FROM 表名;
    
    • 1
    • 2
    • 3
    • 4

    GROUP BY 分组函数

    SELECT * FROM 表名 GROUP BY 分组值;
    使用->根据名称分组,查询同组的相同记录数
    SELECT count(username),username '记录数' FROM user1 GROUP BY username;
    
    • 1
    • 2
    • 3

    order by 排序

    ASC 从小到大
    select * from 表名 order by 字段 ASC;
    DESC 从大到小
    select * from 表名 order by 字段 DESC;
    
    • 1
    • 2
    • 3
    • 4

    函数

    搭配group by进行查询

    select 函数 from 表名
    聚合函数 使用
    count -> 返回总记录数  count(*) 所有的记录数  count(字段) 当前字段的记录数 
    select count(*) from emp 
    max(列名)  -> 最大值 
    select max(salary) from emp 
    min(列名)  ->  最小值
    select min(salary) from emp 
    sum(求和)  ->  求和
    select sum(salary) from emp 
    avg(字段)
    SELECT avg(salary) FROM emp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建数据库/表

    创建数据库
    CREATE DATABASE   库名;
    
    
    删除数据库
    drop database  数据库名;
    
    选择数据库
    use 数据库名;
    
    新建数据表
    -- 员工表
    CREATE TABLE emp (
    id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
    ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
    joindate DATE NOT NULL , -- 入职日期,非空
    salary DOUBLE(7,2) NOT NULL , -- 工资,非空
    bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
    );
    
    删除数据表
    DROP table 表名;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    索引

    二叉树索引,将第一个值作为主节点,第二个值大于主节点放右边小于放左边 在这里插入图片描述
    优势:

    • 构建目录的过程,提高检索效率,降低数据库io成本
    • 通过索引列对目标进行跑徐,降低排序成本,降低cpu消耗
      劣势:
    • 索引也是占用空间的,相当于一张数据表,存储主键与索引字段的关系
    • 查询效率高,新增/更新/删除效率低了

    索引结构

    在这里插入图片描述

    索引的分类

    在这里插入图片描述

    建议:符合索引替代单值索引

    聚簇索引

    优点:不需要回表查询(表中只存储索引,查询到对应的索引后,根据索引查询数据库的数据表)
    缺点:依赖于有序的数据,如果是uuid那就很慢 /更新代价大,更新表也要更新索引
    在这里插入图片描述

    非聚簇索引

    优点:更新代价小
    缺点:回表查询
    在这里插入图片描述
    在这里插入图片描述

    覆盖索引

    需要查询的字段和查询的内容为索引–覆盖索引
    在这里插入图片描述

    在这里插入图片描述

    索引

    索引介绍

    介绍:
    mysql官方定义为:索引是帮助Msql高效获取数据的数据结构。
    Msql咋子存储数据的同时,数据库中还存在着满足特定查询算法的数据结构,这些数据结构以某种引用指向表中的数据,这样外面可以同各国数据结构上实现的高级查找算法快熟找到我们想要的数据,这种数据结构就是索引。

    举例:
    比如: 需要查询name字段的user数据,没有索引则会从第一条数据开始查询(全表扫描),如果给name创建索引,就会先找u这个单词,根据u去找s,根据s寻找e,根据e寻找r,从而提升查询效率

    索引数据结构

    1. 二叉树的索引模式

    将数据封装成一个二叉树的节点,向节点插入,满足左低右高的关系

    在这里插入图片描述

    索引的优势

    提高数据检索的效率,降低数据库的IO成本。
    通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗

    索引的劣势

    索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。

    索引的使用场景

    1.主键自动建立唯一索引
    2.频繁作为查询条件的字段应该创建索引(where 后面的语句)
    3.查询中与其它表关联的字段,外键关系建立索引
    4.多字段查询下倾向创建组合索引
    5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
    6.查询中统计或者分组字段

    不建议添加索引

    1. 表记录太少
    2. 经常增删改的表
    3. Where条件里用不到的字段不建立索引

    索引分类

    1. 主键索引 表中的列设定为主键后,数据库会自动建立主键索引
    2. 唯一索引 表中的列创建了唯一约束时,数据库会自动建立唯一索引。
    3. 单值索引 即一个索引只包含单个列,一个表可以有多个单值索引。
    4. 复合索引 即一个索引包含多个列
      在这里插入图片描述

    Explain:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MYSQL是如何处理SQL语句的。可以用来分析查询语句或是表的结构的性能瓶颈

    ID

    id相同时,执行顺序由上至下。
    id不同,如果是子查询,id的序号会递增,id值越大优先级越高,则先被执行。
    id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行,所有组中,id值越大,优先级越高越先执行。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    SELECT_TYPE

    system>const>eq_ref>ref>range>index>All

    查询的类型,常见值有:
    SIMPLE :简单的 select 查询,查询中不包含子查询或者UNION。
    PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为Primary。
    DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询, 把结果放在临时表里。

    在这里插入图片描述

    Const :

    在这里插入图片描述

    eq_ref 唯一性索引扫描

    在这里插入图片描述

    ref在这里插入图片描述

    Range

    在这里插入图片描述

    INdex

    在这里插入图片描述

    All

    将遍历全表以找到匹配的行

    possible_keys

    查询实际使用到的索引
    在这里插入图片描述

    ref

    显示索引的哪一列被使用了。哪些列或常量被用于查找索引列上的值。

    rows

    rows列显示MySQL认为它执行查询时必须检查的行数。一般越少越好。

    extra

    一些常见的重要的额外信息:
    Using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”。
    Using temporary:Mysql在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。
    Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。(查询的字段就是索引)
    Using where:表示使用了where过滤。(where查询)

    索引失效

    在这里插入图片描述
    在这里插入图片描述
    1)最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。
    2)不在索引列上做任何计算、函数操作,会导致索引失效而转向全表扫描。
    3)存储引擎不能使用索引中范围条件右边的列。
    4)Mysql在使用不等于时无法使用索引会导致全表扫描。
    5)is null可以使用索引,但是is not null无法使用索引。
    6)like以通配符开头会使索引失效导致全表扫描。
    7)字符串不加单引号索引会失效。
    在这里插入图片描述
    建议:1.对于单值索引,尽量选择针对当前查询字段过滤性更好的索引。2.对于组合索引,当前where查询中过滤性更好的字段在索引字段顺序中位置越靠前越好。3.对于组合索引,尽量选择能够包含在当前查询中where子句中更多字段的索引。4.尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

    排序/where使用索引

    1. 尽量避免使用Using FileSort方式排序。
    2. order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。
    3. where子句中如果出现索引范围查询会导致order by索引失效。

    在这里插入图片描述

    联表查询数据优化

    在这里插入图片描述

    慢查询日志,查询的时间超过设定的值时,该条数据内容会被记录到文件中

    存储引擎

    是数据库存储方式的一种形式。
    默认的存储引擎为InnoDB,默认的字符集为UTF-8

    常见的存储引擎

    MyISAM : 不支持事务
    在这里插入图片描述
    在这里插入图片描述InnoDB

    在这里插入图片描述
    在这里插入图片描述

    MEMORY

    缺点:不支持事物,断电后数据容易丢失

    在这里插入图片描述

    设计表

    一对一设计方案:主键共享 / 外键唯一
    在这里插入图片描述

    设计规范

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Joe主题魔改:正文内容实现图片懒加载
    k8s--基础架构--容器运行时接口 (CRI)和垃圾回收
    Grid布局介绍
    golang语言_2
    [Linux]进程信号
    关于安卓grovvy开发(一)bugly混淆自动上报
    十年磨一剑,剑指IT技术之巅,WOT 全球技术创新大会 2022盛大开启
    基于C语言的查找算法汇编
    提高工作效率的有效途径:五分钟快速学会搭建悟空CRM内网穿透
    【王道代码】【2.3链表】d3
  • 原文地址:https://blog.csdn.net/qq_48690030/article/details/127899709