mysql 視圖使用


視圖是由一個或多個基礎表(或視圖)產生的虛擬表,數據庫里存放了視圖的定義,對應的數據是存放在物理數據表中。

使用視圖有時可以簡化用戶操作,尤其是在需要關聯多表查詢時,不用關心視圖查詢的內部結構,只關注在索要獲取的數據上

語法格式如下:

CREATE VIEW <視圖名> AS <SELECT語句>

語法說明如下。

  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT語句>:指定創建視圖的 SELECT 語句,可用於查詢多個基礎表或源視圖。

1、准備工作

訂單表:

DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`user_id`  int(11) NOT NULL ,
`order_time`  int(10) NOT NULL ,
`fee`  int(11) NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;

訂單詳情表:

DROP TABLE IF EXISTS `t_order_detail`;
CREATE TABLE `t_order_detail` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`goods_id`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`count`  int(11) NOT NULL ,
`order_id`  int(11) NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;

商品表:

DROP TABLE IF EXISTS `t_goods`;
CREATE TABLE `t_goods` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`good_name`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`price`  int(11) NOT NULL ,
`stock`  int(11) NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;

初始化測試數據:

INSERT INTO `t_goods` VALUES ('1', 'a', '12', '100'), ('2', 'b', '1', '100');
INSERT INTO `t_order` VALUES ('1', '1', '20190912', '1000000');
INSERT INTO `t_order_detail` VALUES ('1', '1', '10', '1'), ('2', '2', '5', '1');

2、創建視圖

CREATE VIEW order_detail_2 (id, user_id, goods_name, goods_price, count, fee) AS SELECT
    o.id,
    o.user_id,
    tg.good_name,
    tg.price,
    tod.count,
    (tg.price * tod.count)
FROM
    t_order o
RIGHT JOIN t_order_detail tod ON o.id = tod.order_id
RIGHT JOIN t_goods tg ON tod.goods_id = tg.id
WHERE o.id = 1;

該視圖是查詢訂單號為1的詳細信息,之后就可以直接使用視圖來查詢了,查詢過程就和基礎表一樣

SELECT * from order_detail;

 3、可以寫個存儲過程來添加數據

BEGIN
    
    DECLARE i int default 0;
    DECLARE y int default 0;
    DECLARE order_id INT;
    DECLARE goods_id INT;
    # 子訂單數量
    DECLARE sub_order_count INT DEFAULT 1;

    
    # order_count為插入訂單的數量控制,如果傳入為null或者0時處理成0
    IF order_count IS NULL OR order_count = 0 THEN
        SET order_count = 1;
    END IF;

    WHILE i < order_count DO
        # 插入訂單表
    INSERT INTO t_order(user_id, order_time) VALUES(00001,20190912);
        # 查詢訂單表最大的id
        SELECT MAX(id) INTO order_id FROM t_order;
    
        # 最多購買5件
        SELECT ROUND(RAND() * 5) INTO sub_order_count;
        WHILE y < sub_order_count DO
            # 商品id隨機獲取,ROUND是四舍五入,RAND是[0,1)的取值
            SELECT t1.id INTO goods_id FROM t_goods t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) from t_goods) - (SELECT MIN(id) from t_goods)) + (SELECT MIN(id) from t_goods)) AS goods_id) AS t2 ON t1.id >= t2.goods_id ORDER BY t1.id LIMIT 1;
            # 插入訂單詳情表
            INSERT INTO t_order_detail(order_id, goods_id, count) VALUES(order_id, goods_id, 1);
            SET y = y + 1;
        END WHILE;
        # 清空訂單詳情的遍歷標識
        SET y = 0;
    SET i = i + 1;
    END WHILE;
END

之后就可以通過調用來插入一些測試數據了,傳入order_count

CALL add_while(10);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM