对于sqlite,我看到这样的查询返回正确的结果:
CREATE TABLE users(id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
salary INTEGER NOT NULL);
insert into users (user_id, salary) values (1, 42000);
insert into users (user_id, salary) values (2, 39000);
insert into users (user_id, salary) values (3, 50000);
sqlite> SELECT user_id, MAX(salary) FROM users;
3|50000
sqlite> SELECT user_id, MIN(salary) FROM users;
2|39000
但是例如对于mysql来说,它可以通过其他方式工作:
sql min function and other column
并返回1|50000
。
是sqlite扩展,还是在这种情况下是mysql错误,以及SQL实现的这种标准行为?
答案 0 :(得分:3)
在SQLite中结果为 not “正确”。 SQLite扩展了其功能以支持这些类型的非标准查询。显然,这是功能的扩展,我希望它没有做。
查询是非标准的,因为SELECT
(id
中有未聚合的列,但是该查询是聚合查询(由于MIN()
/ {{1} }。具有默认设置的MySQL的较新版本正确地拒绝了该查询,因为它在语法上不正确。较早版本的MySQL从任意行返回MAX()
的值。对于这种特殊情况,SQLite扩展了SQL的定义,并返回与最高或最低薪水相对应的id
值。
在两个数据库中,更好的方法是:
id
和:
SELECT user_id, salary as max_salary
FROM users
ORDER BY salary DESC
LIMIT 1;