数据库视图与索引经典题

这篇具有很好参考价值的文章主要介绍了数据库视图与索引经典题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://www.jianshu.com/p/d0aa8ac94f40


视图与索引

视图

可以通过视图对某些用户查询的数据进行限制
可以把一些常用的、复杂的统计类的做成视图

使用视图:当做一张虚拟的表来使用

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。
数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。

所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图只供查询,数据不可更改

定义视图

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

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

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

创建视图

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

create view 视图名 as 查询语句;

查看当前数据库中的所有视图:

SHOW FULL TABLES IN 数据库名 WHERE TABLE_TYPE LIKE 'VIEW';

创建视图注意事项

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

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

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

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

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

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

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

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

数据库

-- 创建图书表Book
CREATE TABLE Book(
  book_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  author VARCHAR(50) NOT NULL,
  publisher VARCHAR(50) NOT NULL,
  publish_date DATE NOT NULL,
  price DECIMAL(10,2) NOT NULL
);

-- 创建读者表Reader
CREATE TABLE Reader(
  reader_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  gender CHAR(1) NOT NULL,
  birthdate DATE NOT NULL,
  tel VARCHAR(20) NOT NULL
);

-- 创建借阅表Borrow
CREATE TABLE Borrow(
  borrow_id INT AUTO_INCREMENT PRIMARY KEY,
  reader_id INT NOT NULL,
  book_id INT NOT NULL,
  borrow_date DATE NOT NULL,
  return_date DATE DEFAULT NULL,
  FOREIGN KEY (reader_id) REFERENCES Reader(reader_id),
  FOREIGN KEY (book_id) REFERENCES Book(book_id)
);

-- 向图书表Book中插入数据
INSERT INTO Book (name, author, publisher, publish_date, price)
VALUES 
('MySQL从入门到精通', '张三', '清华大学出版社', '2020-03-01', 59.00),
('Java编程思想', 'Bruce Eckel', '机械工业出版社', '2018-08-01', 88.00),
('Python数据分析与挖掘实战', '李笑来', '人民邮电出版社', '2019-06-01', 45.00),
('计算机网络', '谢希仁', '清华大学出版社', '2017-03-01', 69.00),
('算法导论', 'Thomas H. Cormen', '机械工业出版社', '2020-05-01', 99.00);

-- 向读者表Reader中插入数据
INSERT INTO Reader (name, gender, birthdate, tel)
VALUES 
('张三', '男', '1990-01-01', '13812345678'),
('李四', '女', '1992-05-05', '13987654321'),
('王五', '男', '1995-12-18', '13666666666'),
('赵六', '女', '1991-07-23', '13333333333'),
('周七', '男', '1994-11-11', '13588888888');

-- 向借阅表Borrow中插入数据
INSERT INTO Borrow (reader_id, book_id, borrow_date, return_date)
VALUES 
(1, 1, '2020-02-01', NULL),
(2, 2, '2020-03-01', NULL),
(3, 3, '2020-04-01', NULL),
(1, 2, '2020-05-01', '2020-06-01'),
(4, 4, '2020-06-01', NULL),
(5, 5, '2020-07-01', NULL);

创建单源表视图

一个视图可以从单个或多个基本表导出数据,即单源表视图或多源表视图。但是,一个单源表视图不一定保留该基本表的主键或唯一键,而可能只是一个简单的行列子集视图

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

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

数据库视图与索引经典题,MySQL数据库,数据库,oracle
使用视图
数据库视图与索引经典题,MySQL数据库,数据库,oracle

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

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

数据库视图与索引经典题,MySQL数据库,数据库,oracle

创建多源表视图

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

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

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

CREATE VIEW R_B_Book (reader_id, name, book_id,book_name, publisher, price, borrow_date)
AS 
SELECT R.reader_id, R.name, B.book_id,B.name AS book_name, B.publisher, B.price, W.borrow_date AS borrow_date
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;

数据库视图与索引经典题,MySQL数据库,数据库,oracle

创建基于视图的视图

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

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

CREATE VIEW BorrowV
AS
   SELECT Book.name AS 书名, Book.publisher AS 出版社, Borrow.borrow_date AS 借阅日期 
   FROM Book 
   JOIN Borrow ON Book.book_id = Borrow.book_id 
   JOIN Reader ON Borrow.reader_id = Reader.reader_id 
   WHERE Reader.name = '张三';

数据库视图与索引经典题,MySQL数据库,数据库,oracle

创建带表达式的视图

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

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

CREATE VIEW ReaderInfo (ID, Name, Age)
AS
  SELECT reader_id, name, TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) AS Age
  FROM Reader;

数据库视图与索引经典题,MySQL数据库,数据库,oracle

创建含统计信息的视图

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

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

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

