SQL, DISTINCT 여러 컬럼 사용하는 경우 조회 결과
- Database
- 2022. 5. 4.
distinct
는 컬럼의 중복을 제거하는 SQL문입니다. 하나의 컬럼에 distinct를 사용할 때는 해당 컬럼의 중복을 제거합니다. 그런데 아래 예시처럼 여러 개의 컬럼에 distnct를 적용하면 어떻게 조회할까요?
select distinct colum1, colum2, colum3 ... from orders
혹시 colum1의 중복을 제거하기 위해 colum2의 조회되어야 할 데이터가 제거되는 건 아닐까요? 아닙니다. 모든 컬럼을 고려해서 조회하기 때문에 그런 일은 일어나지 않으며, 튜플 전체 값이 동일한 경우에 한해서 중복을 제거합니다.
예제는 w3리소스를 참고했습니다.
Ex) 테이블 : orders
ORD_NUM ORD_AMOUNT ADVANCE_AMOUNT ORD_DATE CUST_CODE AGENT_CODE ORD_DESCRIPTION
---------- ---------- -------------- --------- --------------- --------------- -----------------
200114 3500 2000 15-AUG-08 C00002 A008
200122 2500 400 16-SEP-08 C00003 A004
200118 500 100 20-JUL-08 C00023 A006
200119 4000 700 16-SEP-08 C00007 A010
200121 1500 600 23-SEP-08 C00008 A004
200130 2500 400 30-JUL-08 C00025 A011
200134 4200 1800 25-SEP-08 C00004 A005
200108 4000 600 15-FEB-08 C00008 A004
200103 1500 700 15-MAY-08 C00021 A005
200105 2500 500 18-JUL-08 C00025 A011
200109 3500 800 30-JUL-08 C00011 A010
200101 3000 1000 15-JUL-08 C00001 A008
200111 1000 300 10-JUL-08 C00020 A008
200104 1500 500 13-MAR-08 C00006 A004
200106 2500 700 20-APR-08 C00005 A002
200125 2000 600 10-OCT-08 C00018 A005
200117 800 200 20-OCT-08 C00014 A001
200123 500 100 16-SEP-08 C00022 A002
200120 500 100 20-JUL-08 C00009 A002
200116 500 100 13-JUL-08 C00010 A009
200124 500 100 20-JUN-08 C00017 A007
200126 500 100 24-JUN-08 C00022 A002
200129 2500 500 20-JUL-08 C00024 A006
200127 2500 400 20-JUL-08 C00015 A003
200128 3500 1500 20-JUL-08 C00009 A002
200135 2000 800 16-SEP-08 C00007 A010
200131 900 150 26-AUG-08 C00012 A012
200133 1200 400 29-JUN-08 C00009 A002
200100 1000 600 08-JAN-08 C00015 A003
200110 3000 500 15-APR-08 C00019 A010
200107 4500 900 30-AUG-08 C00007 A010
200112 2000 400 30-MAY-08 C00016 A007
200113 4000 600 10-JUN-08 C00022 A002
200102 2000 300 25-MAY-08 C00012 A012
distinct를 사용하지 않고 조회 해보겠습니다.
SELECT agent_code, ord_amount, cust_code, ord_num
FROM orders
WHERE agent_code='A002';
결과 : 각 컬럼의 중복되는 내용이 모두 표시됩니다.
AGENT_CODE ORD_AMOUNT CUST_CODE ORD_NUM
---------- ---------- ---------- ----------
A002 2500 C00005 200106
A002 500 C00022 200123
A002 500 C00009 200120
A002 500 C00022 200126
A002 3500 C00009 200128
A002 1200 C00009 200133
A002 4000 C00022 200113
2개의 컬럼 agent_code,ord_amount에 대해 distinct를 사용해보겠습니다.
SELECT DISTINCT agent_code,ord_amount
FROM orders
WHERE agent_code='A002';
결과 : ord_amount에서 중복된 값은 제외됐습니다. WHERE 절로 A002만 조회하는 조건을 걸었기 때문에 사실상 ord_amount 한 컬럼에 대한 중복 제외 적용입니다.
AGENT_CODE ORD_AMOUNT
---------- ----------
A002 3500
A002 1200
A002 4000
A002 500
A002 2500
이번엔 agent_code, ord_amount, cust_code 세 개 컬럼에 distinct를 사용해보겠습니다.
SELECT DISTINCT agent_code, ord_amount, cust_code
FROM orders
WHERE agent_code='A002';
결과 : 보이는 바와 같이 튜플의 전체 값이 중복되지 않는 선에서 각각의 컬럼이 중복을 최소화해 조회됩니다.
AGENT_CODE ORD_AMOUNT CUST_CODE
---------- ---------- ----------
A002 500 C00022
A002 3500 C00009
A002 2500 C00005
A002 500 C00009
A002 4000 C00022
A002 1200 C00009
테이블에 중복이 없으면 굳이 distinct를 이용할 이유는 없습니다. 오히려 쿼리문 성능에 안 좋은 영향을 주기 때문입니다.
예제 출처
반응형
'Database' 카테고리의 다른 글
MYSQL, FOREIGN_KEY_CHECKS 사용 방법, 주의사항 (0) | 2022.08.13 |
---|---|
MYSQL / MariaDB, ROWNUM 사용 방법 (사용자 정의 변수 @) (0) | 2022.08.07 |
MYSQL, grant all privileges 뜻과 주의사항 (0) | 2022.04.28 |
MYSQL, AS와 CASE WHEN 구문 사용법 (0) | 2022.04.27 |
DATABASE, TABLE, USER 차이와 구분 (0) | 2022.04.23 |