• day49数据库 索引 事务


    一、索引

    1. 什么是索引:索引是数据库库中用来提高查询效率的技术,类似于目录

    2. 为什么要使用索引:如果不使用索引,数据会零散的保存在磁盘块中,查询数据需要遍历每一个磁盘块,直到找到数据为止,效率低下。使用索引以后会会将磁盘块以树状结构保存,查询数据的时候会大大的降低磁盘块的访问次数,从而提高查询效率

    3. 有索引就一定好吗?如果数据库表中的数据很少,使用索引反而会降低查询效率

    4. 索引是不是越多越好?不是,因为索引会占用磁盘空间,只针对查询时常用的字段创建索引。

    5. 导入数据 item2.sql

    6. 导入完成之后

      • show tables; 查看是否有item2这张表

      • select count(*) from item2; 172万8千多

      • 测试查询耗时

        select * from item2 where title='100';  //耗时0.622
        ​
        select count(*) from item2; //0.327
    7. 如何创建索引

      语法: create index  索引名  on  item(字段(字段长度))
      ​
      代码:create index index_item_title on item2(title);
      • 测试查询效率

        select * from item2 where title='100';  //耗时0.009
        ​
        select count(*) from item2; // 耗时0.399
    8. 查看索引

      语法:show index from 表名;
      代码:show index from item2; 
    9. 删除索引

      语法:drop index 索引名 表名;
      代码: drop index index_item_title  on item2;
    10. 索引的分类

      • 聚集索引:通过主键创建索引称之为聚集索引,聚集索引中保存数据,只要给表添加主键约束,则会自动的创建聚集索引

      • 非聚集索引:通过非主键字段创建的索引称之为非聚集索引,非聚集索引中没有数据

    11. 复合索引

      • 通过多个字段创建的索引称之为符合索引

        语法: create index 索引名 on 表名(字段1,字段2);
        代码:create index index_item_price_title on item2(title,price);
      索引总结
      1. 索引是用来提高查询效率的技术,类似目录

      2. 因为索引会占用磁盘空间,所以不是越多越好

      3. 因为数据量小的时候使用索引会降低查询效率所以不是有索引就一定好

      4. 分类:聚集索引,非聚集索引

      5. 通过多个字段创建的索引称之为符合索引

      二、事务

      1. 什么是事务:数据库中执行同一业务需要多条SQL语句指定的工作单元,可以保证全部执行成功或者全部失败

      2. 事务的ACID特性(一原持久隔离))

        • Atomicty : 原子性: 最小不可拆分,保证全部成功或者全部失败

        • Consistency: 一致性,保证事务从一个一致状态到另一个一致状态

        • Isolation:隔离性 ,多个事务之间互不影响

        • Durablity:持久性,事务提交之后数据保存到数据库文件中永久生效

      3. 事务相关的SQL

        • 开启事务:begin

        • 回滚事务:rollback;

        • 提交事务: commit

        • 设置回滚点:savepoint s1;

        • 回滚到回滚点 :rollback to s1;

        • 查看自动提交状态: show variables like '%autocommit%'

        • 修改自动提交状态 : set autocommit=on/off

      三、group_concat()函数

      1. 查询每一个部门所有员工的姓名和工资

        SELECT
            deptno,group_concat(ename,':',sal)
        FROM
            emp
        GROUP BY
            deptno
        ​
      2. 查询每个部门的员工姓名,要求每个部门只能显示一行

        SELECT
            deptno,group_concat(ename)
        FROM
            emp
        GROUP BY
            deptno

      四、笔试题

      1. 创建学生成绩表 student(id主键,name姓名,subject学科,score成绩)

        create table student(
            id int primary key auto_increment,
            name varchar(50),
            subject varchar(50),
            core int
        );

      2. 保存以下数据

        张三 语文 66
        张三 数学 77
        张三 英语 55
        张三 体育 77
        ​
        李四 语文 59
        李四 数学 88
        李四 英语 78
        李四 体育 95
        ​
        王五 语文 75
        王五 数学 98
        王五 英语 54
        王五 体育 88
        ​
        insert into student values
        (null,'张三', '语文',66),
        (null,'张三', '数学', 77),
        (null,'张三', '英语' ,55),
        (null,'张三', '体育', 77),
        (null,'李四', '语文', 59),
        (null,'李四', '数学', 88),
        (null,'李四', '英语', 78),
        (null,'李四', '体育' ,95),
        (null,'王五', '语文', 75),
        (null,'王五', '数学', 98),
        (null,'王五', '英语', 54),
        (null,'王五', '体育', 88);
      3. 查询每个人的平均分,从大到小排序

        SELECT
            name,avg(core) a
        FROM
            student
        GROUP BY 
            name
        ORDER BY
            a desc;

      4. 查询每个人的名字,科目和成绩一行显示出来

        SELECT
            name,group_concat(subject,':',core)
        FROM
            student
        GROUP BY
            name

      5. 查询每个人的最高分和最低分

        SELECT
            name,max(core),min(core)
        FROM
            student
        GROUP BY
            name

      6. 查询每个人的名字,不及格的科目以及分数,不及格的科目数量一行显示

        SELECT 
            name,group_concat(subject,':' ,core),count(*)
        FROM
            student
        WHERE
            core<60
        GROUP BY
            name
      7. 行专列计算每门课的总成绩( sum(if()) )

        SELECT
            ifnull(name,'总成绩') as name,
            sum(if(subject='语文',core,0)) as 语文,
            sum(if(subject='数学',core,0)) as 数学,
            sum(if(subject='英语',core,0)) as 英语,
            sum(if(subject='体育',core,0)) as 体育
        FROM
            student
        GROUP BY 
            name with rollup;

        查询结果

  • 相关阅读:
    LCR 072. x 的平方根
    python--类与面向对象-3
    LeetCode(力扣)435. 无重叠区间Python
    LeetCode 第394场周赛个人题解
    2022中国机器人产业报告发布 企业如何应对新阶段下的增长与竞争?
    【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣
    【计算机网络】https协议
    【产品安全平台】上海道宁与Cybellum将整个产品安全工作流程整合到一个专用平台中,保持构建的互联产品的网络安全和网络合规性
    Day10:图形用户界面和游戏开发
    web网页设计期末课程大作业——汉中印象旅游景点介绍网页设计与实现19页面HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/weixin_45939821/article/details/133364163