MySQL之视图&索引&笔试案例

本文详细介绍了MySQL中的视图和索引的概念、创建与操作,包括优点、缺点以及何时使用和不使用索引。并通过实际的表结构和笔试案例,展示了如何在查询优化中合理利用索引提升性能。
摘要由CSDN通过智能技术生成

1、视图

1.1含义

虚拟表,和普通表一样使用

1.2操作

1.创建视图:
create view 视图名
as
查询语句
2.视图的修改:
方式1:
create or replace view 视图名
as
查询语句
方式2:
alter view 视图名
as
查询语句
3.删除视图:
drop view 视图名,视图名,…;
4.查看视图:
DESC 视图名----查看视图相关字段
SHOW CREATE VIEW 视图名----查看视图相关语句

2、索引

1、什么是索引

索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录.

2、为什么要使用索引

使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能

3、优点

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
  • 可以给所有的 MySQL列类型设置索引。
  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。
  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

4、缺点

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

5、何时不使用索引

  • 表记录太少
  • 经常增删改的表
  • 数据重复且分布均匀的表字段,只应该为经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
  • 频繁更新的字段不适合创建索引(会增加IO负担)
  • where条件里用不到的字段不创建索引

6、索引何时失效

  • like以通配符%开头索引失效
  • 当全表扫描比走索引查询的快的时候,会使用全表扫描,而不走索引字符串不加单引号索引会失效
  • where中索引列使用了函数(例如substring字符串截取函数) - where中索引列有运算(用了< or > 右边的索引会失效,用<= or >= 索引不会失效)
  • is null可以走索引,is not null无法使用索引(取决于某一列的具体情况)
  • 复合索引没有用到左列字段(最左前缀法则,如果没用用到最左列索引,或中间跳过了某列有索引的列,索引会部分失效)
  • 条件中有or,前面的列有索引,后面的列没有,索引会失效。想让索引生效,只能将or条件中的每个列都加上索引

7、索引分类

