zoukankan      html  css  js  c++  java
  • MySQL视图和存储过程

    视图

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

    视图作用:重用SQL语句;简化复杂的SQL操作;使用表的组成部分;保护数据;更改数据格式和表示。

    CREATE VIEW创建视图;SHOW CREATE VIEW viewname查看创建视图语句;DROP VIEW viewname删除视图。

    CREATE VIEW productcustomers AS
    SELECT cust_name, cust_contact, proid_id
    FROM customers, orders, orderitems
    WHERE customers.cust_id = orders.cust_id
     AND orderitems.order_num = order.order_num;
    

    视图可以用来过滤数据,和计算字段结合使用。

    并非所有视图是可更新的,对视图增删,实际上是对基表增删。如果视图含有以下操作,则不能视图更新:

    • 分组group by ,having
    • 联结
    • 子查询
    • 聚集函数min() count() sum()

    存储过程

    保存一条或者多条SQL语句的集合,可以视为批处理。

    MySQL执行存储过程的语句为CALL,CALL接受存储过程的名字以及需要传递给它的任意参数

    CALL productpricing(@pricelow,@pricehigh,@priceaverage);//执行存储过程,计算返回产品最低最高平均价格
    

    返回产品平均价格的存储过程

    CREATE PROCEDURE productpricing()
    GEGIN
        SELECT Avg(prod_price) AS priceaverage
        FROM product;
    END;
    

    删除存储过程 DROP PROCEDURE productpricing;

    CREATE PROCEDURE ordertotal(
        IN onumber INT,
        OUT ototal DECIMAL(8,2)
    )
    BEGIN
        SELECT Sum(item_price*quantity)
        FROM orderitems
        WHERE order_num = onumber
        INTO ototal;
    END;
    
    //调用存储过程
    CALL ordertotal(20005, @total);
    
    SELECT @total;//查询存储过程结果
    

    游标

    游标是一个存储在MySQL服务器上的数据库查询,不是SELECT语句,而是被该语句检索出来的结果集。存储游标后,可以根据需要滚动浏览其中数据。

    游标主要用于交互式应用,用户需要滚动屏幕上的数据。在MySQL游标只能用于存储过程和函数。

    游标用DECLARE创建

    CREATE PROCEDURE processorders()
    BEGIN
        DECLARE ordernumbers CURSOR
        FOR
        SELECT order_num FROM orders;
    END;
    

    OPEN CURSOR打开游标,CLOSE CURSOR;关闭游标。在游标被打开后,可以使用FETCH语句分别访问每一行。

    CREATE PROCEDURE processorders()
    BEGIN
        -- Declare local variables//注释
        DECLARE o INT;
        
        -- Declare the cursor
        DECLARE ordernumbers CURSOR
        FOR
        SELECT order_num FROM orders;
        
        -- Open the cursor
        OPEN ordernumbers;
        
        --Get order number
        FETCH ordernumbers INTO o;
        
        --Close the cursor
        CLOSE ordernumbers;
    END;
    

    触发器

    创建触发器,需要给出4条信息:唯一的触发器名;触发器关联的表;触发器应该相应的活动(DELETE INSERT UPDATE);触发器何时执行。

    CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'//每个成功的插入都会显示Product added消息
    

    只有基表支持触发器,视图不支持。每个表最多6个触发器,INSERT前后,UPDATE前后,DELETE前后。

    CREATE TRIGGER newworder AFTER INERT ON orders FOR EACH ROW SELECT NEW.order_num;//NEW表示新插入行
    
    INSERT INTO orders(order_date, cust_id)
    VALUES (Now(), 10001);
    
    //输出order_num 20010
    

    DELETE触发器,可以引用OLD的虚拟表,只读不能更新。

    UPDATE触发器,可以引用OLD的虚拟表访问以前的值,引用NEW访问新的更新值。

  • 相关阅读:
    如何清除去掉PPT文字下的波浪线
    使用SQLyog备份还原数据库
    excel冻结首行
    查看Mysql版本号
    java23种设计模式
    Elasticsearch Java High Level REST Client(Bulk API)
    Elasticsearch Java High Level REST Client工具类
    springboot2.0整合es报错 nested exception is java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
    ElasticSearch 应用开发Transport Client和Rest Client网络协议
    单例和多例的区别
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/12408131.html
Copyright © 2011-2022 走看看