数据库视图与索引经典题

news2024/11/20 1:47:41

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 视图与索引
  • 视图:
    • 定义视图
    • 创建视图
    • 删除视图
    • 查询视图
    • 视图的作用
  • 索引
    • 索引的概念
    • 索引的类型
    • 设计索引


视图与索引

视图:

视图是从一个或几个基本表(或视图)导出的表。
它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图只供查询,数据不可更改

【例】以student表为例写出计算机系的所有学生
在这里插入图片描述

 CREATE VIEW StudentView1
  AS
  SELECT * 
  FROM student
  WHERE sdept='计算机系'

对于一个学校,其学生的情况存于数据库的一个或多个表中,而作为学校的不同职能部门教务部和后勤管理部门,它所关心的学生数据的内容是不同的,

如:教务部关心学生的成绩信息,后勤管理部门重点关心学生的住宿信息,而且不允许其查看成绩信息。

问题:
针对这种需求,如何设计数据库以便用户很方便的查看所需的数据呢?

设计思路
根据不同用户的不同需求,在物理的数据库上定义他们对数据库所要求的数据结构,这种根据用户观点定义的数据结构就是视图。

用户只能对他所见到的视图进行操作,不仅可以查看其感兴趣的数据,而且可以屏蔽对其保密的数据。

定义视图

用CREATE TABEL语句创建的表叫基本表(Base Table)。

视图(View)是从一个或多个基本表或视图中导出的表,视图的结构和数据都是建立在对基本表的查询基础上的。

视图不是真实存在的表,而是一个虚拟表,数据库中只存储视图的定义,而没有存储视图对应的数据,视图中的数据是从基本表中选取出来的,这些数据并不实际的按视图结构存储在数据库中,而是存储在原来的基本表中。

创建视图

创建视图的SQL语句一般格式为:

 CREATE VIEW <视图名> [(视图列名表)]
    AS
           SELECT 查询子句
     [ WITH CHECK OPTION ]

创建视图注意事项

(1)视图名必须遵循标识符命名规则,且对每类用户视图名必须是唯一的,即对不同用户定义相同的视图,也必须使用不同的名字。

(2) SELECT查询子句的查询内容就是视图的内容。SELECT语句通常不允许含有ORDER BY子句和DISTINCT子句。

SELECT语句中查询的表和视图即新创建的视图所参照的表和视图。

(3)视图列名列表是视图中所包含的列。若使用与基本表中相同的列名,则可以省略。若指定列名列表,则需全部指定,不能只给出一部分。以下情况要求必须指定视图的全部列名:

①由算术表达式、系统内置函数或者常量得到的列;

②多表连接查询时选出的同名列;

③希望视图中的列名与基表中的列名不同的时候。

(4)WITH CHECK OPTION子句表示在视图上执行UPDATE,INSERT或DELETE操作时要保证所修改的行满足视图定义中的谓词条件(即SELECT查询子句中的限定条件,如Where条件),这样可以确保数据修改后,仍可通过视图看到修改的数据。

创建单源表视图
如果一个视图从单个基本表导出的,并且保留了码,这种视图称为单源表视图(行列子集视图)。

【例】创建价格高于30元的图书视图BookView1。

  CREATE VIEW BookView1
  AS
  SELECT *
  FROM Book
  WHERE price>30

【例】创建价格高于30元的图书视图BookView2。并要保证对该视图的修改都要符合价格高于30元这个条件。

  CREATE VIEW BookView2
  AS
  SELECT book_id,name,author,publish,price 
  FROM Book
  WHERE price>30
        WITH CHECK OPTION 

创建多源表视图
多源表视图是指创建视图时的子查询中用了多个源表。

多源表视图一般只用于查询,不用于修改数据。

【例】创建R_B_Book视图,查询所有读者借阅图书的读者编号、姓名、图书编号、书名、出版社、价格、借阅日期信息。

CREATE VIEW  R_B_Book (读者编号,姓名,图书编号,
书名,出版社,价格,借阅日期信息)
 AS 
   SELECT R.reader_id, R.name, B.book_id, 
   B.name, publish, price, borrowdate
   FROM Reader as R JOIN Borrow as W
   ON R.reader_id = W.reader_id  JOIN Book as B
                     ON B.book_id=W.book_id 

