2011-09-13 6 views
4

내가 유지 관리하는 일부 레거시 코드가 있는데 거기에 SQL 쿼리가있어 이해가 안됩니다. 나는 여기 누군가가 나에게 이것의 목적을 설명 할 수 있기를 바라고있다. 쿼리는 다음과 같습니다 : 나는 끝에 group by null없이이 쿼리를 실행하면MySQL "GROUP BY NULL"은 무엇을합니까?

select * from product_performance 
where merchantid = 2151277 and clickday >= '2011-09-01' 
group by null; 

, 나는 44 개 행을 얻을. group by null으로 실행하면 1 행을 얻습니다. 이전 행의 첫 번째 행입니다. 여기서 무슨 일이 일어나고 있으며이 그룹을 사용하는 목적은 무엇입니까?

답변

7

전체 쿼리를 상수 값으로 그룹화하여 결과 행을 무작위로 선택하여 반환합니다. LIMIT 1을 사용하면 동일한 결과를 얻을 수 있습니다.

이 관용구는 표준 SQL이 아니므로 다른 데이터베이스에서이 관용구를 사용하면 오류가 발생할 수 있습니다. MySQL에서는 ONLY FULL GROUP BY SQL 모드를 지정하여이 동작을 비활성화 할 수 있습니다. 자세한 내용은 the documentation을 참조하십시오.

OTOH, LIMIT 1도 비표준이지만보다 광범위하게 지원되며 FETCH ... ONLY 절을 사용하여 SQL : 2008과 호환되는 데이터베이스에서 동일한 효과를 얻을 수 있습니다. 자세한 내용은 this을 참조하십시오.

0

도니는 다르게, 은의이 모드에 대해 설명하자 당신이

select emp_id, dept_id 
from employees 
group by dept_id 

가있을 경우 모든 departament에 대한 하나의 행, 한 EMP_ID,하지 보장을받을 수 있습니다. 즉, 큰 데이터가 departaments에서 spitted 것을 의미합니다.

촬영할 경우

select emp_id, dept_id 
from employees 
group by dept_id, emp_id 

당신거야 depts과 한 EMP에 의해 분할 할 수 데이터.

그러나 group by null 인 경우 은 아무 것도 분할하지 않음을 의미합니다. 그룹이 하나 있습니다. 그리고 mysql은 emp_id와 dept를 줄 것이지만, 어떤 행으로부터 보장받을 수는 없다.