由于我来自 MSSQL 世界,我很困惑,在查询中发生了什么,你有 group by 子句和 select 中的其他列不通过聚合函数。
当 MySql 执行这样的查询时,我感到震惊
select * from myTable
group by columnThatIsNotPk
或者像这样摆弄 http://sqlfiddle.com/#!9/b30bf5/1
我的问题是:
- 是否有解释我将为 group by 子句中不存在的列获取哪些数据?
- 可以使用这样的查询吗?
- 我会因为这样的查询而失去或获得性能吗?
- MySql 是否像 ACCESS 中的 JetEngine 那样实现 First 和 Last 聚合,不幸的是缺少 MSSQL 引擎中的功能?
关于聚合的问题:见
only_full_group_by
MySQL 5.7.5 新增的。在此之前,您获得了不基于列的列的随机值GROUP BY
。在那之后,语句就出错了(除非你关闭那个标志)。至于是否有性能增益?谁在乎,如果你得到垃圾? 可能永远不会比特定列
SELECT *
更快(除了键入) 。SELECT ...
至于
FIRST
,LAST
, 等“Windowing functions”,MariaDB 10.2 和 MySQL 8.0 都有(但还没有准备好)。有一些解决方法,通常使用LIMIT 1
.如果您要迁移到 MySQL,还需要了解另一件事:Learn about
AUTO_INCREMENT
as a non-drop-in replacementSEQUENCEs
。