数据库视图和索引

参考链接:

数据库的视图和索引的概念和区别_索引和视图的区别-CSDN博客

MySQL 数据库--索引(理论详解及实例演示)_数据库索引-CSDN博客

1.视图

视图是从一个或多个表中导出来的表,是一种不是一种真正存在的概念。这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。

视图是基于 SQL 语句的结果集的可视化表现。它是一个虚拟表,其内容由查询定义。视图可以包含来自一个或多个表的列,甚至可以包含常量和计算字段。

1.1创建视图

语法

sql 复制代码
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

举例

单个表

假设你有一个名为 employees 的表,包含 employee_id, name, department, 和 salary 列。你想要创建一个视图,只显示每个部门的平均工资:

sql 复制代码
CREATE VIEW department_average_salary AS
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

多个表

假设我们有两个表:employeesdepartmentsemployees 表包含员工的详细信息,而 departments 表包含部门的信息。现在,我们想要创建一个视图,该视图显示每个员工的姓名、所在部门的名称以及部门的预算。

首先,这里是两个表的示例结构:

employees 表:

  • employee_id (员工ID)
  • name (姓名)
  • department_id (部门ID)
  • position (职位)

departments 表:

  • department_id (部门ID)
  • department_name (部门名称)
  • budget (预算)

我们想要创建一个视图,这个视图将包含员工的姓名、所在部门的名称以及部门的预算。以下是创建这个视图的 SQL 语句:

sql 复制代码
CREATE VIEW employee_departments AS
SELECT e.name AS employee_name, d.department_name, d.budget
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

总结

就是 create view 视图名 as 后面就是正常的sql语句。

1.2 修改视图

sql 复制代码
ALTER VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

1.3 删除视图

sql 复制代码
DROP VIEW view_name;

1.4 视图特点

  • 视图不存储数据,它们是动态生成的,每次查询视图时都会执行定义视图的 SQL 语句。
  • 可以有权限控制,允许用户访问视图而不必直接访问底层表。【增加安全性】
  • 可以用于实现复杂的查询逻辑,如连接(JOIN)多个表。

1.5用途

  • 提供数据的逻辑表示,简化复杂的 SQL 操作。
  • 限制用户访问特定数据,增强数据的安全性。
  • 作为数据的抽象层,使得应用程序不必关心底层数据结构的变化。

2.索引

索引,可以理解为是一本书的目录,它记录了数据在数据库中存放的位置,就像一本书的目录,记录了,某一页在这本书的那个位置。相同地, 索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。

MySQL中索引的存储类型有两种:BTREE(树)和 HASH(哈希),具体和表的存储引擎有关。MyISAM和InnoDB存储引擎只支持BTREE索引。

重新举一个例子:

想象一下,你有一书架的书,每本书都有一个独特的标题,你可以很容易地通过书名找到任何一本书。但是,如果你想要找到所有关于特定主题的书,比如"烹饪",你可能需要一本索引书,它列出了关于烹饪的所有书籍的标题和它们在书架上的位置。这样,你就不用一本一本地检查每一本书的封面了,你可以直接去索引书中标记的位置找到所有烹饪书籍。

在数据库中,索引的作用类似。数据库中的数据就像是你书架上的书籍,而索引就是那本帮助你快速找到特定信息的索引书。

  1. 加快搜索速度:就像索引书让你快速找到烹饪书籍一样,数据库索引可以让你快速检索到特定的数据记录,而不需要扫描整个数据库。

  2. 组织数据:索引可以帮助数据库以特定的顺序存储和检索数据,比如按照日期或字母顺序。

  3. 提高效率:当你需要执行搜索、排序或分组等操作时,索引可以显著提高这些操作的效率

创建索引就像是在数据库中创建了一个快速通道,它允许数据库管理系统(DBMS)更快地找到数据,而不必检查数据库中的每一条记录。但是,就像索引书需要占用额外的空间一样,数据库索引也会占用额外的存储空间,并且在数据更新时(如插入、删除或修改记录)需要维护索引,这可能会稍微减慢这些操作的速度。

2.1 索引的分类

2.1.1 普通索引

  • 这是最基本的索引类型
  • 而且它没有唯一性之类的限制

2.1.2唯一性索引

  • 与普通索引类似,区别是唯一索引列的所有值都只能出现一次,即必须唯一
  • 当现有数据库中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存
  • 数据库还可能防止添加将在表中创建重复键值的新数据
  • 例如,如果在员工信息统计表中对员工的姓(name)上创建了唯一索引,则任何两个员工都不能同姓

2.1.2 主键索引

  • 主键是一种唯一性索引,但它必须指定为"PRIMARY KEY"
  • 在数据库中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型
  • 该索引要求主键中每个值都唯

2.1.3 全文索引

  • 索引类型为 FULLTEXT
  • 适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息
  • 全文索引可以在 CHAR、VARCHAR 或 TEXT 类型的列上创建
  • 每个表只允许有一个全文索引
  • 主要用于搜索大型文本或者二进制列中的关键词

2.1.4 组合索引(单列索引与多列索引)

  • 索引可以是单列上创建的索引,也可以是在多列上创建的索引
  • 多列索引可以区分其中一列可能有相同值的行
  • 如果经常同时搜索两列、多列、按两列或多列排序时,索引也很有帮助
  • 例如,如果经常在同一查询中为姓和名两列设置查询条件,那么这两列上创建多列索引将很有意义

2.2 索引的创建

2.2.1 普通索引的创建

sql 复制代码
CREATE INDEX 索引名 ON 表名 (列名[(length)]);

#(列名(length)):length是可选项,下同
#如果忽略 length 的值,则使用整个列的值作为索引
#如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小
#索引名建议以"_index"结尾


例:
create index phone_index on member (phone);
#直接创建索引

select phone from member

2.2.2 唯一索引的创建

sql 复制代码
CREATE UNIQUE INDEX 索引名 ON 表名(列名);


例:
create unique index address_index on member (address);
#注意,创建唯一索引必须得满足每个值都是唯一的,否则无法创建

show create table member;

2.2.3 创建主键索引

sql 复制代码
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));


例:
create table test1 (id int primary key,name varchar(20));
#这里用了两种方式创建,一种是在字段中直接指定,第二种是在字段结束后指定
create table test2 (id int,name varchar(20),primary key (id));

show create table test1;
show create table test2;

2.2.4 全文索引

sql 复制代码
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);


例:
create fulltext index remark_index on member (remark);
#全文索引 fulltext,全文只可在 char、varchar、text 类型上创建,且每个表只允许有一个
show create table member;

2.2.5 组合索引

sql 复制代码
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';


例:
create table test001 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));

show create table test001;

insert into test001 values(1,'wangsansan','123123');

select * from test001 where name='wangsansan' and id=1;

3.索引和视图的区别

  • 存储方式:视图不存储数据,而索引是物理存储的数据结构。
  • 目的:视图用于提供数据的逻辑表示和简化查询,索引用于提高数据检索效率。
  • 使用场景:视图常用于数据安全和简化复杂查询,索引用于优化查询性能。
  • 性能影响:索引可以提高查询速度,但可能会降低数据修改的速度;视图对性能的影响主要取决于其定义的复杂性。
  • 数据更新:视图不直接存储数据,所以对视图的更新可能会转化为对底层表的更新;索引是静态的,不会因数据更新而改变,除非索引被显式更新或重建。

还没有更完,后续后继续更新的~~~~~~

相关推荐
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)4 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231114 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白4 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码4 小时前
【SQL实验】触发器
数据库·笔记·sql