잠시만 기다려 주세요

     '대통령을 욕하는 것은 민주사회에서 주권을 가진 시민의 당연한 권리입니다. 대통령을 욕하는 것으로 주권자가 스트레스를 해소할 수 있다면 저는 기쁜 마음으로 들을 수 있습니다. - 노무현 -'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (27)  |  여러가지 팁 (1126)  |  추천 및 재미 (166)  |  자료실 (25)  |  
시사, 이슈, 칼럼, 평론, 비평 (1047)  |  끄적거림 (160)  |  문예 창작 (736)  |  바람 따라 (75)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    mariadb, mysql

mariadb, mysql - mysql, mariadb DISTINCT 와 GROUP BY의 차이
이 름 : 바다아이   |   조회수 : 15500         짧은 주소 : https://www.bada-ie.com/su/?911591809546
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
 
| |





      1 page / 2 page
번 호 카테고리 제 목 이름 조회수
38 mariadb, mysql mariadb ... ??? maintained.... . 바다아이 2305
37 mariadb, mysql mariadb, mysql max_connections , ,   .... my.cnf 바다아이 2248
36 mariadb, mysql mariaDB,MYsql , 바다아이 2297
35 mariadb, mysql mariadb, mysql (Character set) (Collation) , .... 바다아이 2693
34 mariadb, mysql mariadb 11.4 root ... 바다아이 2432
33 mariadb, mysql Mysql, mariadb The table '' is full 바다아이 5422
32 mariadb, mysql Mariadb MySQL , mysql mariadb ... , mariadb mysql ... , mariadb , mysql ... 바다아이 4708
31 mariadb, mysql MariaDB , ... 바다아이 6016
30 mariadb, mysql MYSQL Locked , , 바다아이 9517
29 mariadb, mysql MySQL - LOCK , MyISAM , , 바다아이 8727
28 mariadb, mysql mysql Index , 바다아이 11364
27 mariadb, mysql MySQL DB , 바다아이 17565
26 mariadb, mysql mysql, mariadb , , , , left, substring, right, concat 바다아이 14520
현재글 mariadb, mysql mysql, mariadb DISTINCT GROUP BY 바다아이 15501
24 mariadb, mysql mysql 5.x my.cnf 바다아이 12577
23 mariadb, mysql mysql lock , 바다아이 14990
22 mariadb, mysql , MySQL, mariadb , 바다아이 14870
21 mariadb, mysql mysql , , , unixtime 바다아이 19194
20 mariadb, mysql Mysql , Join (Left, Right, Outer, Inner Join) 바다아이 13761
19 mariadb, mysql mariadb, MySQL 17 바다아이 16922
18 mariadb, mysql mysql, mariadb 바다아이 14085
17 mariadb, mysql mysql .. time 바다아이 15655
16 mariadb, mysql Mysql(MariaDB) ? 바다아이 14544
15 mariadb, mysql [MySQL] ,insert 바다아이 14752
14 mariadb, mysql [MySQL] - SQL 바다아이 13910
13 mariadb, mysql MySQL JOIN UPDATE 바다아이 14071
12 mariadb, mysql mysql update 바다아이 14483
11 mariadb, mysql mysql storage engine myisam vs innodb 바다아이 13717
10 mariadb, mysql Mysql Replication Master DB Slave DB 바다아이 14465
9 mariadb, mysql Mysql 바다아이 13870
| |









Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 chrome 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Debian + GoLang + PostgreSQL + Mariadb + PgBouncer + ProxySQL]
서버위치 : San Jose Datacenter  실행시간 : 0.04599
to webmaster... gogo sea. gogo sea.