最近在处理视图相关的内容展示,注重研究了下视图相关的语法及其创建的种类.

CREATE VIEW语句简介

要在MySQL中创建一个新视图,可以使用CREATE VIEW语句。 在MySQL中创建视图的语法如下:

CREATE

[ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]

VIEW [database_name].[view_name]

AS

[SELECT statement]SQL

下面我们来详细的查看上面的语法。

查看处理算法

算法属性允许您控制MySQL在创建视图时使用的机制,MySQL提供了三种算法:MERGE,TEMPTABLE和UNDEFINED。

使用MERGE算法,MySQL首先将输入查询与定义视图的SELECT语句组合成单个查询。 然后MySQL执行组合查询返回结果集。 如果SELECT语句包含集合函数(如MIN,MAX,SUM,COUNT,AVG等)或DISTINCT,GROUP BY,HAVING,LIMIT,UNION,UNION ALL,子查询,则不允许使用MERGE算法。 如果SELECT语句无引用表,则也不允许使用MERGE算法。 如果不允许MERGE算法,MySQL将算法更改为UNDEFINED。请注意,将视图定义中的输入查询和查询组合成一个查询称为视图分辨率。

使用TEMPTABLE算法,MySQL首先根据定义视图的SELECT语句创建一个临时表,然后针对该临时表执行输入查询。因为MySQL必须创建临时表来存储结果集并将数据从基表移动到临时表,所以TEMPTABLE算法的效率比MERGE算法效率低。 另外,使用TEMPTABLE算法的视图是不可更新的。

当您创建视图而不指定显式算法时,UNDEFINED是默认算法。 UNDEFINED算法使MySQL可以选择使用MERGE或TEMPTABLE算法。MySQL优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。

查看名称

在数据库中,视图和表共享相同的命名空间,因此视图和表不能具有相同的名称。 另外,视图的名称必须遵循表的命名规则。

SELECT语句

在SELECT语句中,可以从数据库中存在的任何表或视图查询数据。SELECT语句必须遵循以下几个规则:

SELECT语句可以在WHERE子句中包含子查询,但FROM子句中的不能包含子查询。SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。SELECT语句不能引用准备语句的参数。

请注意,SELECT语句不需要引用任何表。

创建MySQL视图示例

创建简单的视图

我们来看看orderDetails表。基于orderDetails表来创建一个表示每个订单的总销售额的视图。

CREATE VIEW SalePerOrder AS

SELECT

orderNumber, SUM(quantityOrdered * priceEach) total

FROM

orderDetails

GROUP by orderNumber

ORDER BY total DESC;

如果使用SHOW TABLES命令来查看示例数据库(yiibaidb)中的所有表,我们还会看到SalesPerOrder视图也显示在表的列表中。如下所示 -

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 setSQL

这是因为视图和表共享相同的命名空间。要知道哪个对象是视图或表,请使用SHOW FULL TABLES命令,如下所示:

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 setSQL

结果集中的table_type列指定哪个对象是视图,哪个对象是一个表(基表)。如上所示,saleperorder对应table_type列的值为:VIEW。

如果要查询每个销售订单的总销售额,只需要对SalePerOrder视图执行一个简单的SELECT语句,如下所示:

SELECT

*

FROM

salePerOrder;SQL

执行上面查询语句,得到以下结果 -

+-------------+----------+

| orderNumber | total |

+-------------+----------+

| 10165 | 67392.85 |

| 10287 | 61402.00 |

| 10310 | 61234.67 |

| 10212 | 59830.55 |

|-- 此处省略了一大波数据-- |

| 10116 | 1627.56 |

| 10158 | 1491.38 |

| 10144 | 1128.20 |

| 10408 | 615.45 |

+-------------+----------+

327 rows in set

基于另一个视图创建视图

MySQL允许您基于另一个视图创建一个视图。例如,可以根据SalesPerOrder视图创建名为大销售订单(BigSalesOrder)的视图,以显示总计大于60,000的每个销售订单,如下所示:

CREATE VIEW BigSalesOrder AS

SELECT

orderNumber, ROUND(total,2) as total

FROM

saleperorder

WHERE

total > 60000;SQL

现在,我们可以从BigSalesOrder视图查询数据,如下所示:

SELECT

orderNumber, total

FROM

BigSalesOrder;SQL

执行上面查询语句,得到以下结果 -

+-------------+----------+

| orderNumber | total |

+-------------+----------+

| 10165 | 67392.85 |

| 10287 | 61402.00 |

| 10310 | 61234.67 |

+-------------+----------+

3 rows in setSQL

使用连接表创建视图

以下是使用INNER JOIN创建视图的示例。 该视图包含客户编号和客户支付的总金额。

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视图中的数据,请使用以下查询:

SELECT * FROM customerOrders;SQL

执行上面查询语句,得到以下结果 -

+----------------+-----------+

| customerNumber | amount |

+----------------+-----------+

| 124 | 101244.59 |

| 321 | 85559.12 |

| 239 | 80375.24 |

| **** 此处省略了一大波数据 ***|

| 219 | 3452.75 |

| 216 | 3101.4 |

| 161 | 2434.25 |

| 172 | 1960.8 |

+----------------+-----------+

98 rows in setShell

