数据库:SQLServer中with as 用法笔记

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: with as 也叫做子查询部分(subquery factoring),可以定义一个SQL段落,该SQL段落可以被整个SQL语句所用到类似于临时表的作用。with as 可以提高你的SQL语句的可读性,也有可以用在在UNION ALL的不同部分,作为提供临时数据的部分。

image_719c6400.png

一、with as 概念介绍

with as 也叫做子查询部分(subquery factoring),可以定义一个SQL段落,该SQL段落可以被整个SQL语句所用到类似于临时表的作用。with as 可以提高你的SQL语句的可读性,也有可以用在在UNION ALL的不同部分,作为提供临时数据的部分。

二、with as 用途

with as对于UNION ALL查询语句非常有用。因为UNION ALL的每个查询部分可能相同,但是如果每个部分都去执行一遍的话,则查询成本很高,如果使用WITH AS段落查询,则只要执行一遍即可。如果with as段落所定义的表名被调用两次以上,则SQLServer会自动将with asS段落所获取的数据放入一个临时表里,如果只是被调用一次,则不会放到临时表里面。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

三、什么是CTE

CTE完整的描述是公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个新特性。CTE可以看作是一个临时的查询结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGESQL语句中被多次引用。使用公用表达式可以让SQL语句更加可读。、

四、CTE有下面四个优点:

1、可以定义递归公用表表达式(CTE)

2、当需要将查询结果集作为视图被多个地方引用时,CTE可以使SQL更加简洁

3、GROUP BY语句可以直接作用于子查询所得的标量列

4、可以在一个语句中多次引用公用表表达式(CTE)

五、CTE语法格式

with table1as(查询语句)select  * from table1示例:withtb1 as(    select name.age,address from person.T_user where name like 'a%')select * from tb1

六、CTE 注意事项

1、CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将查询结果失效。比如:

withtb1 as(    select name.age,address from person.T_user where name like 'a%')select * from T_userselect * from tb1  -- 查询将会失效

2、CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔。

with table1as(CTE_query_definition) , --用逗号分割table2  as(查询语句)...select  * from table1 ,table2
  1. 如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,后面的SQL语句使用的就是数据表或视图了。
withT_user as(    select * from T_user where name='小王')select * from T_user  -- 查询结果为T_user的公共表表达式select * from T_user  --  查询结果为T_user的数据表
  1. CTE 可以引用自身,也可以引用在同一 WITH 子句中预先定义的 CTE。不允许前向引用。
with tb as(select * from T_user where id=2),tb2 as(select * from tb where id=2)select * from tb -- tb2 可以调用tb,不可以反向调用
  1. 不能在 CTE\_query\_definition 中使用以下子句:

(1)COMPUTE 或 COMPUTE BY

(2)ORDER BY(除非指定了 TOP 子句)

(3)INTO

(4)带有查询提示的 OPTION 子句

(5)FOR XML

(6)FOR BROWSE

  1. 如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾。
declare @s nvarchar(3)
set @1 = 100;  -- 必须加分号withtb1 as(    select name.age,address from person.T_user where name like 'a%')select * from tb1

以上是SQLServer中with as 用法介绍,希望能对大家有所 帮助,感兴趣的欢迎交流!

IT技术分享社区

个人博客网站:https://programmerblog.xyz

image_8323443c.png

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
27天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
65 10
|
27天前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
60 11
|
27天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
103 6
|
13天前
|
SQL 调度 数据库
【Database】Sqlserver如何定时备份数据库和定时清除
【Database】Sqlserver如何定时备份数据库和定时清除
23 2
|
7天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
7天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
|
7天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
9天前
|
关系型数据库 MySQL 数据库
Docker数据库Mysql
Docker数据库Mysql
|
9天前
|
存储 SQL 关系型数据库
mysql查询数据库表大小怎么操作
mysql查询数据库表大小怎么操作
|
9天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。