zoukankan      html  css  js  c++  java
  • MySQL——创建视图(3)

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

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

    1、查看处理算法

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

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

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

    2、查看名称

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

    SELECT语句

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

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

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

    3、创建MySQL视图示例

    创建简单的视图

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

    CREATE VIEW SalePerOrder AS
        SELECT 
            orderNumber, SUM(quantityOrdered * priceEach) total
        FROM
            orderDetails
        GROUP by orderNumber
        ORDER BY total DESC;

    要知道哪个对象是视图或表,请使用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       |
    +--------------------+------------+
    结果集中的table_type列指定哪个对象是视图,哪个对象是一个表(基表)。如上所示,saleperorder对应table_type列的值为:VIEW

    使用连接表创建视图

    以下是使用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;

    使用子查询创建视图

    以下说明如何使用子查询创建视图,该视图包含价格高于所有产品的平均价格的产品。
    CREATE VIEW aboveAvgProducts AS
        SELECT 
            productCode, productName, buyPrice
        FROM
            products
        WHERE
            buyPrice > 
     (SELECT 
                    AVG(buyPrice)
                FROM
                    products)
        ORDER BY buyPrice DESC;
  • 相关阅读:
    Go语言学习笔记(二)十分钟上手
    Go语言学习笔记(一)Let's 干吧
    Windows下visual studio code搭建golang开发环境
    dotweb——go语言的一个微型web框架(三)路由注册
    dotweb——go语言的一个微型web框架(二)启动dotweb
    dotweb——go语言的一个微型web框架(一)
    【转】URL的井号
    39行代码实现JS HTML模板(轻量+高效+易用)
    “void * __cdecl operator new(unsigned int)”(??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
    C++ Compiling… Error spawning cl.exe
  • 原文地址:https://www.cnblogs.com/yuezc/p/12661469.html
Copyright © 2011-2022 走看看