创建基于视图的视图
视图可以建立在其它已经创建好的视图上,即创建基于视图的视图。

【例】基于上例中的视图RB_Book,创建”张三”的读者借阅的图书书名和出版社信息和借阅日期的视图Borrow

CREATE VIEW Borrow
AS
   SELECT 书名, 出版社, 借阅日期 FROM RB_Book
   WHERE姓名 ='张三'

创建带表达式的视图
在定义视图时可以根据实际需要设置一些派生属性列,在这些派生属性列中保存经过计算的值。称它们为虚拟列。带虚拟列的视图也称带表达式的视图。

【例】创建读者信息的视图ReaderInfo,包括读者编号、姓名和年龄,在视图中的列名分别为ID,Name和Age。

CREATE VIEW ReaderInfo (ID, Name, Age)
AS
  SELECT reader_id,name,YEAR(GETDATE()) -YEAR(birthdate) 
  FROM Reader

创建含统计信息的视图
还可以用带有集合函数和GROUP BY子句的查询来创建视图,这种视图称为分组视图。

【例】创建每个出版社出版图书的平均价格的视图PerPublish_AVG。

CREATE VIEW PerPublish_AVG(Publish,AVG_Price)
AS
  SELECT publish, AVG(price) 
  FROM Book
  GROUP BY publish

删除视图

删除视图的SQL语句的格式为:

DROP VIEW <视图名>
删除视图时注意:按照参照的逆序删除

【例】删除图书视图BookView

 DROP VIEW BookView

查询视图

视图是一张虚表,可以同基本表一样进行查询,但需要注意查询视图时应使用视图定义时的列名。

【例】基于视图RB_Book查询借阅《数据库原理》一书的读者ID和name

SELECT 读者ID,name FROM RB_Book
WHERE 书名='数据库原理'

【例】基于视图ReaderInfo查询年龄高于20岁的读者ID和name

SELECT id,name FROM ReaderInfo WHERE AGE>=20 

视图的作用

1、视图能够简化用户的操作

2、视图使用户能以多种角度看待同一数据。

3、视图对重构数据库提供了一定程度的逻辑独立性。

4、视图能够对机密数据提供安全保护。

5、适当的利用视图可以更清晰的表达查询。

索引

没有索引:逐行扫描(顺序查找)

有索引:快速定位数据行(索引查找)

索引的概念

索引实质上是一个单独的、物理的数据库结构,它是表中一个或多个列(称为搜索关键字)的值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
在这里插入图片描述

索引的类型

根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型。

一种是数据表的物理顺序与索引顺序相同的索引,称为聚集索引;

另一种是数据表的物理顺序与索引顺序不相同的索引,称为非聚集索引;

聚集索引在使用中具有如下特点:
(1)、每一个表只能有一个聚集索引;

(2)、在创建任何非聚集索引前创建聚集索引;

(3)、聚集索引的平均大小大约是数据表的百分之五。

每一个表只能有一个聚集索引,因为表中数据的物理顺序只有一个;

聚集索引的平均大小大约是数据表的百分之五,但是,实际聚集索引的大小常常根据索引列的大小变化而变化。

这大大减少了磁盘读写的次数。

非聚集索引在使用中具有如下特点:
(1)、非聚集索引具有与表的数据完全分离的结构。

(2)、非聚集索引表示行的逻辑顺序。

(3)、在非聚集索引中,数据存放在一个地方,索引存放在另一个地方,并用指针指出数据的存储位置。索引中项目是按照关键值的顺序存放,但是表中的数据则是按照不同的顺序存放。

缺省情况下创建的索引是非聚集索引。

索引的优缺点
索引的主要优点如下:

①可以大大加快数据的检索速度。

②通过创建唯一性索引,可以确保表中每一行数据的唯一性。

③可以加速表与表之间的连接,特别有利于实现数据的参照完整性。

④在使用分组子句和排序子句进行数据检索时,可以显著提高查询中分组和排序的效率。

