假设我有此表:named = the_table, 其结构为:
PostgreSQL的:
create table the_table (col3 SERIAL, col2 varchar, col1 varchar, PRIMARY KEY(col3));
MySQL:
create table the_table ( col3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col2 varchar(20), col1 varchar(20) )
然后我插入了表格:
INSERT INTO the_table (col2,col1) VALUES ('x','a'), ('x','b'), ('y','c'), ('y','d'), ('z','e'), ('z','f');
现在该表如下所示:
col3 | col2 | col1 ------+------+------ 1 | x | a 2 | x | b 3 | y | c 4 | y | d 5 | z | e 6 | z | f
当我执行此查询时:
select * from the_table group by col2
然后在mysql中,我得到:
1 x a 3 y c 5 z e
在PostgreSQL中,我得到了错误:
ERROR: column "the_table.col3" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: select * from the_table group by col2;
我的问题:
这个错误是什么意思?什么是集合函数?
当它在MySQL中工作时,为什么不能在postgreSQL中工作?
您需要使用AGGREGATE FUNCTION:
聚合函数根据一组输入值计算单个结果。
SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1 FROM the_table GROUP BY col2;
db <> fiddle演示
MySQL对GROUP BY的处理 : 在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的未聚合列
MySQL对GROUP BY的处理 :
在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的未聚合列
和:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个未聚合列中未在GROUP BY中命名的所有值对于每个组都相同时才有用。 服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的
因此,对于没有显式聚合函数的MySQL版本,您可能会得到不确定的值。我强烈建议使用特定的聚合函数。
编辑:
从MySQL处理GROUP BY:
SQL92和更早版本不允许查询,其中选择列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚合列。 如果SQL99和更高版本 在功能上依赖于GROUP BY列 ,则按可选功能T301允许此类非聚合 : 如果name和custid之间存在这种关系,则查询合法。举例来说,如果客户是客户的主键,那就是这种情况。
SQL92和更早版本不允许查询,其中选择列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚合列。
如果SQL99和更高版本 在功能上依赖于GROUP BY列 ,则按可选功能T301允许此类非聚合 : 如果name和custid之间存在这种关系,则查询合法。举例来说,如果客户是客户的主键,那就是这种情况。
例:
SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o JOIN customers AS c ON o.custid = c.custid GROUP BY o.custid;