SQL 难点对比分析:WITH 和 CREATE VIEW 的区别

1. 简述

WITHCREATE VIEW 有点类似Python给变量赋值,它们的区别是:

  • WITH:创建临时表以供复用,执行完毕自动清理,无法执行增删改操作(只能被SELECT)

    创建临时表并使用:

    WITH a AS (SELECT * FROM table_a) # 在这里没有分号!
    
    SELECT col
    FROM a
    
  • CREATE VIEW:创建虚拟表以供复用,不删除还存在,可以对视图进行DML操作

    创建 视图:

    CREATE VIEW a AS  # 这里没有括号!
    SELECT * FROM table_a;
    

    删除视图:

    DROP VIEW a;
    

2. 小结

CREATE VIEWWITH
语法CREATE VIEW view_name AS SELECT 语句(视图); SELECT 语句(你的查询);WITH name AS (SELECT 语句(临时表)) SELECT 语句(你的查询);
用法便于复用的视图,需要自行删除便于复用的临时表 ,自动删除
注意1上述语法分号的位置上述语法分号的位置,即后面必须直接紧跟SQL语句
注意2AS 后的语句需要使用括号AS 后的语句需要使用括号,再次强调with as后面必须紧跟使用CTE(Common table Express)
注意3AS 不可省略AS 不可省略

附:CTE(Common table Express) 待深入了解

3. 实例

表格user_behavior_cnt_grouping

在这里插入图片描述

临时表

从上表中构造零时表:

WITH behavior_cnt AS
(SELECT COUNT(*) 'cnt_all',
			 SUM(IF(pv_grouping > 0, 1, 0)) 'pv_total',
			 SUM(IF(pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0 AND buy_grouping > 0, 1, 0)) 'pv-fav-cart-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping = 0 AND buy_grouping > 0, 1, 0)) 'pv-fav-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping > 0 AND buy_grouping > 0, 1, 0)) 'pv-cart-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping = 0 AND buy_grouping > 0, 1, 0)) 'pv-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping = 0 AND buy_grouping = 0, 1, 0)) 'not-buy'
FROM user_behavior_cnt_grouping)
-- 
SELECT * FROM behavior_cnt;

返回结果:

在这里插入图片描述

视图

相应 视图写法:

DROP VIEW  IF EXISTS behavior_cnt;  # 若已经存在先删除,便于代码多次运行

CREATE VIEW behavior_cnt AS
SELECT COUNT(*) 'cnt_all',
			 SUM(IF(pv_grouping > 0, 1, 0)) 'pv_total',
			 SUM(IF(pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0 AND buy_grouping > 0, 1, 0)) 'pv-fav-cart-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping = 0 AND buy_grouping > 0, 1, 0)) 'pv-fav-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping > 0 AND buy_grouping > 0, 1, 0)) 'pv-cart-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping = 0 AND buy_grouping > 0, 1, 0)) 'pv-buy',
			 SUM(IF(pv_grouping > 0 AND fav_grouping = 0 AND cart_grouping = 0 AND buy_grouping = 0, 1, 0)) 'not-buy'
FROM user_behavior_cnt_grouping;

SELECT * FROM behavior_cnt;

返回结果一样:
在这里插入图片描述
注:上面代码为了反复运行 我在在最开始使用 DROP VIEW IF EXISTS先删除已经存在的视图。

补充

如何使用多个临时表

使用两个 WITH AS 的格式为:

WITH name_1 AS
(
  ....
),  
name_2 AS
(
  ....
)
SELECT ...;

实例:

WITH pv_favcart AS 
(SELECT SUM(fav_grouping) + SUM(cart_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0),
pv_favcart_buy AS 
(SELECT SUM(fav_grouping) + SUM(cart_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND cart_grouping > 0 AND buy_grouping > 0)
SELECT (SELECT * FROM pv_favcart_buy) / (SELECT * FROM pv_favcart);

结果为0.4452,因为这计算的是两个数值的比值。

以及三个临时表的:


### pv-fav-buy
WITH pv AS
(
SELECT SUM(pv_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0
),
pv_fav AS
(
SELECT SUM(fav_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0
),
pv_fav_buy AS 
(
SELECT SUM(fav_grouping)
FROM user_behavior_cnt_grouping
WHERE pv_grouping > 0 AND fav_grouping > 0 AND buy_grouping > 0
)
SELECT (SELECT * FROM pv_fav) / (SELECT * FROM pv) '浏览用户到收藏用户的转化率',
			 (SELECT * FROM pv_fav_buy) / (SELECT * FROM pv_fav) '浏览且收藏的用户到成功购买的转化率';

结果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值