본문 바로가기

공부방/Spring

[Mysql] order by, group by

특정 Key로 Group by 시 첫번째 데이터를 기준으로 묶이게 된다.
 
1 team_A 토끼 
2 team_A  말 
3 team_A 강아지 

 

위와 같은 데이터로 예를 들면 ’team_A’로 Group By 할 경우 첫번째 데이터를 기준으로
 
 
team_A  토끼 

 

와 같이 묶이게 된다. 이름 순으로 정렬 후 Group By를 하고 싶을 땐 적절하게 Order By 후 진행한다.
 
 
1 team_A 강아지 
2 team_A  말 
3 team_A 토끼 

 

Order By를 이용해 위와 같이 데이터를 정렬 한 후 Group By 를 진행 하면 ’team_A’, ‘강아지’ 로 묶인다.

 
 

 

원하는 데이터를 기준으로 Order By 후 Group By를 하면 되지만 쿼리 실행 순서나 문법 상 Group By를 먼저 수행하게
되므로 아래와 같이 서브쿼리를 이용하여 먼저 정렬 후 Group By를 해줘야 한다.
 
SELECT *                                            
FROM (
    SELECT *
    FROM JOO
    ORDER BY NAME
)
GROUP BY TEAM
 

 

 

 

SELECT *                                            
FROM JOO
ORDER BY NAME
단일 쿼리 조회 할 때와 서브쿼리 안에 넣었을때와 결과값이 달라졌다.
찾아보니 ORDER BY 가 서브쿼리 안에 존재할 경우 성능 이슈로 인해 DBMS가 자동으로 빼는듯 하다...
 
 
 
 

해결 방법

 

서브쿼리 안에 LIMIT 2^64-1(LIMIT의 최대값 = unsigned 64bit-1) 을 추가

SELECT *                                            
FROM (
    SELECT *
    FROM JOO
    ORDER BY NAME
    LIMIT 18446744073709551615
) TB
GROUP BY TB.TEAM

 

SQL Standard에서 규정한 DB Table은 데이터의 순서가 의미를 갖는 것이 아니기 때문에 Sub Query를 실행할지라도

데이터의 본질적인 값의 구조와 정렬이 변하지 않는다고 한다.

 

하지만, Limit을 추가할 경우 데이터의 순서 뿐만 아니라 데이터의 갯수까지도 제한되기 때문에

테이블 내 데이터의 본절적인 내용이 변경되어 서브쿼리의 결과가 원하던 바 대로 설정되는 것이다.