MySQL高级

时间:2019-10-09 09:19:07   收藏:0   阅读:134

case when end

索引

索引的作用

加快查询速度

索引的概念

1. 索引是一种特殊的数据
2. 索引类似书上的目录,保存的是实际数据的位置,每次查找数据时数据库先查找索引,通过索引找到对应数据的位置。

索引的优缺点

优点:
加快查询速度
缺点:
降低增删改速度,因为需要同时更新索引
需要占用更多存储空间
创建索引需要比较多时间

索引的分类

普通索引

对数据没有特殊的约束

全文索引

主要用于大文本类型(Text)

  1. 使用模糊查询,like ‘%张%‘ 失效,like ‘张%‘ 不失效
  2. 使用空值判断的查询,is null或is not null
  3. 使用or进行查询,除非or中的每一列上都创建索引
  4. 使用函数作为条件
    比如: where year(product_date) = 2019;

    索引的结构

    结构分类

技术图片

B+Tree 是BTree升级版

B+Tree 是BTree升级版,在根节点和枝节点中不存放数据,只存放键和指针,这样每一层保存节点可以更多,树的高度就降低,查找速度更快,数据只放在叶子节点中。

技术图片

视图

是一种虚拟的表,数据保存在实际的表中

作用:

1)简化查询的过程
2)提高数据库安全性,设置权限,给不同用户看不同的数据

语法:

创建:
create view 视图名 as 查询语句;
使用:
select * from 视图;

存储过程

类似于Java中的方法,可以用于封装SQL代码,便于重复调用。

技术图片

优点:

1. 已经保存在数据库中,服务器不需要发送SQL语句,只需要发送调用命令
2. 不发送SQL语句,降低了网络中对SQL语句进行截获或修改的安全问题
3. 存储过程是编译好的,不需要再编译,速度快

缺点:

保存在数据库中,增加了维护的难度

定义语法:

delimiter //
create procedure 存储过程名( [in|out|inout]参数名 类型 )
begin
    SQL语句;
end//
delimiter ;

调用语法:

call 存储过程名(参数);

数据库设计

ER图

实体关系图(Entity Relationship)
用图形方式标识数据库存在的实体,实体的属性,实体和实体之间的关系
由四种图形组成:
1. 长方形 表示实体
2. 椭圆形 表示属性
3. 连接线
4. 菱形 表示关系

技术图片

范式

用于规范化数据库的设计,减少数据库的冗余

三大范式

行转列

  1. 连接查询
    -- 对表进行连接查询
    select s.id 学号,s.name 姓名,c.name 课程,cs.score 分数
    from tb_stu s left join tb_score cs on s.id = cs.stu_id
    left join tb_course c on c.id = cs.course_id;
  2. case - end语句
    类似Java中的多重if和switch结构
    case
    when 条件1 then 结果1
    when 条件2 then 结果1
    else 缺省值
    end
    或者
    case 列名
    when 值1 then 结果1
    when 值2 then 结果2
    else 缺省值
    end

    用于添加数学、语文、英语列
    对课程名称进行判断,如果为数学,就返回数学成绩,否则显示0
    select s.id 学号,s.name 姓名,
    case c.name
    when ‘数学‘ then cs.score
    else 0
    end 数学,
    case c.name
    when ‘语文‘ then cs.score
    else 0
    end 语文,
    case c.name
    when ‘英语‘ then cs.score
    else 0
    end 英语
    from tb_stu s left join tb_score cs on s.id = cs.stu_id
    left join tb_course c on c.id = cs.course_id;
  3. 使用group by对学号进行分组
  4. 使用max函数取分数最大值
    select s.id 学号,s.name 姓名,
    max(case c.name
    when ‘数学‘ then cs.score
    else 0
    end) 数学,
    max(case c.name
    when ‘语文‘ then cs.score
    else 0
    end) 语文,
    max(case c.name
    when ‘英语‘ then cs.score
    else 0
    end) 英语
    from tb_stu s left join tb_score cs on s.id = cs.stu_id
    left join tb_course c on c.id = cs.course_id group by s.id;

作业:

创建部门表(编号、名称、职能描述)、费用类型表(编号,类型名称)、费用统计表(编号,部门编号,费用类型编号,费用金额)
插入测试数据
1)使用行转列实现财务报表,格式如下:

技术图片

2)使用视图
    1)包装该部门的财务报表
    2)基于上面的学生表、课程表、成绩表,编写班主任视图(查询学生编号、姓名、性      别、年龄、考试课程和成绩等级优良中差),编写教务视图(查询学生编号,课程)
3)编写几个存储过程分别实现:
    1)通过部门名称查询该部门信息
    2)插入部门
    3)通过编号删除部门
    4)通过编号修改部门名称和职能描述
    5)通过部门编号查询该部门的总费用,并使用out参数返回费用
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!