读书笔记--SQL必知必会18--视图

18.1 视图

视图是虚拟的表,只包含使用时动态检索数据的查询。

也就是说作为视图,它不包含任何列和数据,包含的是一个查询。

18.1.1 为什么使用视图

  • 重用SQL语句
  • 简化复杂的SQL操作
  • 使用表的一部分而不是整个表
  • 保护数据:可以赋予访问表的特定部分的权限
  • 可返回与底层表不同格式和表示的数据

如果应用大量或复杂的视图,极可能影响性能,应该先进行测试再应用视图。

18.1.2 视图的规则和限制

  • 视图名必须唯一,与其他的视图和表不同
  • 视图数目没有限制
  • 可以嵌套
  • 视图不能索引,也不能有关联的触发器或默认值

不同DBMS对视图语法和表示的定义不同。

例如,有些DBMS会限制视图嵌套的级数、禁止在视图中使用ORDER BY子句、设置视图为只读等等。

18.2 创建视图

使用CREATE VIEW语句来创建视图。

使用DROP VIEW语句来删除视图。

覆盖或更新视图,必须先删除视图,然后再重新创建。

18.2.1 利用视图简化复杂的联结

建议创建不绑定特定数据的视图,增强可重用性。

MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| Customers |
| OrderItems |
| Orders |
| Products |
| Vendors |
+-------------------+
5 rows in set (0.00 sec) MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> CREATE VIEW ProductCustomers AS
-> SELECT cust_name, cust_contact, prod_id
-> FROM Customers, Orders, OrderItems
-> WHERE Customers.cust_id = Orders.cust_id
-> AND OrderItems.order_num = Orders.order_num;
Query OK, 0 rows affected (0.01 sec) MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| Customers |
| OrderItems |
| Orders |
| ProductCustomers |
| Products |
| Vendors |
+-------------------+
6 rows in set (0.00 sec) MariaDB [sqlbzbh]> SELECT cust_name, cust_contact
-> FROM ProductCustomers
-> WHERE prod_id = 'RGAN01';
+---------------+--------------------+
| cust_name | cust_contact |
+---------------+--------------------+
| Fun4All | Denise L. Stephens |
| The Toy Store | Kim Howard |
+---------------+--------------------+
2 rows in set (0.00 sec) MariaDB [sqlbzbh]>

18.2.2 用视图重新格式化检索出的数据

MariaDB [sqlbzbh]> CREATE VIEW VendorLocations AS
-> SELECT Concat(vend_name, '---', vend_country) AS vend_title FROM Vendors;
Query OK, 0 rows affected (0.00 sec) MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> SELECT * FROM VendorLocations;
+-------------------------+
| vend_title |
+-------------------------+
| Bear Emporium---USA |
| Bears R Us---USA |
| Doll House Inc.---USA |
| Fun and Games---England |
| Furball Inc.---USA |
| Jouets et ours---France |
+-------------------------+
6 rows in set (0.00 sec) MariaDB [sqlbzbh]>

18.2.3 用视图过滤不想要的数据

WHERE子句适用于视图。

MariaDB [sqlbzbh]> CREATE VIEW CustomerEMailList AS
-> SELECT cust_id, cust_name, cust_email FROM Customers WHERE cust_email IS NOT NULL;
Query OK, 0 rows affected (0.01 sec) MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> SELECT * FROM CustomerEMailList;
+------------+--------------+-----------------------+
| cust_id | cust_name | cust_email |
+------------+--------------+-----------------------+
| 1000000001 | Village Toys | sales@villagetoys.com |
| 1000000003 | Fun4All | jjones@fun4all.com |
| 1000000004 | Fun4All | dstephens@fun4all.com |
+------------+--------------+-----------------------+
3 rows in set (0.00 sec) MariaDB [sqlbzbh]>

18.2.4 使用视图与计算字段

MariaDB [sqlbzbh]> CREATE VIEW OrderItemsExpanded AS
-> SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM OrderItems;
Query OK, 0 rows affected (0.00 sec) MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> SELECT * FROM OrderItemsExpanded WHERE order_num = 20008;
+-----------+---------+----------+------------+----------------+
| order_num | prod_id | quantity | item_price | expanded_price |
+-----------+---------+----------+------------+----------------+
| 20008 | RGAN01 | 5 | 4.99 | 24.95 |
| 20008 | BR03 | 5 | 11.99 | 59.95 |
| 20008 | BNBG01 | 10 | 3.49 | 34.90 |
| 20008 | BNBG02 | 10 | 3.49 | 34.90 |
| 20008 | BNBG03 | 10 | 3.49 | 34.90 |
+-----------+---------+----------+------------+----------------+
5 rows in set (0.00 sec) MariaDB [sqlbzbh]>

读书笔记--SQL必知必会18--视图的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  3. 读书笔记--SQL必知必会--建立练习环境

    书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...

  4. SQL语法语句总结(《SQL必知必会》读书笔记)

    一.SQL语句语法 ALTER TABLE ALTER TABLE 用来更新已存在表的结构. ALTER TABLE tablename (ADD|DROP column datatype [NULL ...

  5. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

  6. 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入

    文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...

  7. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  8. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  9. 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作

    上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...

随机推荐

  1. C语言 · 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  4. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  5. 一道返回num值的小题目

    题目描述: 实现fizzBuzz函数,参数num与返回值的关系如下: .如果num能同时被3和5整除,返回字符串fizzbuzz .如果num能被3整除,返回字符串fizz .如果num能被5整除,返 ...

  6. XSS分析及预防

    XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息 ...

  7. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  8. springmvc+bootstrap+jquerymobile完整搭建案例(提供下载地址)

    用一张简单的截图说明下,然后提供一个下载地址. bootstrap的大部分样式官方都是写好的,所以只需要class="官方样式即可",具体可以看官方的案例,下面来个地址 http: ...

  9. canvas快速绘制圆形、三角形、矩形、多边形

    想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...

  10. Linux网卡驱动安装、防火墙原理

    安装网卡驱动程序: 需要检查是否安装kernel依赖包: rpm –q kernel-devel #检查kernel依赖包是否安装 yum –y install kernel-devel 检查gcc和 ...