postgresql 聚合的暗坑


--对于聚合操作,pg约束是不严格的,比如如下sql中,group by 缺少 name,但也能执行
postgres=# select id,name ,count(*) from t group by id;
 id | name | count
----+------+-------
  1 | bcd  |     1
  2 | abc  |     1

--现模拟如下
create table t(id int,name varchar(20));
insert into t values(1,'abc'),(2,'bcd');   

--再次执行,不行了,说语法不对
postgres=# select id,name ,count(*) from t group by id;
ERROR:  column "t.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select id,name ,count(*) from t group by id;

--添加主键约束,则能直行成功,说明pg进行了智能判断,在有唯一约束的前提下,当select的非聚合字段比如name是伴随id成对出现的时候,则pg允许
--如下:因为id是唯一的,id与name也是唯一的(两个字段必须是在同一个表中),故pg允许
postgres=# alter table t add primary key(id);
ALTER TABLE
postgres=# select id,name ,count(*) from t group by id;
 id | name | count
----+------+-------
  1 | bcd  |     1
  2 | abc  |     1

--创建t1表
create table t1(id int,name varchar(20));
insert into t1 values(1,'abc'),(2,'bcd');
alter table t1 add primary key(id);
--因为t.id是唯一的,但t.id与t1.name并不是唯一的(两个字段不在同一个表中),所以会把语法错误
postgres=# select t.id,t1.name from t1,t where t1.id=t.id group by t.id;
ERROR:  column "t1.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select t.id,t1.name from t1,t where t1.id=t.id group by t.id...

--而对于mysql,当sql_mode不设置ONLY_FULL_GROUP_BY是,它并不限制group by字段的完整性
mysql> select id,name ,count(*) from t group by id;
+------+------+----------+
| id   | name | count(*) |
+------+------+----------+
|    1 | abc  |        1 |
|    2 | bcd  |        1 |
+------+------+----------+
2 rows in set (0.02 sec)
--设置ONLY_FULL_GROUP_BY
mysql> set sql_mode='ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.11 sec)
--group by 语法不全规范,报错
mysql> select id,name ,count(*) from t group by id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t.name'
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
时间: 2024-09-20 20:51:08

postgresql 聚合的暗坑的相关文章

PostgreSQL 聚合函数讲解 - 4 总体协方差, 样本协方差

1. 数学期望值, 平均值, mean http://zh.wikipedia.org/wiki/%E6%9C%9F%E6%9C%9B%E5%80%BC 表示: E[X], 即X变量的平均值. 也用miu表示 : μ=E[X] PostgreSQL中举例 :  postgres=# select avg(c1) from (values(null),(1),(2)) as t(c1);         avg          --------------------  1.5000000000

PostgreSQL 聚合表达式 FILTER , order , within group 用法

标签 PostgreSQL , 聚合 , filter , order , within group 背景 PostgreSQL的分析功能还是比较强大的,例如支持多维分析,支持4大类聚合,支持窗口查询,支持递归查询等. 4大类聚合的用法请参考 <PostgreSQL aggregate function 1 : General-Purpose Aggregate Functions> <PostgreSQL aggregate function 2 : Aggregate Functio

postgresql 正则暗坑

--注意pg的正则使用不正会有隐患 postgres=# select * from t; id | name ----+------ 1 | bill 1 | bill 1 | bill (3 rows) --注意,由于没有匹配正则,其执行了过滤操作(其是在select字段中,不细看还以为t表中没有数据呐) postgres=# select t.*,regexp_matches(t.name,'rudy','i') from t; id | name | regexp_matches ---

PostgreSQL 聚合函数讲解 - 6 分组排序聚合

分组排序聚合的例子. Table 9-51. Ordered-Set Aggregate Functions Function Direct Argument Type(s) Aggregated Argument Type(s) Return Type Description mode() WITHIN GROUP (ORDER BYsort_expression)   any sortable type same as sort expression returns the most fre

PostgreSQL 聚合函数讲解 - 5 线性回归

首先讲个线性回归分析linear regression (最小二乘法least-squares-fit)的小故事(取自百度) :  1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星.经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置.随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果.时年24岁的高斯也计算了谷神星的轨道.奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星. 高斯使

PostgreSQL 聚合函数讲解 - 1 常用聚合函数

PostgreSQL支持较多的聚合函数, 以PostgreSQL 9.4为例, 支持例如一般性的聚合, 统计学科的聚合, 排序集聚合, 假象集聚合等. 本文将对一般性聚合函数举例说明其功能和用法. 聚合函数有哪些,见 : http://www.postgresql.org/docs/9.4/static/functions-aggregate.html 以上所有聚合函数, 当没有行输入时, 除了count返回0, 其他都返回null. 使用sum, array_agg时, 当没有行输入, 返回N

PostgreSQL 聚合函数讲解 - 3 总体|样本 方差, 标准方差

PostgreSQL自带了一些常用的统计学聚合函数, 非常好用. 本文介绍一下方差和标准差的一些聚合函数. 总体方差 : population covariance 总体标准差 : population standard deviation 样本方差 : sample covariance 样本标准差 : sample standard deviation 均值 : mean 样本均值和样本方差的介绍 : http://en.wikipedia.org/wiki/Sample_mean_and_

PostgreSQL 聚合函数讲解 - 7 窗口反聚合

聚合函数的最后一个分类, Hypothetical-Set Aggregate Functions. 这类聚合函数还有对应的窗口函数, 首先来看一下对应窗口函数的用法. rank() bigint rank of the current row with gaps; same as row_number of its first peer dense_rank() bigint rank of the current row without gaps; this function counts

工控安全要避开传统IT安全思路的几个“暗坑”

很多人都在讲工控系统安全与互联网安全或者办公网的安全又很大的不同. 具体有哪些不同呢? 其实NIST的SP800-82的工控系统安全指南里面讲了10大类. 作为目前我们看到的比较系统的工控系统安全的标准或者指南来说. NIST的这个文件概括的还是比较全面的. 不过, 在实践中,有些重要的不同点NIST并没有提到或者没有强调 而有些NIST的指南则未免有些纸上谈兵. 这里我举几个例子. 安全实施与设备管理在不同部门导致的责任问题 在互联网或者企业网里, 所保护的对象比如服务器,存储,网络设备等的管