介绍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)相关推荐

  1. mysql cte 表不存在_MySQL8.0新特性CTE(Common Table Expression)

    CTE(Common Table Expression)可以认为是派生表(derived table)的替代,在一定程度上,CTE简化了复杂的join查询和子查询,提高了SQL的可读性和执行性能.CT ...

  2. SQLServer中的CTE(Common Table Expression)通用表表达式使用详解

    概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...

  3. 【数据库】CTE(Common Table Expression(公共表表达式))

    公用表表达式(CTE)的定义 公用表达式的定义包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后), 公用表表达式的好处之一是可以在接下来一条 ...

  4. postgresql 数据库 alter table alter column set default 的一些实践

    os: centos 7.4 db: postgresql 10.11 创建表后,有时需要对表进行 set default 或者 drop default 设置. 版本 # cat /etc/cent ...

  5. PostgreSQL CTE语句与materialized

    PostgreSQL with语句功能可谓十分强大,可以优化很多复杂的查询,实现递归等等.不过with虽好,可还是不要乱用. 因为在PG12之前,with语句都是通过将子查询先进行物化,这就导致了一个 ...

  6. postgresql 执行 drop table 后的一些分析

    os: centos 7.4 db: postgresql 10.10 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core ...

  7. 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 ...

  8. 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend pg_constraint

    本文首发于 2015-11-04 15:28:08 前言 本文成文较早,依赖的是 PostgreSQL 9.3 版本,后续内核版本可能不兼容,但核心原理是相通的,可做参考. 表结构 pg_depend ...

  9. postgresql 获取schema,table 信息

    获取schema 信息 SELECT pn.oid AS schema_oid, iss.catalog_name, iss.schema_owner, iss.schema_name FROM in ...

最新文章

  1. jquery的trigger和triggerHandler区别
  2. 中间代码生成器-5-编译原理
  3. oracle loder nextval,ORA-07445: 出现异常错误: 核心转储
  4. kk 服务器信息,手机kk服务器设置
  5. Anaconda 安装
  6. 今年阿里双十一提升广告点击率居然用的是这种算法?!
  7. linux查看编译器的大小端,Linux系统大小端判断
  8. centos安装redis并客户端连接_Linux(Centos)之安装Redis及注意事项
  9. Java继承_这10道Java面试题!大部分的人回答不出来
  10. java整合jdbc数据库连接工具(项目亲测)
  11. 百度定位出现162错误码
  12. CMake Cookbook中文手册
  13. 指派问题中匈牙利算法----Python实现
  14. wcdma码片速率_码片速率 解释
  15. ubuntu中安装微信
  16. android新浪微博改进版
  17. mobaxterm配置Tunneling隧道连接服务器
  18. 管理服务器没有响应怎么办,win10启动windows服务显示服务没有响应控制功能怎么解决...
  19. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-030(red_green)
  20. html里面行高的原理,CSS行高(line-height)及文本垂直居中原理

热门文章

  1. 人体模型若干灵感及想法
  2. 【转帖】【转帖】武侠界潜水多年所见的最强原创,不转一下对不起大家!!!
  3. HBuilder webApp开发(十五)MUI增加自定义icon图标
  4. U8入库单后台查询处理 常用 SQL 语句(持续更新)
  5. MyBatis 、MySQL 、Hibernate、ORM、JDBC
  6. 网络编程之通俗讲解,有了IP地址,为何还要用MAC地址?
  7. python爬取淘宝全部『螺蛳粉』数据,看看你真的了解螺蛳粉吗?
  8. ROS2 机器人操作系统入门和安装以及如何使用 .NET 进行开发
  9. 微积分的需求和基本定理
  10. php上传flv,使用PHP上传.WMV和.FLV