数据库视图与索引经典题,MySQL数据库,数据库,oracle

删除视图

删除视图的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、适当的利用视图可以更清晰的表达查询。

索引

索引的作用提升查询语句的执行速度,索引本身的维护也需要时间和空间,所以索引要适当使用
索引中常见的数据结构有以下几种:Hash表、二叉树、红黑树、B-Tree、B+Tree

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

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

索引的概念

索引实质上是一个单独的、物理的数据库结构,它是表中一个或多个列(称为搜索关键字)的值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
数据库视图与索引经典题,MySQL数据库,数据库,oracle

索引使用原则

并不是每个字段都设置索引就好,也不是索引越多越好,而是需要合理的使用。

  1. 对经常更新的表就避免对其进行过多的索引。
  2. 对经常用于查询的字段应该创建索引,但是这列数据不能经常修改
  3. 数据量小的表最好不要使用索引(一般是少于十万行的,大表才需要)。
  4. 相同值较多的字段上不要建立索引(比如"性别"字段)。相反的,在不同值较多的字段上可以建立索引(比如姓名)。

索引的类型

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

索引的主要缺点如下:

①创建索引要耗费时间。

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

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

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

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

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

设计索引

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

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

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

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

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

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

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

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

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

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

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

复合索引(A,B,C)

下列三种查询组合都执行索引吗?
A,B、B,C、A,C、A、ABC
B,C不执行 复合索引只要查询条件中使用了最左侧的列,就会执行索引文章来源地址https://www.toymoban.com/news/detail-528736.html

到了这里,关于数据库视图与索引经典题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL 数据库】8、视图

    视图(View)是一种虚拟存在的表 视图中的数据并不在数据库中真实存在 行和列数据来自 定义视图的查询中使用的表 ,并且是在使用视图时动态生成的 当使用 WITH CHECK OPTION 子句创建视图时,MySQL 会通过视图检查正在更改的每个行,例如 插入,更新,删除 ,以使其符合视图

    2024年02月08日
    浏览(50)
  • 玩转MYSQL数据库之--视图详解

    从今天开始本系列文章就带各位小伙伴学习数据库技术。 数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1297】字 ,不说废话,只讲可以让你学到技术、

    2024年02月05日
    浏览(87)
  • mysql数据库实验实训6,数据视图(详细)

    1、掌握视图功能和作用 2、掌握视图创建和管理办法 对YGGL数据库完成以下视图操作: 1、在员工管理数据库YGGL中创建视图Emp_view1,包含所有男员工的员工编号、姓名、工作年限和学历: 代码: mysql create or replace view Emp_view1 - as select 员工编号,姓名,工作年限,学历 - from employee

    2024年02月07日
    浏览(52)
  • MySQL数据库——MySQL创建视图(CREATE VIEW)

    创建视图是指在已经存在的 MySQL 数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。 可以使用 CREATE VIEW 语句来创建视图。 语法格式如下: 语法说明如下。 视图名 : 指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。 SEL

    2024年02月02日
    浏览(46)
  • MySQL数据库:索引

            索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。         相当于是给数据库中的数据建立了一个目录,通过目录可以知道数据所在位置,然后到指定位置

    2023年04月17日
    浏览(56)
  • 【MySql】数据库索引

    可以简单理解为一本书的目录信息,是为了提升查找效率而建立的 1、在创建一个主键、唯一键、外键时候,数据库会自动地针对查找字段设置索引; 2、在创建表时侯,使用 index 进行普通索引的声明 3、修改表结构,给指定的字段添加索引 alter table 表名 add index 索引名

    2024年02月03日
    浏览(42)
  • MySQL数据库索引机制

    MySQL是一款有客户端和服务端的网络应用,mysql是它的客户端,mysqld是它的服务端。服务端本质就是一个进程,它存在于内存当中。而我们存储在MySQL中的数据是保存在磁盘上的,当我们对MySQL中数据进行增删查改操作时,不可能是直接在磁盘上进行操作,而是将对应的数据加

    2024年02月12日
    浏览(48)
  • MySQL数据库唯一索引

    创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(C++语言基

    2024年02月08日
    浏览(38)
  • 【MySQL数据库】看完还有谁学不会 MySQL 中的视图?

    在MySQL中,视图是一种虚拟表,它是由一个或多个基本表的行或列组成的。视图并不实际存储数据,而是根据定义的查询语句动态生成结果集。视图可以简化复杂的查询操作,提高查询效率,同时也可以保护数据的安全性,隐藏敏感数据。 视图是一种虚拟表,它是由一个或多

    2024年02月10日
    浏览(40)
  • MySQL中的表与视图:解密数据库世界的基石

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:MySQL的100个知识点。 🎉欢迎 👍点赞✍评论⭐收

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包