CREATE TABLEt Iog(
“id’varchar(32)NOT NULL COMMENT唯一标识
ip’varchar(15)NOT NULL COMMENTIP地址址
userid’varchar(32)NOT NULL COMMENT用户ID’
moduleid’varchar(32) NOT NULL COMMENT模块ID’
*content varchar(500) NOT NULLCOMMENT日志内容createdate’timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT创建日期urTvarchar(100)DEFAULT NULL COMMENT请求URL地址PRIMARY KEY (id)
ENGINE=InnoDB DEFAULT CHARSET=utf8.

  • 1)普通索引:是最基本的索引,它没有任何限制;
    0.762s
    select* from t log:
  • 建索引前 0.12s
    select* from t log where moduleid =10040199’
  • 创建索引所花费的时间:1.593s
    Create index idx moduleid on t log(moduleid):
  • 建索引前 0.001s
    select * from t log where moduleid =10040199
  • 可以查看走过的索引
    EXPLAIN select *from t log where moduleid =10040199’:
  • 2)唯一索引:与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一:
  • Duplicate entry/quartz/queryJobLst for key idx ur’ 有重复列段create UNIQUE index idx url on t log(url);
    drop index idx url on t log:
  • 3)主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;-主键索引所花费的时间: 0s
    selectfrom t log where id =07489cdafd6d4a3489884cd3c00c7b27’
    EXPLAIN select
    from t log where id =07489cdafd6d4a3489884cd3c00c7b27
  • 4)组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时进循最左前缀集合:花费的时间:3.959s
    create index idx userid moduleid url on t log(userid.moduleid,url):走组合索引
    XPLAIN select * from t log where userid = " and moduleid = " and url = “.
    XPLAIN select * from t log where userid = " and moduleid = “.
    EXPLAIN select * from t log where userid =” .
    EXPLAIN select * from t log where userid = " and url =”
    不走组合索引
    EXPLAIN select *from t log where moduleid = ".
    EXPLAIN select * from t log where url = ";
    EXPLAIN select * from t log where moduleid = " and url = "
  • 4.创建索引
  • CREATE[UNIQUE]FULLTEXTIINDEX 索引名 ON 表名(字段名[(长度][ASCIDESCJ)

3、笔试案例

1、表结构

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : localhost:3306
 Source Schema         : mybatis_ssm

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 04/07/2023 23:53:33
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_mysql_course
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_course`;
CREATE TABLE `t_mysql_course`  (
  `cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号',
  `cname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称',
  `tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',
  PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '课程信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_course
-- ----------------------------
INSERT INTO `t_mysql_course` VALUES ('01', '语文', '02');
INSERT INTO `t_mysql_course` VALUES ('02', '数学', '01');
INSERT INTO `t_mysql_course` VALUES ('03', '英语', '03');

-- ----------------------------
-- Table structure for t_mysql_score
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_score`;
CREATE TABLE `t_mysql_score`  (
  `sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号,外键',
  `cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号,外键',
  `score` float NULL DEFAULT 0 COMMENT '成绩',
  INDEX `sid`(`sid`) USING BTREE,
  INDEX `cid`(`cid`) USING BTREE,
  CONSTRAINT `t_mysql_score_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `t_mysql_student` (`sid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `t_mysql_score_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `t_mysql_course` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '成绩信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_score
-- ----------------------------
INSERT INTO `t_mysql_score` VALUES ('01', '01', 80);
INSERT INTO `t_mysql_score` VALUES ('01', '02', 90);
INSERT INTO `t_mysql_score` VALUES ('01', '03', 99);
INSERT INTO `t_mysql_score` VALUES ('02', '01', 70);
INSERT INTO `t_mysql_score` VALUES ('02', '02', 60);
INSERT INTO `t_mysql_score` VALUES ('02', '03', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '01', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '02', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '03', 80);
INSERT INTO `t_mysql_score` VALUES ('04', '01', 50);
INSERT INTO `t_mysql_score` VALUES ('04', '02', 30);
INSERT INTO `t_mysql_score` VALUES ('04', '03', 20);
INSERT INTO `t_mysql_score` VALUES ('05', '01', 76);
INSERT INTO `t_mysql_score` VALUES ('05', '02', 87);
INSERT INTO `t_mysql_score` VALUES ('06', '01', 31);
INSERT INTO `t_mysql_score` VALUES ('06', '03', 34);
INSERT INTO `t_mysql_score` VALUES ('07', '02', 89);
INSERT INTO `t_mysql_score` VALUES ('07', '03', 98);

-- ----------------------------
-- Table structure for t_mysql_student
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_student`;
CREATE TABLE `t_mysql_student`  (
  `sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号',
  `sname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生名称',
  `sage` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生年龄',
  `ssex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生性别',
  PRIMARY KEY (`sid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_student
-- ----------------------------
INSERT INTO `t_mysql_student` VALUES ('01', '赵雷', '1990-01-01', '男');
INSERT INTO `t_mysql_student` VALUES ('02', '钱电', '1990-12-21', '男');
INSERT INTO `t_mysql_student` VALUES ('03', '孙风', '1990-12-20', '男');
INSERT INTO `t_mysql_student` VALUES ('04', '李云', '1990-12-06', '男');
INSERT INTO `t_mysql_student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `t_mysql_student` VALUES ('06', '吴兰', '1992-01-01', '女');
INSERT INTO `t_mysql_student` VALUES ('07', '郑竹', '1989-01-01', '女');
INSERT INTO `t_mysql_student` VALUES ('09', '张三', '2017-12-20', '女');
INSERT INTO `t_mysql_student` VALUES ('10', '李四', '2017-12-25', '女');
INSERT INTO `t_mysql_student` VALUES ('11', '李四', '2012-06-06', '女');
INSERT INTO `t_mysql_student` VALUES ('12', '赵六', '2013-06-13', '女');
INSERT INTO `t_mysql_student` VALUES ('13', '孙七', '2014-06-01', '女');

-- ----------------------------
-- Table structure for t_mysql_teacher
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_teacher`;
CREATE TABLE `t_mysql_teacher`  (
  `tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',
  `tname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师名称',
  PRIMARY KEY (`tid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '教师信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_teacher
-- ----------------------------
INSERT INTO `t_mysql_teacher` VALUES ('01', '张三');
INSERT INTO `t_mysql_teacher` VALUES ('02', '李四');
INSERT INTO `t_mysql_teacher` VALUES ('03', '王五');

SET FOREIGN_KEY_CHECKS = 1;

2、题目

  • 01)查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数
select
   s.*,
   (case when t1.cid='01' then t1.score end) 语文,
   (case when t2.cid='02' then t2.score end) 数学
from
t_mysql_student s,
(select * from t_mysql_score where cid='01' ) t1,
(select * from t_mysql_score where cid='02' ) t2
where s.sid=t1.sid and t1.sid=t2.sid and t1.score>t2.score;
  • 02)查询同时存在" 01 “课程和” 02 "课程的情况
 select
    s.*,
    (case when t1.cid='01' then t1.score end) 语文,
    (case when t2.cid='02' then t2.score end) 数学
from
t_mysql_student s,
(select * from t_mysql_score where cid='01') t1,
(select * from t_mysql_score where cid='02') t2
where s.sid=t1.sid and t1.sid=t2.sid;
  • 03)查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
select
    s.*,
    (case when t1.cid='01' then t1.score end) 语文,
    (case when t2.cid='02' then t2.score end) 数学
from
     t_mysql_student s
inner join
    (select * from t_mysql_score where cid='01') t1
on s.sid =t1.sid
left join
    (select * from t_mysql_score where cid='02') t2
on t1.sid=t2.sid;
  • 04)查询不存在" 01 “课程但存在” 02 "课程的情况
 select
    s.*,
    (case when sc.cid='01' then sc.score end) 语文,
    (case when sc.cid='02' then sc.score end) 数学
from
  t_mysql_student s,
  t_mysql_score sc
where
  s.sid=sc.sid
  and
  s.sid not in
  (select sid from t_mysql_score where cid='01')
and sc.cid='02';
  • 05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select
    s.sid,
    s.sname,
    round(avg(sc.score),2) 平均分数
from
    t_mysql_student s left join
    t_mysql_score sc on s.sid=sc.sid
group by s.sid,s.sname
having 平均分数 >=60;
  • 06)查询在t_mysql_score表存在成绩的学生信息
select
    s.sid,
    s.sname 学生姓名
from
    t_mysql_student s inner join
    t_mysql_score sc on s.sid=sc.sid
group by s.sid,s.sname;```
  • 07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null
select
    s.sid,
    s.sname 学生姓名,
    count(sc.score) 选课总数,
    sum(sc.score) 总成绩
from
    t_mysql_student s left join
    t_mysql_score sc on s.sid=sc.sid
group by s.sid,s.sname;
  • 08)查询「李」姓老师的数量
select count(tname) 姓李老师数量 from t_mysql_teacher where tname like '李%';

4、思维导图

在这里插入图片描述

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值