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

项目5总结:创建与使用视图 主要介绍使用语句创建视图,修改视图,利用视图更新数据表,删除视图等详解 阅读详情
AI摘要

本文详细介绍了SQL中WITH子句创建的临时表和CREATE VIEW命令创建的视图的区别及用法。临时表在执行完毕后自动清理,不可执行DML操作,而视图则长期存在,可以进行数据修改操作。通过实例展示了如何使用这两个工具进行数据统计和分析,包括多临时表的联合使用。此外,还提供了删除视图的示例,确保代码可重复运行。

1. 简述

WITH 和 CREATE 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) '浏览且收藏的用户到成功购买的转化率';

结果:

在这里插入图片描述

SQL DDL 完全指南:从 CREATE 到数据库对象管理的一次讲透 在数据库管理系统中,SQL 语言按功能划分为 DDL、DML、DCL 与 TCL,其中 DDL(数据定义语言)负责构建数据库对象的骨架,是所有数据操作的前提。CREATE 作为 DDL 的核心命令,用于创建数据库、表、索引、视图、触发器、存储过程及用户等对象,其语法设计直接关系到后续查询性能与数据一致性。理解 DDL 的隐式提交特性、约束规则与索引代价,是保障生产环境数据安全的关键。从项目初始化、性能优化到权限管理,CREATE 系列命令贯穿数据库生命周期。本文以 MySQL 为主,兼顾 PostgreSQ 阅读详情

相关推荐

SAP CDS view 定义的数据库视图和传统 SQL 语句定义视图的区别

SAP CDS view 使用关键字来定义数据模型。它是一种声明性语言,允许开发人员在数据模型中指定字段、数据关系、聚合等。CDS view 语法使用结构来指定查询,通过 SELECT 语句来选择数据字段。在 SAP CDS view 中,字段的定义需要使用数据类型,并且 CDS 提供了丰富的数据类型来满足不同的需求,例如,IntegerStringDecimal等。CDS 还支持自定义的数据类型。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 545

【Hive】with子查询与create、insert连用

子查询与create/insert一同使用时,语句写法略有不同。如下。 1 create table -- 创建表时,create table应该写在所有的with查询之前 create table t_cre as with t1 as ( select outid, name from t_sel1 ),t2 as ( select outid, name from t_sel2 ) select * from t1 full join t2 on bzks.outid

Dawson的博客 6343

CH340以及CH系列USB转串口驱动下载

在之前使用USB转串口时,很多时候大家可能会不知道去哪下载驱动,然后百度随便下载一个,但往往鱼龙混杂且版本不一,所以今天特意整理一下CH340驱动以及CH系列的官方驱动下载地址,方便大家进行下载也方便自己后期查找,所有链接皆指向官方下载链接,每次下载都可获取官方当前最新驱动。 CH340/CH341 Windows驱动下载链接:CH341SER.EXE下载链接 Linux驱动下载链接:CH341SER_LINUX.ZIP下载链接 Andr...

OIDCAT的博客 4万+

hive 之with as 和create view 和create temporary table用法

create view 其实和with tmp as 很相似,都是把复杂的可以重用的sql简化,我觉得唯一的区别就是 view是可以创建下次再使用的 但是with只是当前sql有效,甚至不是会话有效。可以看到 这个join with as 和 view 都是执行了两次,但是temporary table 只执行了一次join,所以如果以后尽量不要用with as 卵用没有。之前网上不知道看的那篇文章说with里面的内容可以复用,也就是只计算一次 下次就不计算了,直接拿上次的结果。突然觉得这个例子不好。

cclovezbf的博客 7886

智能客服系统知识库构建:长尾问题解决方案全解析

智能客服系统知识库构建:长尾问题解决方案全解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4112

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)

本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。

weixin_28487433的博客 389

MySQL创建视图(CREATE VIEW)

创建视图是指在已经存在的MySQL数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。 基本语法 可以使用 CREATE VIEW 语句来创建视图。 语法格式如下: CREATE VIEW <视图名> AS <SELECT语句> 语法说明如下。 <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。 <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。 对于创建视图中..