使用子查询创建视图

以下说明如何使用子查询创建视图,该视图包含价格高于所有产品的平均价格的产品。

CREATE VIEW aboveAvgProducts AS

SELECT

productCode, productName, buyPrice

FROM

products

WHERE

buyPrice >

(SELECT

AVG(buyPrice)

FROM

products)

ORDER BY buyPrice DESC;SQL

查询上述视图:aboveAvgProducts的数据简单如下:

SELECT

*

FROM

aboveAvgProducts;SQL

执行上面查询语句,得到以下结果 -

+-------------+-----------------------------------------+----------+

| 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 |

|************* 此处省略了一大波数据 *********************************|

| 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创建视图的语法格式_Mysql创建视图语法及其创建种类相关推荐

  1. mysql添加字段基本语法格式_MySQL添加字段 修改字段 删除字段-Mysql常用命令-吾爱编程网...

    作为程序员mysql的操作是必须要学会的,有时候我们需要使用命令行对数据表进行操作,接下来吾爱编程就为大家介绍一下MySQL 添加字段.修改字段.删除字段等常用命令,有需要的小伙伴可以参考一下: 1. ...

  2. mysql里如何写日期格式_mysql 日期格式

    MYSQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段 format:日期格式 返回系统日期,输出 ...

  3. mysql数据导入导出 CSV格式_MySQL中导入导出CSV格式数据

    原标题:MySQL中导入导出CSV格式数据 预备阅读:MySQL中的主键问题和赋权限问题 今天来讲一下在MySQL中导入和导出CSV格式数据的操作. CSV格式数据 逗号分隔值(Comma-Separ ...

  4. mysql密码一般设置什么格式_mysql更改密码_如何更改mysql root用户密码

    windows平台下如何修改mysql数据库密码 1.关闭正在运行的MySQL服务:net stop mysql或 在windows 任务管理器中结束 mysqld.exe 进程或在 管理工具里面的服 ...

  5. mysql创建删除触发器的时候_mysql触发器简介及如何创建和删除触发器

    什么是mysql触发器 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行,存储过程也是如此.但是,如果你想要 ...

  6. mysql grant 语法格式_MySQL grant 语法的详细解析

    我们今天主要向大家介绍的是MySQL grant 语法的详细解析,同时本文还介绍了其实际应用代码的介绍,希望在你今后的学习中会有所帮助. 以下的文章是MySQL grant 语法的详细解析,如果你对M ...

  7. mysql百万数据建索引时间_mysql百万的数据快速创建索引

    测试数据本机一张表users有100百万条记录.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加可能不成功,想了很多办法,终于挖坑成功. 开始准备工作, ...

  8. mysql视图的更新 条件_mysql中视图更新详解

    视图的可更新性与视图中查询的定义是有关的 一.mysql中那些试图使不可更新的?以下类型的视图是不可更新的 1.包含以下关键字的sql语句:聚合函数(sum.min.max.count).distin ...

  9. mysql数据库sql语法参考_MySQL数据库SQL语法参考

    一.资料定义 ddl(data definition language) 资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系.表格内的有什麽栏 ...

  10. mysql日志恢复的时间格式_mysql binlog 日志恢复数据

    首先:开启binlog日志 server-id=1 log-bin=mysql-bin binlog_format=MIXED binlog_format有三种格式: 1)只有sql语句STATEME ...

最新文章

  1. java程序课程总结_java课程总结
  2. 框架:Mybatis中使用sql几种特殊情况
  3. linux禁用页面拷贝粘贴,【Linux基础】VI命令模式下删除拷贝与粘贴
  4. 05 Python - Python运行
  5. BZOJ 2436 NOI嘉年华(单调优化)
  6. (转)程序员的十层楼11层(上帝)
  7. python中的分号
  8. Cheerleaders【容斥】
  9. Linux用户配置文件(第二版)
  10. 2020 ccf推荐中文期刊_中国计算机学会推荐中文期刊目录,让业内学者不再盲目投稿...
  11. 【数据结构】线性表之双向链式线性表
  12. 常用的数据库操作语句(3)
  13. oracle导出数据只能9999,批量快速的导入导出Oracle的数据
  14. 镜头相关的基本参数总结
  15. rocksdb-参数配置
  16. Python爬取所有人位置信息——腾讯位置大数据!
  17. forwardRef 的详解及使用
  18. 苹果MAC电脑OS系统使用Cisco AnyConnect教程
  19. 免费WiFi软件,你还太单纯
  20. 中国智能变电站运维行业调研与发展前景报告(2022版)

热门文章

  1. CODESYS 控制虚拟单轴运动
  2. 实验二 帧中继的基本配置
  3. 台计算机结构看内存条位置,内存条正反怎么看
  4. 猜数字 很多人都玩过这个游戏:甲在心中想好一个数字,乙来猜。 每猜一个数字,甲必须告诉他是猜大了,猜小了,还是刚好猜中了。
  5. Excel中无法查找和替换
  6. java中的xpath,读取xml文档。
  7. Ubuntu 重置用户密码
  8. 电路分析题目详解(四)
  9. apply,call,bind重新定义this的区别
  10. 微信小程序开发出现Page “pages/detail/detail” has not been registered yet.