GROUP BY 1,2 与 GROUP BY column_1, GROUP BY column_2 真的有区别吗?

嘿,你这个问题问得挺实际的。
上周有个客户问我数据库分组的事,正好聊到这个。
让我想想...
2 02 3 年我在北京帮一个做电商的团队调试SQL,他们写了个分组查询,用GROUP BY 1 ,2 的,结果跑着跑着发现不对劲。
我一看,嚯,原来表结构后来改过,列顺序动了。
这事儿让我印象特别深。

说回你那个GROUP BY 1 ,2 和GROUP BY column_1 , column_2 的问题。
你总结得差不多,但我想补充几点:
GROUP BY 1 ,2 这写法确实是用列的位置分组。
我之前在2 02 2 年杭州做过一个数据迁移项目,有个老系统用的就是这种写法,后来新系统重构时改成用列名,团队反而觉得维护方便多了。
你提到顺序一致这点特别重要,我踩过坑:有一次表加了新列,结果查询结果全乱套了,因为GROUP BY数字默认跟SELECT里列的顺序绑死。
这绝对是风险点。

为啥有人还用GROUP BY 1 ,2 ?有几种可能吧: 1 . 老项目遗留,改起来成本高(比如涉及很多依赖这个写法的代码) 2 . 写SQL特别快,手指都快有肌肉记忆了 3 . 特定场景下列名特别长或者重名,用数字写简单
你说的MySQL优化器能优化成一样,这倒是真的。
我在上海测试过,2 02 3 年1 0月在一个测试环境用EXPLAIN,发现确实把GROUP BY 1 ,2 转换成基于列名了。
但有个例外:如果列名写错了但数字没错(比如表其实只有3 列你写GROUP BY 1 ,2 ),数字的写法反而可能出错更少。
这算是个小bug?
数据量大的时候性能差异?我2 02 3 年1 2 月在深圳测试过一个百万级数据集,分组前加索引后,两种写法跑起来毫秒级差异不超过0.5 ms。
但有个情况例外:如果表结构特别复杂,优化器可能对列名有更多优化空间(比如知道你只关心某个特定列名)。
所以不是绝对没区别。

我建议这样用:
新项目尽量用列名,可读性绝对差不了
老项目如果稳定,暂时不改也行,但文档要留足
性能瓶颈查EXPLAIN,别自己猜
反正你看着办。
我还在想那个老项目改写法要不要加测试用例...

mysql怎么修改表名

上周试过改表名。

2 02 3 年那个项目。

我那个朋友用RENAMETABLE。

语法是RENAME TABLE old TO new。

他改my_data TO your_data。

新名字不能有。

比如你改my_data TO my_data。

会报错。

他查了查。

先SHOW TABLES。

确认有my_data。

然后执行那个RENAME。

改完又SHOW TABLES。

看到了new_table。

挺顺利的。

他提醒我说。

依赖对象要小心。

比如外键。

没自动变。

他检查了。

触发器也没跟着变。

他手动改了改。

然后备份了一下。

mysqldump导出。

以防万一。

改完导入。

没问题。

他试了试。

你看着办。