renxingzhadan的专栏 5074

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错

leboxy的博客 4153

使用with 创建视图

语法 : create view as with a as () , select * from a ;CREATE VIEW pms_work_hour_viewAS WITH t AS (SELECT id, create_name AS name, project_numbe...

weixin_30794499的博客 1150

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1543

DBeaver配置本地mysql-connector驱动文件

本文摘要:介绍了数据库驱动管理的基本操作步骤:1)新建驱动管理器,填写MySQL驱动名称、类名和类型;2)添加本地MySQL驱动文件;3)创建数据库连接并测试。适用于MySQL5.x和8.x版本,帮助用户快速配置数据库连接。

litlit023的专栏 1686

SQL 视图

SQL 视图相关

Alkali!的博客 1321

二、CANdelaStudio入门-版本介绍

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个版本,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YOCANdelaStudio——诊断需求定义工具,诊断协议开发软件 ①用户以模板概念为导向

诊断协议那些事儿's blog 1308

mysql视图 create view 视图名 as sql语句

视图 定义 一种虚拟存在的表,行和列的数据来自于视图中的查询所用的表,并且是使用视图的时候动态生成的,只保存sql逻辑,不保存结果 视图:是虚拟的表,和普通的表一样,通过表,动态生成新数据 1视图的使用场景 在不同的使用场景下,比如商品展示的,商品列表,商品详情,可能会用到相同的业务逻辑,而且这个逻辑写出的sql语句特别的麻烦,没有必要重复书写多次,可以使用视图,一次创建,下一次使用相同的逻辑的时候,使用视图。 2 基本的视图格式 create view 视图名 as sql查询语句 示例: 视图格式:

dianxinlaozong的博客 4921

微信公众号 - 最新详细实现H5网页接入微信支付功能,开发移动端、PC端网站集成使用微信支付流程及示例代码,公众号网页利用JS-SDK/JSAPI/H5支付授权唤起微信支付,可脱离微信环境支付或内置浏

微信公众号,微信支付,网页,移动端,h5,扫码支付,二维码付款,手机网页,电脑pc网页生成支付二维码,js-sdk,jsapi,外部浏览器调起微信支付,脱离微信环境,在微信内置浏览器如何进行微信支付,前端H5微信支付,web网站,vue2,vue3,nuxt2,nuxt3,jquery,微信公众号h5支付流程,如何实现,怎么做,回调报错,redirect_uri参数错误,必须部署才能调试吗,怎么不打包发布就能在本机测试,微信H5支付能力,uniapp微信支付,h5页面调起支付,支付没反应,无效,失败,H5页

🏆 前端领域优质创作者 6102

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SQL视图从入门到排错:CREATE VIEW语法、权限与性能优化全解析

在数据库日常开发中,频繁重复的复杂查询语句不仅降低效率,更容易因口径不一致产生数据偏差。视图(View)作为SQL中一种被命名的查询定义,既能让开发人员像操作表一样复用逻辑,又能统一数据口径、隔离底层表结构。理解视图的本质是“保存的SELECT语句”而非物理数据,是掌握其核心价值的前提。通过CREATE VIEW语法可灵活创建、替换视图,但需注意不同数据库(如MySQL、SQL Server、Oracle)在ALGORITHM、SQL SECURITY等参数上的差异。视图能有效控制权限边界,但若嵌套层级过深

weixin_42662293的博客 326

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SQL 基础--> 视图(CREATE VIEW)

--================================ -- SQL 基础--&gt; 视图(CREATE VIEW) --================================ 视图: 从表中抽出来的逻辑上相关的数据集合 视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。 视图将查询的结果作为一个表来使用,因此视图可以被看作是...

数据库天地 198

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL 的 WITH 语法

WITH AS 短语,也叫做子查询部分(subquery factoring),是用来定义一个SQL片断 with t as ( select * from consumer ) select * from t

howeres的博客 4万+

mysql创建视图_mysql视图之创建视图(CREATE VIEW)和使用限制实例详解

