【问题标题】:sql min function and other column for sqlitesql min 函数和 sqlite 的其他列
【发布时间】:2019-03-22 18:29:20
【问题描述】:

对于 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 实现的标准行为?

【问题讨论】:

    标签: mysql sql sqlite


    【解决方案1】:

    结果在 SQLite 中“正确”。 SQLite 扩展了它的功能来支持这些类型的非标准查询。这显然是功能的扩展,我希望它没有这样做。

    查询是非标准的,因为 SELECT (id) 中有一个未聚合的列,但查询是聚合查询(因为 MIN()/MAX())。具有默认设置的最新版本的 MySQL 正确拒绝此查询,因为语法不正确。旧版本的 MySQL 从任意行返回值 id。 SQLite 针对这种特殊情况扩展了 SQL 的定义,并带回了对应于最高或最低薪水的id 的值。

    在这两个数据库中,更好的方法是:

    SELECT user_id, salary as max_salary
    FROM users
    ORDER BY salary DESC
    LIMIT 1;
    

    和:

    SELECT user_id, salary as min_salary
    FROM users
    ORDER BY salary ASC
    LIMIT 1;
    

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2018-01-08
      • 2017-08-06
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多