在本教程中,您将学习如何使用CREATE VIEW语句在MySQL中创建视图。

CREATE VIEW语句简介

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

CREATE [ALGORITHM = {MERGE  | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name]
AS
[SELECT  statement]

让我们更详细地查看了解以上语法。

视图处理算法

算法属性允许您控制MySQL在创建视图时使用的机制。MySQL提供三种算法:MERGETEMP TABLEUNDEFINED
- 使用MERGE算法,MySQL首先将输入查询与定义视图的SELECT语句组合成单个查询。 然后MySQL执行组合查询以返回结果集。如果SELECT语句包含聚合函数,如:MIN, MAX, SUM, COUNT, AVGDISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL,子查询 等等则不允许MERGE算法。如果SELECT语句没有引用表,则也不允许MERGE算法。如果不允许MERGE算法,MySQL将算法更改为UNDEFINED。 注意,输入查询和视图定义中的查询到一个查询的组合被称为视图决议。
- 使用TEMP TABLE算法,MySQL首先根据定义视图的SELECT语句创建一个临时表,然后对该临时表执行输入查询。因为MySQL必须创建一个临时表来存储结果集,并将数据从基表移动到临时表,TEMP TABLE算法的效率低于MERGE算法。此外,使用TEMP TABLE算法的视图不可更新。

  • UNDEFINED是创建视图时未指定显式算法的默认算法。UNDEFINED算法让MySQL做出选择使用MERGETEMP TABLE算法。MySQL优先选择MERGE算法再到TEMP TABLE算法,因为MERGE算法更有效率。

视图名称

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

SELECT语句

SELECT语句中,可以从数据库中存在的任何表或视图查询数据。SELECT语句必须遵循几个规则:
- SELECT语句可以在WHERE子句中包含子查询,但不能在FROM子句中。
- SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
- SELECT语句不能引用预处理语句的参数。

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

创建MySQL视图示例

创建简单视图

让我们来看看 order_detail 表。可以创建一个表示每个订单的总销售额的视图。

CREATE VIEW SalePerOrder ASSELECT order_id, SUM(buy_number * price) totalFROMstudymysql.order_detailGROUP by order_idORDER BY total DESC;

如果使用SHOW TABLES命令查看studymysql数据库中的所有表,我们还会看到SalesPerOrder视图显示在列表中。

SHOW TABLES;

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

结果集中的 table_type 列指定哪个对象是视图,哪个对象是表(基表)。
如果我们要查询每个销售订单的总销售额,只需要按照如下所示对SalePerOrder视图执行一个简单的SELECT语句:

SELECT *
FROMsalePerOrder;

执行上面的语句,结果如下 -

基于一个视图来创建视图

MySQL允许您基于一个视图来创建另一个视图。例如,您可以基于SalesPerOrder视图创建名为大销售订单的视图,以显示总数大于150,000的销售订单,如下所示:

CREATE VIEW BigSalesOrder ASSELECT order_id, ROUND(total,2) as totalFROMsaleperorderWHEREtotal > 150000;

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

SELECT order_id, total
FROMBigSalesOrder;

执行上面的语句,结果如下 -

使用join创建视图

以下是使用INNER JOIN创建视图的示例。视图包含订单号,客户名称和每个订单的总销售额。

CREATE VIEW customerOrders ASSELECT o.order_number,c.customer_name,SUM(buy_number * price) totalFROMstudymysql.order_detail dINNER JOINstudymysql.order o ON o.order_id = d.order_idINNER JOINstudymysql.customer c ON c.customer_id = o.customer_idGROUP BY o.order_numberORDER BY total DESC;

要从customerOrders视图中查询数据,请使用以下查询:

SELECT*
FROMcustomerOrders;

执行上面的语句,结果如下 -

使用子查询创建视图

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

CREATE VIEW aboveAvgProducts ASSELECT product_code, product_name, priceFROMstudymysql.productWHEREprice > (SELECT AVG(price)FROMstudymysql.product)ORDER BY price DESC;

从上述aboveAvgProducts视图中查询数据很简单,如下所示:

SELECT *
FROMaboveAvgProducts;

在本教程中,我们向您展示了如何使用CREATE VIEW语句创建视图。

相关教程

  • MySQL中的视图
  • 数据库视图简介
  • 管理MySQL中的视图

MySQL学习QQ群:418407075

在MySQL中创建视图的X种方式相关推荐

  1. javaScript中创建数组的3种方式

    JS数组定义及详解 javascript如何定义数组? 直接上代码和截图 //javaScript中创建数组的3种方式 //方式1 var names = ["令狐冲", &quo ...

  2. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  3. 【并发技术01】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承 Thread 类,并重写 run() 方法:二是实现 Runnable 接口,覆盖接口中的 run() 方法,并把 Runnable 接口的实现扔给 T ...

  4. 【JS】JavaScript中创建数组的6种方式(代码示例合集)

    创建数组的6种方式 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  5. mysql创建视图sql_SQL视图介绍-如何在SQL和MySQL中创建视图

    mysql创建视图sql 什么是SQL视图? (What is a View in SQL?) A View is a database object that presents data exist ...

  6. mysql中创建视图、索引

    数据库的三级模式两级映射: 存储文件------>基本表----->视图 内模式   ------->模式   ------>外模式 一.视图 1.什么是视图: 视图是从一个或 ...

  7. 如何在MySQL中创建视图

    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS ...

  8. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出

    尝试使用过程创建视图时出现问题. 我必须这样做,因为我需要在MySQL中发挥作用,将表的行转换为另一个表的列. 该查询效果很好,但是当我将其放在" CREATE VIEW"语句中时 ...

  9. MySQL中创建视图并授权

    开发过程中,会涉及到将数据库表给第三方公司使用,基于这样的场景,使用视图是较合理的,一方面可以控制显示字段,同时也是可以设置权限. 创建用户 create user `用户名`@`%` identif ...

最新文章

  1. java List集合中contains方法总是返回false
  2. 记一次腾讯霸面---前端
  3. Java实现单例模式
  4. 用php编写比赛评奖系统_php编写的抽奖程序中奖概率算法
  5. 【ARM】Tiny4412裸板编程之MMU(页 4K)
  6. 网页文件都是php怎么修改,请问你们怎么将html的文件的内容改变为php
  7. 数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
  8. SQL Server 常用分页SQL
  9. Centos7.6环境Docker安装Oracle19c企业版
  10. 阿里小姐姐工作7年,P6升P7无望,欲去当培训师
  11. vs2010解决方案源文件夹和头文件夹消失
  12. qq linux五笔输入法下载软件,qq五笔输入法2017
  13. 关于百度富文本编辑器UEditor中ctrl+enter键发送消息的解决方案
  14. 清理offset_kafka数据清理
  15. 组合优化问题的典型事例
  16. 【人话版】分布式数字身份:通往WEB3世界的桥头堡
  17. 年轻人,你为什么要来阿里搞技术?
  18. OPPO以数字普惠金融助力小微企业
  19. CSDN官方积分方法
  20. element做树形下拉_点睛时刻:移动端需要做SEO优化吗?移动端该怎么做SEO优化?

热门文章

  1. springboot成都大学校园植物网站毕业设计-附源码181557
  2. 将营销进行到底的逸仙电商,难向“完美”
  3. CREStereo: Practical Stereo Matching via Cascaded Recurrent Networkwith Adaptive Correlation-论文阅读
  4. Python自学笔记——基础篇
  5. Suspicious Operation Django
  6. linux 之 echo命令用法
  7. sklearn.metrics中的评估方法(MAE\MSE)
  8. Windows 下安装 Xdebug 受难记之(1)
  9. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】
  10. HTML、CSS中雪碧图的使用