本文实例讲述了mysql视图之创建视图(CREATE VIEW)和使用限制。分享给大家供大家参考,具体如下:mysql5.x 版本之后支持数据库视图,在mysql中,视图的几乎特征符合SQL:2003标准。 mysql以两种方式处理对视图的查询:第一种方式,MySQL会根据视图定义语句创建一个临时表,并在此临时表上执行传入查询。第二种方式,MySQL将传入查询与查询定义为一个查询并执行组合查询。m...

weixin_33167915的博客 1297

with grant option 重建table丢失 with admin option

被授权用户可将所获得的权限再次授予其它用户或角色,并且权限的取消是级联的。级联的意思是,如果user_a使用“with grant option”语句将权限又授予了user_b,当管理员回收user_a的权限时,则user_b的权限也会被回收。使用with admin option,被授权用户可将所获得的权限再次授予其它用户或角色,而且取消授权时不级联。解决这个问题也很容易,在给b用户a.t1的授权中增加with grant option。用户b有用户a基表的查询权限,并创建了一个视图,

jnrjian的博客 722

SQL: 视图和表的区别

区别: 1、视图是已经编译好的sql语句。而表不是 2、视图没有实际的物理记录。而表有。 3、表是内容,视图是窗口 4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改 5、表是内模式,试图是外模式 6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安

孤独剑的专栏 2万+

SQL基础系列(六)——视图

1.视图是什么 从SQL的角度来看,视图就是一张表,存在表名、字段列。在SQL语句中,也并不区分实体表和视图。 视图和实体表的区别就在与:是否保存了实际数据。 视图本身是一个不含任何数据的虚拟表,数据库中存放视图的定义(保存好的SELECT语句),而不存放视图对应的数据。 实体表中保存实际数据,使用实体表创建视图后,实体表中的数据发生变化,视图查询出的数据就会发生变化。 从视图中读取数据时,视图会在内部执行对应的SELECT语句,并创建出一张临时表。 2.为什么使用视图 视图保存的是S

weixin_44077468的博客 1万+

Presto 的 CREATE VIEW 语句完全指南:语法、安全模式与实战示例

本文基于 Presto 官方文档 [presto-docs/src/main/sphinx/sql/create-view.rst](https://link.gitcode.com/i/22f2cfb84a29f4d4716ab0699820faa5),系统讲解 Presto 中视图(View)的创建语法、`DEFINER`/`INVOKER` 两种安全模式的差异与配置方法,并结合当前仓库的语法

gitblog_01012的博客 7

mysql 查询view_MySQL之视图(VIEW)

一、MySQL视图简介视图是数据库系统中一种非常有用的数据库对象。MySQL5.0 之后的版本添加了对视图的支持。认识视图视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。视图是从一个、多个表或者视图中导出的表,包含一系列带有名称的数据列和若干条数据行。视图并不同于数据表,它们的区别在于以下几点:视图不是数据库中真实的表,而...

weixin_33268464的博客 5927

SQL语言——视图(view)的作用

什么是试图 视图是一张虚拟表,封装了底层与数据表的接口,相当于一张表或多张表的数据结果集。是一种允许用户通过视图访问数据的安全机制。

weixin_37861936的博客 5946

HIVE【WITH AS、子查询、视图】的区别

【子查询、with as、视图】3者的区别 在MySQL中,with as和子查询差不多,新版本可以用with as但旧版本不行 with as语法可读性更高 在MySQL中,视图和子查询有巨大区别 在HIVE中,【子查询、视图、with as】三者区别不大,都能嵌套 本人使用HIVE对3种写法进行测试 速度:视图最慢,但3者速度差几乎可以忽略不计 表名能否重用:只有视图可以 是否缓存:都不 建议用with as和视图;表名需要重用就用视图,不重用则用with as

ArYe 2475
上一篇: SQL难点对比分析:COUNT(IF) 和 SUM(IF)的区别
下一篇: SQL 数字排序问题:按照数字大小排序而不是字母顺序
Robin_Pi
博客等级 码龄9年 2万+粉丝 632原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值