CodeGym /课程 /SQL SELF /为分析创建临时表

为分析创建临时表

SQL SELF
第 59 级, 课程 3
可用

PostgreSQL里的临时表,就是那种用来临时存数据的表,用完自动删(具体看你怎么设置,是session结束还是事务结束)。它们特别适合简化复杂操作、加快查询速度。

想象一下,你在一家米其林三星餐厅当厨师。你不会专门在厨房放一张桌子只给一个沙拉的配料用吧?临时表就像临时操作台:用完就收,不占地方。

优点:

  • 数据隔离:临时表只在你当前的session或事务里能看到,别人根本动不了你的内容。
  • 效率高:可以存中间结果,避免重复跑复杂查询。
  • 干净:session或事务结束后,临时表自动消失,啥都不留。

临时表的创建语法

PostgreSQL用CREATE TEMP TABLE命令,创建临时表又快又方便。

通用语法:

CREATE TEMP TABLE table_name (
    column_name1 data_type constraints,
    column_name2 data_type constraints,
    ...
);
  • TEMP 或 TEMPORARY —— 关键字,表示这是临时表。
  • table_name —— 表名。随便起,但最好有点意义。
  • column_name —— 列名。
  • data_type —— 列的数据类型(比如INTEGER、TEXT、DATE等)。
  • constraints —— 限制,比如NOT NULL、UNIQUE等。

创建一个简单临时表的例子:

CREATE TEMP TABLE temp_sales (
    id SERIAL PRIMARY KEY,
    product_name TEXT NOT NULL,
    sale_date DATE NOT NULL,
    amount NUMERIC(10, 2) NOT NULL
);
  • 这里建了个临时表,用来存销售数据。
  • id字段会自动给每行生成唯一ID。
  • amount字段存带小数点的金额(比如1234.56)。

临时表的使用示例

例子1:保存分析用的中间数据

假设我们有个orders表,里面存着所有订单。现在要按产品类别统计总销售额。与其写个超级复杂的查询,不如先把数据存到临时表里。

先建个临时表:

CREATE TEMP TABLE temp_category_sales (
    category TEXT,
    total_sales NUMERIC(10, 2)
);

填充临时表:

INSERT INTO temp_category_sales
SELECT category, SUM(amount)
FROM orders
GROUP BY category;

现在可以用临时表,比如查出销售额前三的类别:

SELECT *
FROM temp_category_sales
ORDER BY total_sales DESC
LIMIT 3;

例子2:合并不同表的数据

比如我们有两个表:students(学生信息)和enrollments(报名记录)。想把他们的报名数据放一起分析。

先建个临时表:

CREATE TEMP TABLE temp_student_enrollments (
    student_id INTEGER,
    student_name TEXT,
    course_id INTEGER,
    enrollment_date DATE
);

合并数据:

INSERT INTO temp_student_enrollments
SELECT s.id, s.name, e.course_id, e.enrollment_date
FROM students s
JOIN enrollments e ON s.id = e.student_id;

现在分析就很方便,比如统计每个学生报了多少门课:

SELECT student_name, COUNT(course_id) AS enrollment_count
FROM temp_student_enrollments
GROUP BY student_name
ORDER BY enrollment_count DESC;

事务里的临时表

你还可以用ON COMMIT关键字,把临时表的生命周期限定在事务里。

ON COMMIT的几种用法:

  • ON COMMIT DELETE ROWS:事务结束后清空临时表内容。
  • ON COMMIT PRESERVE ROWS:事务结束后保留数据。
  • ON COMMIT DROP:事务结束后直接删掉表。

例子:

CREATE TEMP TABLE temp_analysis (
    category TEXT,
    total_sales NUMERIC(10, 2)
) ON COMMIT DROP;

这样一来,事务一结束,临时表就消失了。

实际意义和使用场景

临时表在真实项目里超有用。举几个场景:

案例:

  1. 业务里的复杂报表:可以反复做复杂计算,把中间结果存起来。
  2. ETL数据准备:临时表经常用在数据抽取、转换、加载(ETL)流程里。
  3. 开发和调试查询:调试SQL时用临时表隔离数据,安全又方便。

比如你要做销售报表,临时表能帮你存总收入、各地区趋势等中间结果,不会影响主数据库结构。

注意事项和常见错误

用临时表基本没啥坑,但还是有几点要注意:

  • 访问限制:临时表只在当前session或事务里能看到,session一结束就没了。
  • 表名冲突:同一个session里,不能建和已有表同名的临时表。
  • 数据丢失:记得在session结束前把需要的数据查出来,不然就没了。
  • 性能问题:如果临时表数据太多,可能会占用不少内存。
2
任务
SQL SELF, 第 59 级, 课程 3
已锁定
用于中间计算的临时表
用于中间计算的临时表
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION