2013-03-08 126 views
4

假设我有以下内容的表:MySQL的GROUP BY子句验证

mysql> select * from test; 
+----+------+ 
| id | val | 
+----+------+ 
| 1 | 1 | 
| 2 | 1 | 
| 3 | 1 | 
| 4 | 1 | 
| 5 | 2 | 
| 6 | 2 | 
| 7 | 2 | 
| 8 | 2 | 
+----+------+ 
8 rows in set (0.00 sec) 

mysql> 

现在我运行错误的SQL查询与group by条款并没有对id列中的任意聚集和得到错误的结果:

mysql> select id, val from test group by val; 
+----+------+ 
| id | val | 
+----+------+ 
| 1 | 1 | 
| 5 | 2 | 
+----+------+ 
2 rows in set (0.00 sec) 

mysql> 

可以mysql客户端或可能一些其他工具验证此查询,并发出错误或警告使用group by没有聚合?

+2

+1关注此 – 2013-03-08 12:03:24

回答

7

是的,你可以这样做:

要禁用MySQL的GROUP BY扩展,使ONLY_FULL_GROUP_BY SQL模式。

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY'; 

the documentation here。另外,this section on server modules可能会有所帮助。

+1

+1这应该是默认值。 – eisberg 2013-03-08 12:03:16

1

默认情况下,SQL模式ONLY_FULL_GROUP_BY设置为禁用。这就是为什么你的查询没有抛出异常而运行的原因。如果你不希望这样的行为与起始mysqld使ONLY_FULL_GROUP_BY模式,

设置SQL模式

  • 您可以设置默认的SQL模式--sql-mode =“modes” option,or by sql-mode =“modes” in my.cnf(Unix操作系统)或my.ini(Windows)。模式是用逗号(“,”)字符分隔的不同模式的列表。
  • 通过使用SET [GLOBAL|SESSION] sql_mode='modes'语句来设置sql_mode系统值,您可以在运行时更改SQL模式。例如:
    SET sql_mode = 'ONLY_FULL_GROUP_BY'