- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章mysql视图之创建视图(CREATE VIEW)和使用限制实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了mysql视图之创建视图(CREATE VIEW)和使用限制。分享给大家供大家参考,具体如下:
mysql5.x 版本之后支持数据库视图,在mysql中,视图的几乎特征符合SQL:2003标准。 mysql以两种方式处理对视图的查询:
mysql支持版本系统的视图,当每次视图被更改或替换时,视图的副本将在驻留在特定数据库文件夹的arc(archive)文件夹中备份。备份文件的名称为view_name.frm-00001。如果再次更改视图,mysql将创建一个名为view_name.frm-00002的新备份文件。mysql允许基于其他视图创建视图,就是在视图定义的select语句中,可以引用另一个视图.
好啦,多的咱就不赘述了,接下来咱们尝试使用CREATE VIEW语句创建视图,先来看下语法结构:
1
2
3
4
5
|
CREATE
[ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]
VIEW
[database_name].[view_name]
AS
[
SELECT
statement]
|
然后我们来详细看下上面的sql中的各种词是什么意思。首先,第一个中括号里代表的就是创建视图是的算法属性,它允许我们控制mysql在创建视图时使用的机制,并且mysql提供了三种算法:MERGE,TEMPTABLE和UNDEFINED。我们来分别看下:
然后就是view后面的词组了,它就是名称的意思,在数据库中,视图和表共享相同的命名空间,因此视图和表不能具有相同的名称。 另外,视图的名称必须遵循表的命名规则.
最后就是SELECT语句了。在SELECT语句中,可以从数据库中存在的任何表或视图查询数据,同时SELECT语句必须遵循以下几个规则:
在这里我们得稍稍注意下,SELECT语句不需要引用任何表。完事呢,我们来尝试基于orderDetails表来创建一个表示每个订单的总销售额的视图:
1
2
3
4
5
6
7
|
CREATE
VIEW
SalePerOrder
AS
SELECT
orderNumber,
SUM
(quantityOrdered * priceEach) total
FROM
orderDetails
GROUP
by
orderNumber
ORDER
BY
total
DESC
;
|
我们如果使用SHOW TABLES命令来查看示例数据库(yiibaidb)中的所有表,还会看到SalesPerOrder视图也显示在表的列表中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
mysql> SHOW TABLES;
+
--------------------+
| Tables_in_yiibaidb |
+
--------------------+
| article_tags |
| contacts |
| customers |
| departments |
| employees |
| offices |
| offices_bk |
| offices_usa |
| orderdetails |
| orders |
| payments |
| productlines |
| products |
| saleperorder |
+
--------------------+
14
rows
in
set
|
这是因为视图和表共享相同的命名空间。要知道哪个对象是视图或表,就得使用SHOW FULL TABLES命令,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
mysql> SHOW
FULL
TABLES;
+
--------------------+------------+
| Tables_in_yiibaidb | Table_type |
+
--------------------+------------+
| article_tags | BASE
TABLE
|
| contacts | BASE
TABLE
|
| customers | BASE
TABLE
|
| departments | BASE
TABLE
|
| employees | BASE
TABLE
|
| offices | BASE
TABLE
|
| offices_bk | BASE
TABLE
|
| offices_usa | BASE
TABLE
|
| orderdetails | BASE
TABLE
|
| orders | BASE
TABLE
|
| payments | BASE
TABLE
|
| productlines | BASE
TABLE
|
| products | BASE
TABLE
|
| saleperorder |
VIEW
|
+
--------------------+------------+
14
rows
in
set
|
结果集中的table_type列指定哪个对象是视图,哪个对象是一个表(基表)。如上所示,saleperorder对应table_type列的值为:VIEW。然而,如果要查询每个销售订单的总销售额,只需要对SalePerOrder视图执行一个简单的SELECT语句,如下所示:
1
2
3
4
|
SELECT
*
FROM
salePerOrder;
|
执行上面查询语句,得到以下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
+
-------------+----------+
| orderNumber | total |
+
-------------+----------+
| 10165 | 67392.85 |
| 10287 | 61402.00 |
| 10310 | 61234.67 |
| 10212 | 59830.55 |
|
-- 此处省略了many many数据-- |
| 10116 | 1627.56 |
| 10158 | 1491.38 |
| 10144 | 1128.20 |
| 10408 | 615.45 |
+
-------------+----------+
327
rows
in
set
|
我们再来基于另一个视图创建一个视图,比如,根据SalesPerOrder视图创建名为大销售订单(BigSalesOrder)的视图,以显示总计大于60,000的每个销售订单,如下所示:
1
2
3
4
5
6
7
|
CREATE
VIEW
BigSalesOrder
AS
SELECT
orderNumber, ROUND(total,2)
as
total
FROM
saleperorder
WHERE
total > 60000;
|
现在,我们可以从BigSalesOrder视图查询数据,如下所示:
1
2
3
4
|
SELECT
orderNumber, total
FROM
BigSalesOrder;
|
执行上面查询语句,得到以下结果:
1
2
3
4
5
6
7
8
|
+
-------------+----------+
| orderNumber | total |
+
-------------+----------+
| 10165 | 67392.85 |
| 10287 | 61402.00 |
| 10310 | 61234.67 |
+
-------------+----------+
3
rows
in
set
|
完事我们再来尝试使用inner join创建包含客户编号和客户支付的总金额的视图,如下所示:
1
2
3
4
5
6
7
8
9
10
|
CREATE
VIEW
customerOrders
AS
SELECT
c.customerNumber,
p.amount
FROM
customers c
INNER
JOIN
payments p
ON
p.customerNumber = c.customerNumber
GROUP
BY
c.customerNumber
ORDER
BY
p.amount
DESC
;
|
我们使用下面的sql来查询customerOrders视图中的数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
+
----------------+-----------+
| customerNumber | amount |
+
----------------+-----------+
| 124 | 101244.59 |
| 321 | 85559.12 |
| 239 | 80375.24 |
| **** 此处省略了many many数据 ***|
| 219 | 3452.75 |
| 216 | 3101.4 |
| 161 | 2434.25 |
| 172 | 1960.8 |
+
----------------+-----------+
98
rows
in
set
|
再来尝试使用子查询创建包含价格高于所有产品的平均价格的产品的视图,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE
VIEW
aboveAvgProducts
AS
SELECT
productCode, productName, buyPrice
FROM
products
WHERE
buyPrice >
(
SELECT
AVG
(buyPrice)
FROM
products)
ORDER
BY
buyPrice
DESC
;
|
我们来查询aboveAvgProducts视图的数据:
1
2
3
4
|
SELECT
*
FROM
aboveAvgProducts;
|
执行上面查询语句,得到以下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
+
-------------+-----------------------------------------+----------+
| productCode | productName | buyPrice |
+
-------------+-----------------------------------------+----------+
| S10_4962 | 1962 LanciaA Delta 16V | 103.42 |
| S18_2238 | 1998 Chrysler Plymouth Prowler | 101.51 |
| S10_1949 | 1952 Alpine Renault 1300 | 98.58 |
|************* 此处省略了many many数据 *********************************|
| S18_3320 | 1917 Maxwell Touring Car | 57.54 |
| S24_4258 | 1936 Chrysler Airflow | 57.46 |
| S18_3233 | 1985 Toyota Supra | 57.01 |
| S18_2870 | 1999 Indy 500 Monte Carlo SS | 56.76 |
| S32_4485 | 1974 Ducati 350 Mk3 Desmo | 56.13 |
| S12_4473 | 1957 Chevy Pickup | 55.7 |
| S700_3167 | F/A 18 Hornet 1/72 | 54.4 |
+
-------------+-----------------------------------------+----------+
54
rows
in
set
|
好啦,到这里了,视图的创建和使用已经介绍的差不多了。但是,视图就没有什么使用的限制么?答案当然是有的,我们来分别看下.
首先,我们不能在视图上创建索引,再来就是当使用合并算法的视图查询数据时,mysql会使用底层表的索引,还有就是对于使用诱惑算法的视图,当我们针对视图查询数据时,不会使用索引.
还有就是要注意在mysql5.7.7之前版本,是不能在SELECT语句的FROM子句中使用子查询来定义视图的.
再来就是如果删除或重命名视图所基于的表,则mysql不会发出任何错误。但是,mysql会使视图无效,我们可以使用CHECK TABLE语句来检查视图是否有效.
一个简单的视图可以更新表中数据,但是基于具有连接,子查询等的复杂select语句创建的视图无法更新.
mysql不像Oracle、PostgreSQL等其他数据库系统那样支持物理视图,mysql是不支持物理视图的.
好啦,关于视图本次就记录到这里了.
希望本文所述对大家MySQL数据库计有所帮助.
原文链接:https://blog.csdn.net/luyaran/article/details/81015959 。
最后此篇关于mysql视图之创建视图(CREATE VIEW)和使用限制实例详解的文章就讲到这里了,如果你想了解更多关于mysql视图之创建视图(CREATE VIEW)和使用限制实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费
大家好,我是汤师爷~ 今天聊聊促销系统整体规划。 各类促销活动的系统流程,可以抽象为3大阶段: B端促销活动管理:商家运营人员在后台系统中配置和管理促销活动,包括设定活动基本信息、使用规则
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
我是一名优秀的程序员,十分优秀!