distinct 연산은 정말 유니크한 키 값만을 뽑아내기 위해서 사용되는 것이고, group by 연산은 집합 연산으로 집합 키 컬럼을 기준으로
집합 연산을 위해서 사용되는 것입니다.
따라서 distinct는 집합 연산을 수행 할 수가 없습니다.
참고 사이트 : http://vvonepiece.tistory.com/6
DISTINCT 와 GROUP BY의 차이를 검색해서 가장 이해가 쉬운 글이 있길래 퍼왔음.
DISTINCT는 주로 UNIQUE한 컬럼이나 튜플(레코드)을 조회하는 경우 사용되며,
GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용되는 쿼리 형태이다.
하지만 두 작업은 조금만 생각해보면 동일한 형태의 작업이라는 것을 쉽게 알 수 있으며,
일부 작업의 경우 DISTINCT로 동시에 GROUP BY로도 처리될 수 있는 쿼리들이 있다.
그래서 DISTINCT를 사용해야 할지, GROUP BY를 사용해서 데이터를 조회하는 것이
좋을지 고민되는 경우들이 가끔 있다.
간단하게 아래 예를 살펴 보자
1. SELECT DISTINCT fd1 FROM tab;
2. SELECT DISTINCT fd1, fd2 FROM tab;
위의 두개 쿼리는 간단히 GROUP BY로 바꿔서 실행할 수 있다.
1. SELECT fd1 FROM tab GROUP BY fd1;
2. SELECT fd1, fd2 FROM tab GROUP BY fd1, fd2;
그렇다면 이 예제의 쿼리에서 DISTINCT와 GROUP BY 는 어떤 부분이 다를까 ?
사실 이런 형태의 DISTINCT는 내부적으로 GROUP BY와 동일한 코드를 사용한다.
즉, 동일한 처리를 하게 된다는 것이다.
하지만 더 중요한 차이가 있다.
DISTINCT의 결과를 정렬된 결과가 아니지만, GROUP BY는 정렬된 결과를 보내준다.
GROUP BY의 작업을 크게 "그룹핑" + "정렬"로 나누어서 본다면, DISTINCT는 "그룹핑" 작업만
수행하고 "정렬" 작업은 수행하지 않는 것이다.
그런데, 여기서 "정렬"은 "그룹핑" 과정의 산물이 아닌 부가적인 작업이다.
최종적으로, 이 예제의 DISTINCT와 GROUP BY는 일부 작업은 동일하지만 GROUP BY는
"정렬"을 하기 위한 부가적인 작업을 더 하게 된다.
만약 "정렬"이 필요하지 않다면 DISTINCT를 사용하는 것이 성능상 더 빠르다고 볼 수 있다.
하지만, GROUP BY를 사용하는 경우에는 정렬을 하지 않도록 유도할 수 있다.
(자세한 내용은 "GROUP BY의 Filesort 작업 제거"를 참조)
참고로
GROUP BY와 DISTINCT는 각자 고유의 기능이 있다.
DISTINCT로만 가능한 기능
1. SELECT COUNT(DISTINCT fd1) FROM tab;
-- // 이런 형태의 쿼리는 서브 쿼리를 사용하지 않으면 GROUP BY로는 작성하기 어렵다.
GROUP BY로만 가능한 기능
1. SELECT fd1, MIN(fd2), MAX(fd2) FROM tab GROUP BY fd1;
-- // 이렇게 집합함수(Aggregation)가 필요한 경우에는 GROUP BY를 사용해야 한다.
<<주의사항>>
가끔 어떤 사용자는 DISTINCT가 마치 함수인 것처럼 (괄호를 사용하여) 아래와 같이 사용을 하는데 만약 fd1 컬럼은 unique 값, fd2는 전체 값을 원한다면 절대 그 결과를 얻을 수 없다.
SELECT DISTINCT(fd1), fd2 FROM tab;
SELECT 문장에 DISTINCT라는 키워드가 있으면, MySQL은 SELECT되는 모든 컬럼(튜플)들에 대해서 DISTINCT를 적용해서 결과를 보내주게 된다.
위와 같은 요건을 처리하기 위해서도 아래와 같이 GROUP BY로만 해결할 수 있다.
SELECT fd1, fd2 FROM tab GROUP BY fd1;
출처 http://intomysql.blogspot.com/2011/01/distinct-group-by.html
따라서 distinct는 집합 연산을 수행 할 수가 없습니다.
참고 사이트 : http://vvonepiece.tistory.com/6
DISTINCT 와 GROUP BY의 차이를 검색해서 가장 이해가 쉬운 글이 있길래 퍼왔음.
DISTINCT는 주로 UNIQUE한 컬럼이나 튜플(레코드)을 조회하는 경우 사용되며,
GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용되는 쿼리 형태이다.
하지만 두 작업은 조금만 생각해보면 동일한 형태의 작업이라는 것을 쉽게 알 수 있으며,
일부 작업의 경우 DISTINCT로 동시에 GROUP BY로도 처리될 수 있는 쿼리들이 있다.
그래서 DISTINCT를 사용해야 할지, GROUP BY를 사용해서 데이터를 조회하는 것이
좋을지 고민되는 경우들이 가끔 있다.
간단하게 아래 예를 살펴 보자
1. SELECT DISTINCT fd1 FROM tab;
2. SELECT DISTINCT fd1, fd2 FROM tab;
위의 두개 쿼리는 간단히 GROUP BY로 바꿔서 실행할 수 있다.
1. SELECT fd1 FROM tab GROUP BY fd1;
2. SELECT fd1, fd2 FROM tab GROUP BY fd1, fd2;
그렇다면 이 예제의 쿼리에서 DISTINCT와 GROUP BY 는 어떤 부분이 다를까 ?
사실 이런 형태의 DISTINCT는 내부적으로 GROUP BY와 동일한 코드를 사용한다.
즉, 동일한 처리를 하게 된다는 것이다.
하지만 더 중요한 차이가 있다.
DISTINCT의 결과를 정렬된 결과가 아니지만, GROUP BY는 정렬된 결과를 보내준다.
GROUP BY의 작업을 크게 "그룹핑" + "정렬"로 나누어서 본다면, DISTINCT는 "그룹핑" 작업만
수행하고 "정렬" 작업은 수행하지 않는 것이다.
그런데, 여기서 "정렬"은 "그룹핑" 과정의 산물이 아닌 부가적인 작업이다.
최종적으로, 이 예제의 DISTINCT와 GROUP BY는 일부 작업은 동일하지만 GROUP BY는
"정렬"을 하기 위한 부가적인 작업을 더 하게 된다.
만약 "정렬"이 필요하지 않다면 DISTINCT를 사용하는 것이 성능상 더 빠르다고 볼 수 있다.
하지만, GROUP BY를 사용하는 경우에는 정렬을 하지 않도록 유도할 수 있다.
(자세한 내용은 "GROUP BY의 Filesort 작업 제거"를 참조)
참고로
GROUP BY와 DISTINCT는 각자 고유의 기능이 있다.
DISTINCT로만 가능한 기능
1. SELECT COUNT(DISTINCT fd1) FROM tab;
-- // 이런 형태의 쿼리는 서브 쿼리를 사용하지 않으면 GROUP BY로는 작성하기 어렵다.
GROUP BY로만 가능한 기능
1. SELECT fd1, MIN(fd2), MAX(fd2) FROM tab GROUP BY fd1;
-- // 이렇게 집합함수(Aggregation)가 필요한 경우에는 GROUP BY를 사용해야 한다.
<<주의사항>>
가끔 어떤 사용자는 DISTINCT가 마치 함수인 것처럼 (괄호를 사용하여) 아래와 같이 사용을 하는데 만약 fd1 컬럼은 unique 값, fd2는 전체 값을 원한다면 절대 그 결과를 얻을 수 없다.
SELECT DISTINCT(fd1), fd2 FROM tab;
SELECT 문장에 DISTINCT라는 키워드가 있으면, MySQL은 SELECT되는 모든 컬럼(튜플)들에 대해서 DISTINCT를 적용해서 결과를 보내주게 된다.
위와 같은 요건을 처리하기 위해서도 아래와 같이 GROUP BY로만 해결할 수 있다.
SELECT fd1, fd2 FROM tab GROUP BY fd1;
출처 http://intomysql.blogspot.com/2011/01/distinct-group-by.html
'Note > 그밖에' 카테고리의 다른 글
LEFT OUTER JOIN 시에 ON 절과 WHERE 절에 추가 제약조건 넣는 규칙 (0) | 2011.07.05 |
---|---|
윈도우 사용자계정 없이 부팅하기 (0) | 2011.07.05 |
php 소숫점 처리 (0) | 2011.06.30 |
php 페이지 엑셀로 다운로드 (0) | 2011.06.30 |
php XML 사용 (0) | 2011.06.30 |