可以大大加快数据的检索速度,这也是创建索引的最主要原因

索引的主要缺点如下:

①创建索引要耗费时间。

②索引要占据数据库的物理空间。

③维护索引要花费很多的时间。

创建索引和维护索引要耗费时间,而且这种时间会随着数据量的增加而增加。

索引要占据数据库的物理空间,索引越多,占据的空间越多。

维护索引要花费很多的时间,尤其是在增加、删除和修改表中数据的时候。

设计索引

对于以下这些列不适合创建索引:

①对于那些在查询中很少使用或很少参考的列上不适合创建索引。

②对于那些重复值太多的列也不适合建索引。

③当在某列做的修改远大于在其上做的查询操作时,也不适合在该列创建索引。

④对小型表一般也无须创建索引,即便进行索引可能不会产生明显优化效果,而且往往得不偿失。

一般来说,适合在以下的这些列上创建索引:

①在经常检索的列上创建索引,可以加快检索速度。

②在主码列上创建索引,可以强制该列的唯一性并组织表中数据的排列结构。

③在经常使用在WHERE子句中的列上创建索引,加快条件判断速度。

④在经常需要排序的列上创建索引,加快排序查询的时间。

⑤在经常用在多表连接的列上创建索引,可以加快连接的速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ系列(20)--RabbitMQ备份交换机

前言&#xff1a;上一篇文章我们提到当交换机确认消息失败或者交换机发送消息到队列失败&#xff0c;都可以通过回调方法让生产者重新发送消息&#xff0c;除此之外另一种方法就是通过备份交换机的方式保证消息的不丢失&#xff0c;当生产者无法把消息投递给交换机&#xff0c;…

剑指 Offer 67: 把字符串转换成整数

这道题使用的办法是先判断是否有符号&#xff0c;把空格消除&#xff0c;然后用一个标志位判断是否为负数。当遇到这种问题记得调用Integer中的MIN_VALUE和MAX_VALUE这样最方便。 class Solution {public int strToInt(String str) {//去前后空格char[] chars str.trim().toCh…

SpringMVC JDK17 SpringFramework6x Tomcat10遇到的找不到资源404问题以及SercletException

发生资源找不到异常 本人使用Tomcat9 与 jdk17 时无任何冲突可以随便使用 Springframework6x系列 对应的应该时tomcat10版本 在使用过程中遇到两个问题 1.依赖问题 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</a…

【Java】链表LinkedList

文章目录 一、链表1.1 链表的概念1.2 链表的结构 二、LinkedList的简介三、LinkedList的使用3.1 构造方法3.2 常见操作3.3 遍历方法 四、LinkedList的模拟实现五、LinkedList 和 ArrayList 的区别 一、链表 1.1 链表的概念 链表&#xff08;Linked List&#xff09;是一种常见…

hive数据的导入导出

一、hive 的数据导入 Linux本地文件以及数据格式&#xff1a; 在hive中创建表&#xff1a; create table t_user( id int ,name string ) row format delimited fields terminated by "," lines terminated by \n stored as textfile;stored as常见的几种格式 1.…

举例说明ChatGPT模型是怎么进行无监督学习的

ChatGPT&#xff0c;也称为生成式预训练Transformer&#xff08;GPT&#xff09;&#xff0c;是一种基于Transformer架构的自然语言处理模型。虽然在实际应用中&#xff0c;它主要用于有监督学习任务&#xff0c;但在训练初期&#xff0c;它会经历无监督学习阶段。以下是一个简…

LNMP实战部署(电影网站搭建)

第三阶段基础 时 间&#xff1a;2023年7月5日 参加人&#xff1a;全班人员 内 容&#xff1a; 目录 LNMP架构及应用部署&#xff1a;&#xff08;单台服务器部署&#xff09; 一、安装nginx&#xff1a;&#xff08;源码安装&#xff09; 二、安装mysql数据库&#xf…

LVS+Keepalived 群集及搭建

