视图是由一个或多个基础表(或视图)产生的虚拟表,数据库里存放了视图的定义,对应的数据是存放在物理数据表中。
使用视图有时可以简化用户操作,尤其是在需要关联多表查询时,不用关心视图查询的内部结构,只关注在索要获取的数据上
语法格式如下:
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;