那些年,我写的冷门SQL
发布于2024-01-27 23:33:15,更新于2025-02-08 09:38:16,标签:sql 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog本文基于PostgreSQL
一、单表操作
1.) 更新:更新表中字段A的值为字段B的倍数
1 | update test set money = age * 10 |
2.) 插入:若冲突则更新
以postgresql为例
1 | -- 插入时若冲突则更新 |
id需要添加唯一约束
3.) case when else end
这个应该算是个基操,但是我用的还是比较少。因此记录
1 | select case |
二、多表操作
1.) 更新:从历史表数据提取最新数据更新到实时表
有两张表,一张表是new_info一张表是history_info,现在需要从history_info中,将每条数据的最新值更新到new_info
方式一:子查询。效率低
1 | update new_info as n set |
方式二:多表联动update。效率高
1 | update new_info as n set |
注意要set的值,一定不要使用
.
用法,否则会报错。
2.) 更新:计算Point表所属的Polygon
我有两张表,分别为t_polygon面数据、t_point点数据。现在需要计算出t_point的所属的面。
1 | create table t_polygon( |
常用空间关系函数比较。
函数 | 作用 | 是否允许在边界上 | 关系 |
---|---|---|---|
ST_Intersects(A, B) | 判断 A 和 B 是否相交 | 允许 | 相交即可 |
ST_Covers(A, B) | A 是否完全覆盖 B | 允许 | B 在 A 内部或边界上 |
ST_Contains(A, B) | A 是否严格包含 B | 不允许 | B 只能在 A 内部 |
ST_Within(A, B) | A 是否在 B 内部 | 不允许 | B 严格包围 A |
方式一:子查询
1 | update t_point as d |
方式二:联动update
1 | update t_point as d |
3.) 查询:从历史表中提取出最新最大的数据
我有一张学生成绩单表。结构如下
1 | CREATE TABLE scores ( |
需求:查询出每个学生最近考试成绩最高的那一次,要求将所有字段输出。
实现
1 | with MaxScorePerStudent as ( |
4.) 查询:分片表union成视图,进行数据分析
学生成绩表,每天会将昨天的历史成绩归档到 scores$yyyyMMdd
的表中。
但是,在一些场景中,还是需要将这些分片表合并成视图后,进行数据分析。此处最简单的做法就是 union all
实现。
先了解 union all
与 union
的区别。
特性 | UNION ALL | UNION |
---|---|---|
去重 | 不去除重复行,保留所有行 | 去除重复行,只保留唯一的行 |
性能影响 | 比较低,因为不需要额外的去重操作 | 比较高,因为需要额外的去重操作 |
结果集行数 | 结果集行数等于所有查询结果行数总和 | 结果集行数可能少于所有查询结果行数总和,取决于去重操作 |
使用场景 | 当不需要去重并且需要尽快获取结果时使用 | 当需要合并结果并确保唯一行时使用 |
语法 | SELECT ... FROM ... UNION ALL SELECT ... FROM ... | SELECT ... FROM ... UNION SELECT ... FROM ... |
实现
1 | -- 创建一个函数来动态生成 UNION ALL 查询语句 |
视图会对其引用的基础表进行强连接(strong reference)。这意味着,只要视图存在,引用的基础表就不能被删除,因为视图依赖这些表。
5.) 查询插入:将某表查询出来的数据插入新表
1 | -- 常规的插入语句 |
6.) 删除插入:删除的数据返回为一张新表
1 | -- 将删除的内容,插入到表里 |
打赏