文章目录 一.keepalived 概述1.keepalived服务重要功能1.1 管理LvS负载均衡器软件1.2 支持故障自动切换 (failover)1.3 实现LVS集中节点的健康检查 (health checking)1.4 实现LVS负载调度器 节点服务器的高可用性 (HA) 2. keepalived 高可用故障切换转移原理及VRRP通信原理3.ke…

【C++】提前声明(Forward declaration)好处

C中提前声明&#xff08;Forward declaration&#xff09;好处小结&#xff1a; 减少编译依赖&#xff1a;通过提前声明&#xff0c;可以减少对头文件的依赖。这样可以降低编译时间&#xff0c;因为编译器不需要查看完整的定义&#xff0c;而仅需要知道类型的名称和成员函数的…

利用langchain-ChatGLM实现基于本地知识库的问答应用

目录 1 原理 2 开发部署 2.1 安装环境 2.2 加载本地模型 刷B站的时候&#xff0c;无意中看到吴恩达的一个langchain的教程&#xff0c;然后去github上搜了下&#xff0c;发现别人利用langchain和chatGLM做的基于本地知识库的问答应用挺好的&#xff0c;学习下。 1 原理 基…

yolov8-mnn C++部署

权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/zaibeijixing/article/details/131581809 ———————————————— 目录 准备工作 1、MNN编…

【Android】CheckBox的自定义样式和使用

需求 在登录页面。我们需要有一个复选框&#xff0c;让用户进行勾选&#xff0c;同意我们的流氓政策和协议&#xff0c;不然就不让用。 实现效果 未选择 已选择 我们知道&#xff0c;这个CheckBox的默认样式是一个正方形&#xff0c;现在改成一个圆形的话&#xff0c;首先需…

我的创作纪念日——我与CSDN的1024天

今天是在CSDN创作的第1024天&#xff0c;是一个非常有意义的天数&#xff0c;故写下此篇文章以表纪念之意。 机缘 我为什么会在CSDN写文章呢&#xff0c;那滴从很久很久以前说起。记得是大一的时候&#xff0c;我们的组原课程的授课老师在一次课堂上问起我们&#xff0c;问我…

AIGC - Easy Diffusion (Stable Diffusion) 图像生成工具的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131524075 版本v2.5.41 Stable Diffusion 图像生成工具是一种基于深度学习的技术&#xff0c;可以从随机噪声中生成高质量的图像&#x…

HFSS仿真T型波导学习笔记

HFSS仿真T型波导 文章目录 HFSS仿真T型波导1、求解器设置2、建模3、激励方式设置4、边界条件设置5、扫频设置6、设计检查&#xff0c;仿真分析7、数据后处理 设计要求&#xff1a; 仿真工作频率为10GHz的T型波导 1、求解器设置 模式驱动求解 2、建模 整个T型波导结构分为2…

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转载自cpolar极点云文章&#xff1a;【群…

java飞起基础----黑马程序员

阿里代码命名规约 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格&#xff0c;必须遵从驼峰形式。正例&#xff1a; localValue / getHttpMessage() / inputUserId【强制】类名使用 UpperCamelCase 风格&#xff0c;必须遵从驼峰形式&#xff0c;…

在外远程访问NAS威联通(QNAP)-免费内网穿透

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 转载自cpolar极点云文章&#xff1a;无需公网IP&#xff0c;在外远程访问NAS威联通QNAP【内…

企业产品指导手册怎么弄成在线版本的啊?

企业产品指导手册作为企业宣传推广和产品销售的重要工具&#xff0c;传统上通常是以纸质形式发放给客户。但随着互联网技术的快速发展&#xff0c;越来越多的企业开始将产品指导手册转化为在线版本&#xff0c;以便更好地满足客户的需求。本文将介绍如何将企业产品指导手册弄成…

优维DevOps全新产品——双态部署重磅上线

优维又一全新产品上线啦&#xff01; 最近&#xff0c;优维召开了一场发布会&#xff0c;宣布「DevOps全新产品——双态部署」重磅上线。发布会现场&#xff0c;重新审视了DevOps市场现状&#xff0c;深度剖析了行业面临的挑战与机遇&#xff0c;同时也深入浅出的揭晓了“双态…