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
相關文章
- postgresql 聚合的暗坑SQL
- HTTP 規範中的那些暗坑HTTP
- Zuul中聚合Swagger的坑ZuulSwagger
- PostgreSQL與Rust的聚合實現比較SQLRust
- PostgreSQL 對陣列元素聚合(qbit)SQL陣列
- callback 和 promise 的錯誤捕獲-暗坑集錦Promise
- PostgreSql安裝教程(填坑版!)SQL
- 筆記:Node.js Postgresql踩坑筆記Node.jsSQL
- 整合Atomikos、Quartz、Postgresql的踩坑日記quartzSQL
- PostgreSQL利用編譯器extension支援int128,提升聚合效能SQL編譯
- 暗夜模式模式
- 【網路安全】什麼是暗網?暗網的特點是什麼
- PostgreSQL 原始碼解讀(187)- 查詢#103(聚合函式#8 - Struct Review)SQL原始碼函式StructView
- PostgreSQL 原始碼解讀(184)- 查詢#100(聚合函式#5-simplehash)SQL原始碼函式
- PostgreSQL 原始碼解讀(181)- 查詢#97(聚合函式#2-ExecInitAgg)SQL原始碼函式
- PostgreSQL 原始碼解讀(182)- 查詢#98(聚合函式#3-ExecAgg)SQL原始碼函式
- PostgreSQL 原始碼解讀(183)- 查詢#99(聚合函式#4-ExecAgg)SQL原始碼函式
- 高德聚合叫車兩宗罪:撇清安全責任,低價“坑慘”司機
- PostgreSQL 原始碼解讀(188)- 查詢#104(聚合函式#8 - ExecAgg Review)SQL原始碼函式View
- PostgreSQL 原始碼解讀(185)- 查詢#101(聚合函式#6-simplehash)SQL原始碼函式
- 聚合
- i聚合:資料是聚合支付背後的“金礦”
- elasticsearch 聚合之 date_histogram 聚合ElasticsearchHistogram
- MongoDB的聚合筆記MongoDB筆記
- PostgreSQL 原始碼解讀(178)- 查詢#95(聚合函式)#1相關資料結構SQL原始碼函式資料結構
- Java 8的Lambda表示式的陰暗面Java
- PL/SQL中char型別的暗門SQL型別
- 易語言3.5很暗的暗樁分析:)
- PostgreSQL-PostgreSQL中的public(九)SQL
- es筆記七之聚合操作之桶聚合和矩陣聚合筆記矩陣
- Elasticsearch 聚合Elasticsearch
- mongodb聚合MongoDB
- 聚合類
- Python影像暗水印新增Python
- 【PostgreSQL 】PostgreSQL 15對distinct的優化SQL優化
- 聚合支付代理如何去推廣聚合碼?!
- Elasticsearch聚合學習之二:區間聚合Elasticsearch
- 我對聚合根的理解