• 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;

        查询结果

  • 相关阅读:
    [附源码]SSM计算机毕业设计视屏网站论文JAVA
    汽车MCU虚拟化--对中断虚拟化的思考(1)
    vue3学习源码笔记(小白入门系列)------provide和 inject 跨层级数据传递原理
    Android 11.0 os定制专栏系列解读
    java八股文面试[数据库]——explain
    nginx的location指令(实战示例、匹配顺序、匹配冲突)
    【教3妹学算法-每日3题(3)】最低加油次数
    少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(选择题)2022年9月
    [论文评析]Continuous weight balancing, ICLR,2021
    JavaScript 数值 Number
  • 原文地址:https://blog.csdn.net/weixin_45939821/article/details/133364163