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);
      day49数据库 索引 事务_第1张图片
    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;

      查询结果

      day49数据库 索引 事务_第2张图片

你可能感兴趣的:(数据库,oracle,sql)