介绍PostgreSQL CTE(common table expressions)
介绍PostgreSQL CTE(common table expressions)
本文我们学习如何使用PostgreSQL CTE(common table expressions)简化复杂查询。
介绍 common table expressions
PostgreSQL CTE(common table expressions) 是临时结果,可以在其他SQL中引用,如SELECT, INSERT, UPDATE 和 DELETE,其仅存在于查询执行期间。下面显示创建CTE的语法:
WITH cte_name (column_list) AS (CTE_query_definition
)
statement;
- 首先,指定CTE的名称,接着是可选的列字段列表
- 其次,在with子句体内,指定查询作为返回结果集,如果没有显示指定列字段列表,则CTE_query_definition 的select 字段列表将作为CTE的字段列表。
- 第三,在其他SQL语句中可以向使用表或视图一样使用CTE,语句包括SELECT, INSERT, UPDATE 和 DELETE。
CTE一般用于简化复杂join和子查询。
示例
下面通过示例更好说明CTE用法。我们使用sample 示例数据库 中的 film 和 rental 表。
请看示例:
WITH cte_film AS (SELECT film_id, title,(CASE WHEN length < 30 THEN 'Short'WHEN length >= 30 AND length < 90 THEN 'Medium'WHEN length > 90 THEN 'Long'END) length FROM film
)SELECT film_id, title,length
FROM cte_film
WHERE length = 'Long'
ORDER BY title;
我们首先使用with子句定义CTE,命名为cte_film.
WITH cte_film AS (SELECT film_id, title,(CASE WHEN length < 30 THEN 'Short'WHEN length >= 30 AND length < 90 THEN 'Medium'WHEN length > 90 THEN 'Long'END) length FROM film
)
CTE包括两个部分:
- 第一部分定义CTE的名称,这里是cte_film.
- 第二部分定义一个select 语句用于填充表达式.
接着我们在select中使用cte_film,用于返回length 值为 ‘Long’的记录.
join子句中使用CTE
在下面示例中,我们使用rental和staff表,下面语句说明如何join CTE和表:
WITH cte_rental AS (SELECT staff_id, COUNT(rental_id) rental_countFROM rentalGROUP BY staff_id
)
SELECT s.staff_id,first_name,last_name,rental_count
FROM staff sINNER JOIN cte_rental USING (staff_id);
- 首先,我们定义CTE,其staff id 和 租借数量
- 然后,使用 staff_id join staff表 和 CTE
和窗口函数一起使用CTE
下面语句描述如何和rank()窗口函数一起使用CTE:
WITH cte_film AS (SELECT film_id, title, rating, length,RANK() OVER ( PARTITION BY rating ORDER BY length DESC) length_rankFROM film
)
SELECT *
FROM cte_film
WHERE length_rank = 1;
- 首先,我们定义CTE,返回film信息及每个等级根据长度排名信息,别名为length_rank
- 其次,选择length_rank为1的film
总结
使用CTE有以下优点:
- 提升复杂查询的可读性。我们可以使用CTE以更加可读的方式组织复杂查询
- 能够创建递归查询。递归查询是引用自身,当需要查询层次数据如组织或物料清单信息时,使用递归查询很方便。
- 和窗口函数一起使用。通过和窗口函数一起创建初始结果集,然后使用select对结果进一步进行处理。
介绍PostgreSQL CTE(common table expressions)相关推荐
- mysql cte 表不存在_MySQL8.0新特性CTE(Common Table Expression)
CTE(Common Table Expression)可以认为是派生表(derived table)的替代,在一定程度上,CTE简化了复杂的join查询和子查询,提高了SQL的可读性和执行性能.CT ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- 【数据库】CTE(Common Table Expression(公共表表达式))
公用表表达式(CTE)的定义 公用表达式的定义包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后), 公用表表达式的好处之一是可以在接下来一条 ...
- postgresql 数据库 alter table alter column set default 的一些实践
os: centos 7.4 db: postgresql 10.11 创建表后,有时需要对表进行 set default 或者 drop default 设置. 版本 # cat /etc/cent ...
- PostgreSQL CTE语句与materialized
PostgreSQL with语句功能可谓十分强大,可以优化很多复杂的查询,实现递归等等.不过with虽好,可还是不要乱用. 因为在PG12之前,with语句都是通过将子查询先进行物化,这就导致了一个 ...
- postgresql 执行 drop table 后的一些分析
os: centos 7.4 db: postgresql 10.10 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core ...
- postgresql 数据库 alter table alter column set not null 的一些实践
os: centos 7.4 db: postgresql 10.11 创建表后,有时需要对表进行 set not null 或者 drop not null 设置. 版本 # cat /etc/ce ...
- 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend pg_constraint
本文首发于 2015-11-04 15:28:08 前言 本文成文较早,依赖的是 PostgreSQL 9.3 版本,后续内核版本可能不兼容,但核心原理是相通的,可做参考. 表结构 pg_depend ...
- postgresql 获取schema,table 信息
获取schema 信息 SELECT pn.oid AS schema_oid, iss.catalog_name, iss.schema_owner, iss.schema_name FROM in ...
最新文章
- jquery的trigger和triggerHandler区别
- 中间代码生成器-5-编译原理
- oracle loder nextval,ORA-07445: 出现异常错误: 核心转储
- kk 服务器信息,手机kk服务器设置
- Anaconda 安装
- 今年阿里双十一提升广告点击率居然用的是这种算法?!
- linux查看编译器的大小端,Linux系统大小端判断
- centos安装redis并客户端连接_Linux(Centos)之安装Redis及注意事项
- Java继承_这10道Java面试题!大部分的人回答不出来
- java整合jdbc数据库连接工具(项目亲测)
- 百度定位出现162错误码
- CMake Cookbook中文手册
- 指派问题中匈牙利算法----Python实现
- wcdma码片速率_码片速率 解释
- ubuntu中安装微信
- android新浪微博改进版
- mobaxterm配置Tunneling隧道连接服务器
- 管理服务器没有响应怎么办,win10启动windows服务显示服务没有响应控制功能怎么解决...
- 【愚公系列】2021年11月 攻防世界-进阶题-MISC-030(red_green)
- html里面行高的原理,CSS行高(line-height)及文本垂直居中原理
热门文章
- 人体模型若干灵感及想法
- 【转帖】【转帖】武侠界潜水多年所见的最强原创,不转一下对不起大家!!!
- HBuilder webApp开发(十五)MUI增加自定义icon图标
- U8入库单后台查询处理 常用 SQL 语句(持续更新)
- MyBatis 、MySQL 、Hibernate、ORM、JDBC
- 网络编程之通俗讲解,有了IP地址,为何还要用MAC地址?
- python爬取淘宝全部『螺蛳粉』数据,看看你真的了解螺蛳粉吗?
- ROS2 机器人操作系统入门和安装以及如何使用 .NET 进行开发
- 微积分的需求和基本定理
- php上传flv,使用PHP上传.WMV和.FLV