绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
PostgreSQL带子句
2020-05-08 11:19:56

在PostgreSQL中,WITH子句提供了一种编写辅助语句的方法,刹车在更大的查询中使用。

这些语句通常称为通用表表达式(Common Table Express,CTE),也可以当做一个为查询而存在的临时表。

WITH子句是在多次执行子查询时特别有用,允许我们在查询中通过它的名称(可能是多次)引用它。

WITH子句在使用前必须先定义。

语法

与查询的基础语法如下:


   name_for_summary_data AS
      SELECT语句)
   SELECT
   来自name_for_summary_data
   条件<=>(
      SELECT
      来自name_for_summary_data
   [ORDER BY栏]

name_for_summary_data是WITH子句的名称,name_for_summary_data可以与现有的表名相同,并且具有优先级。

可以在WITH中使用数据INSERT,UPDATE或DELETE语句,允许您在同一个查询中执行多个不同的操作。

与递归

在WITH子句中可以使用自身输出的数据。

公用表表达式(CTE)具有一个重要的优点,那就是能够引用其自身,从而创建递归CTE。递归CTE是一个重复执行初始CTE以返回数据子集直到获取完整结果集的公用表表达式。

实例

创建COMPANY表(下载COMPANY SQL文件),数据内容如下:

runoobdbselect * from COMPANY;
 id | 名称| 年龄| 地址| 薪水
---- + ------- + ----- + ----------- + --------
  1 | 保罗| 32 | 加利福尼亚| 20000
  2 | 艾伦| 25 | 德州| 15000
  3 | 泰迪 23 | 挪威| 20000
  4 | 马克| 25 | 富蒙德| 65000
  5 | 大卫| 27 | 德州| 85000
  6 | 金| 22 | 南厅| 45000
  7 | 詹姆斯| 24 | 休斯顿| 10000
7列)

下面将使用WITH子句在上表中查询数据:

CTE AS
(选择
 ID
 名称
年龄
 地址
,薪水
来自公司)
选择*从CTE

得到结果如下:

id | 名称| 年龄| 地址| 薪水
---- + ------- + ----- + ----------- + --------
  1 | 保罗| 32 | 加利福尼亚| 20000
  2 | 艾伦| 25 | 德州| 15000
  3 | 泰迪 23 | 挪威| 20000
  4 | 马克| 25 | 富蒙德| 65000
  5 | 大卫| 27 | 德州| 85000
  6 | 金| 22 | 南厅| 45000
  7 | 詹姆斯| 24 | 休斯顿| 10000
7列)

接下来让我们使用RECURSIVE关键字和WITH子句编写一个查询,查找SALARY(工资)细分小于20000的数据并计算它们的和:

递归tnAS
   值(
   全联盟
   从工资<20000的公司中选择工资

t中选择sumn);

得到结果如下:

 
-------
 25000
1列)

下面我们建立一张表和COMPANY表相似的COMPANY1表,使用DELETE语句和WITH子句删除COMPANY表中SALARY(工资)大于等于30000的数据,删除删除的数据插入COMPANY1表,实现将COMPANY表数据转移到COMPANY1表中:

创建表公司1(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   地址字符(50),50 ),
   工资真实
););


与moved_rows AS(
   从公司删除
   哪里
      工资> = 30000> = 30000 
   返回**
插入到COMPANY1(选择*从moved_rows选择* 来自moved_rows

得到结果如下:

插入0 30 3 

此时,CAMPANY表和CAMPANY1表的数据如下:

runoobdb =#SELECT * FROM COMPANY;=#SELECT * FROM COMPANY ;
 id | 名称| 年龄| 地址| 薪水| 名称   | 年龄|   地址    | 薪水
---- + ------- + ----- + ------------ + ------------ + ------- + ----- + ------------ + --------
  1 | 保罗| 32 | 加利福尼亚| 200001 | 保罗| 32 | 加利福尼亚| 20000           
  2 | 艾伦| 25 | 德州| 150002 | 艾伦| 25 | 德州| 15000               
  3 | 泰迪 23 | 挪威| 200003 | 泰迪| 23 | 挪威| 20000              
  7 | 詹姆斯| 24 | 休斯顿| 100007 | 詹姆斯| 24 | 休斯顿| 10000             
(4列)4 


runoobdb =#SELECT * FROM COMPANY1;
 id | 名称| 年龄| 地址| 薪水
---- + ------- + ----- + ------------- + --------
  4 | 马克| 25 | 富蒙德| 65000
  5 | 大卫| 27 | 德州| 85000
  6 | 金| 22 | 南厅| 45000
3列)
分享好友

分享这个小栈给你的朋友们,一起进步吧。

华山论剑
创建时间:2019-02-22 18:53:00
没了烟火气,人生就是一段孤独的旅程·····于是,在ITPUB,我们以武论英雄!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 栈栈
    栈主
  • ?
    嘉宾

小栈成员

查看更多
  • u_9a3ed7a37f8e4a
  • daisyplay
  • boss_ch
  • Jack2k
戳我,来吐槽~