[MS-SQL2011강좌] 14. DISTINCT, UNION, UNION ALL 키워드 by 강동운님
프로그램&DB/MS-SQL 2011. 8. 23. 09:16 Posted by Josep.H.S이 내용은 2011년 6월 현재 SQL2011(코드명 Denali) Beta를 기준으로 작성
되었으며 SQL2011(코드명 Denali) 공식버전(RTM) 발표까지 꾸준히 업데이트 예정입니다.
아울러, 현재 Beta버전이지만 강좌를
따라해 보시는데 아무 문제 없으실거에요. 도움 되시길
바랍니다.
==================================================================================================
안녕하세요. 이스트럭 강동운입니다.
이번에는 DISTINCT, UNION,
UNION ALL에 대해서 살펴보도록 하겠습니다.
1.
DISTINCT
DISTINCT 키워드는 중복을 제거하는 명령어 입니다. 중복을 제거하기 때문에 GROUP
BY와 비슷하게 볼 수 있지만 다른 점이 분명히 있습니다.
이제 예제를 통해 살펴보도록 하겠습니다.
예제를 사용하기 위해 데이터를 넣도록 하겠습니다.
USE tempdb GO IF OBJECT_ID('test','U') IS NOT NULL DROP TABLE test GO CREATE TABLE test(number INT NOT NULL, name VARCHAR(10)) GO INSERT INTO test(number, name) VALUES(1, '가') INSERT INTO test(number, name) VALUES(1, '나') INSERT INTO test(number, name) VALUES(1, '다') INSERT INTO test(number, name) VALUES(2, '라') INSERT INTO test(number, name) VALUES(2, '마') INSERT INTO test(number, name) VALUES(2, '바') INSERT INTO test(number, name) VALUES(3, '사') INSERT INTO test(number, name) VALUES(4, '사') INSERT INTO test(number, name) VALUES(5, '가') INSERT INTO test(number, name) VALUES(6, '나') |
기존에 배웠던 number 를 GROUP
BY 로 묶는 방법
SELECT number FROM test GROUP BY number |
하지만 이 경우는 DISTINCT로도 가능합니다.
SELECT DISTINCT number FROM test |
하지만 DISTINCT는 중복을 제거만 할뿐, 중복된 행 수에 대해서는 알 수가 없기 때문에 아래 쿼리는 에러가 발생합니다.
SELECT DISTINCT number , COUNT(*) FROM test 에러!! |
바로 이게 DISTINCT 와 GROUP
BY의 차이라고 보시면 되겠습니다.
2.
UNION 과 UNION
ALL
UNION은 두개 이상의 테이블을 결합할 때 주로 사용합니다. 이는 조인이랑 다소 똑같다고생각을 할 수 있겠지만~! 조인은 반드시(CROSS
JOIN 제외) 두개의 테이블에 공통된 KEY가 있어야 하지만,
UNION은 다른 테이블이라도 나열된 컬럼의 속성이 같다면 합칠 수 있습니다.
예제를 사용하기 위해 데이터를 넣도록 하겠습니다.
USE tempdb GO IF OBJECT_ID('testA','U') IS NOT NULL DROP TABLE testA GO IF OBJECT_ID('testB','U') IS NOT NULL DROP TABLE testB GO CREATE TABLE testA(number INT NOT NULL, name VARCHAR(10)) GO CREATE TABLE testB(idx INT NOT NULL, name VARCHAR(10)) GO INSERT INTO testA(number, name) VALUES(1, '가') INSERT INTO testA(number, name) VALUES(2, '나') INSERT INTO testA(number, name) VALUES(3, '다') INSERT INTO testB(idx, name) VALUES(2, '라') INSERT INTO testB(idx, name) VALUES(3, '마') INSERT INTO testB(idx, name) VALUES(4, '바') INSERT INTO testB(idx, name) VALUES(5, '사') |
TestA 테이블과 TestB 테이블을 만들고 각 데이터를 넣었습니다.
나열되는 컬럼이 다르다면??.. 당연히 에러가 발생합니다.
SELECT number FROM testA UNION SELECT idx, name FROM testB 에러!! |
컬럼명은 다르지만, 타입이 맞고 순서가 맞다면..
SELECT number FROM testA UNION SELECT idx FROM testB
|
testA 테이블에는 1~3,
testB 테이블에는 2~5의 데이터가 들어가 있었지만, 중복이 제거된 1,2,3,4,5만 추가 되있는 것을 볼 수 있습니다.
UNION 으로 두개의 테이블을 결합하게 되면, 중복을 제거하는 연산을 한번 더 수행하기 때문에 그렇습니다.
만약 중복 제거 없이 모두 출력하기 위해서는 어떻게 해야 할까요?
이때 UNION ALL 을 사용하면 됩니다.
SELECT number FROM testA UNION
ALL SELECT idx FROM testB
|
대용량의 테이블끼리 서로 UNION을 시킨다면, 테이블을 결합하고 중복된 행을 제거하기 위한 작업을 내부적으로 또 수행하게 됩니다.
(내부적으로는 데이터를 정렬을 시킨 뒤에 중복을 제거하는 형태로 진행을 합니다.)
결국 결합하는 테이블이 중복되지 않는다고 가정을 하면 불필요한 중복 제거작업을 시키지않기 위해 UNION
ALL 을 사용 하시 것이 좋습니다.
감사합니다.
[출처] SQLER.COM http://www.sqler.com/390126
SQL2011(코드명 Denali) 시리즈 강좌
리스트
[SQL2011강좌] 1. 코드명 Denali 설치
방법
[SQL2011강좌] 2. SSMS 접속 및
간단한 쿼리 실행
[SQL2011강좌] 3. SQL
Server 의 MDF, LDF 그리고 데이터베이스 생성하기
[SQL2011강좌] 4. DDL 1탄: 테이블 생성
[SQL2011강좌] 5. DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011강좌] 6. Primary key와 Unique
제약조건
[SQL2011강좌] 7. DML 1탄
INSERT
[SQL2011강좌] 8. DML 1탄
INSERT(identity 속성)
[SQL2011강좌] 9. Sequence
[SQL2011강좌] 10. pubs, northwind Database 예제 설치
[SQL2011강좌] 11. SELECT(단일 테이블)
[SQL2011강좌] 12. SELECT(JOIN)
[SQL2011강좌] 13. UPDATE, DELETE
절
[SQL2011강좌] 14. DISTINCT,
UNION, UNION ALL 키워드
[SQL2011강좌] 15. ORDER BY, GROUP BY, HAVING
[SQL2011강좌] 16. SubQuery(서브쿼리)
[SQL2011강좌] 17. 뷰에 대한 이해 및 생성, 수정,
삭제
[SQL2011강좌] 18. 저장 프로시저에 대한
이해, 생성, 수정, 삭제
[SQL2011강좌] 19.
인덱스에 대한 이해
[SQL2011강좌] 20.
클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011강좌] 21. 트랜잭션에 대한이해
[SQL2011강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011강좌] 23. 잠금에 대한 이해
[SQL2011강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그 백업)
[SQL2011강좌] 25. 백업과 복구 전략
[SQL2011강좌] 26. 커서란?
SQL2011(코드명 Denali) 시리즈
동영상 강좌 리스트
[SQL2011 동영상 강좌] 1. 코드명 Denali 설치 방법
[SQL2011 동영상 강좌] 2.
SSMS 접속 및 간단한 쿼리 실행
[SQL2011 동영상 강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스
생성하기
[SQL2011 동영상 강좌] 4. DDL 1탄: 테이블 생성
[SQL2011 동영상 강좌] 5.
DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011 동영상 강좌] 6. Primary key와 Unique
제약조건
[SQL2011 동영상 강좌] 7. DML 1탄 INSERT
[SQL2011 동영상 강좌] 8.
DML 1탄 INSERT(identity 속성)
[SQL2011 동영상 강좌] 9. Sequence
[SQL2011 동영상 강좌] 10.
pubs, northwind Database 예제 설치
[SQL2011 동영상 강좌] 11. SELECT(단일 테이블)
[SQL2011 동영상 강좌] 12.
SELECT(JOIN)
[SQL2011 동영상 강좌] 13. UPDATE, DELETE 절
[SQL2011 동영상 강좌] 14.
DISTINCT, UNION, UNION ALL 키워드
[SQL2011 동영상 강좌] 15. ORDER BY, GROUP BY,
HAVING
[SQL2011 동영상 강좌] 16. SubQuery(서브쿼리)
[SQL2011 동영상 강좌] 17.
뷰에 대한 이해 및 생성, 수정, 삭제
[SQL2011 동영상 강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제
[SQL2011 동영상 강좌] 19.
인덱스에 대한 이해
[SQL2011 동영상 강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011 동영상 강좌] 21.
트랜잭션에 대한이해
[SQL2011 동영상 강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011 동영상 강좌] 23.
잠금에 대한 이해
[SQL2011 동영상 강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그
백업)
[SQL2011
동영상 강좌] 25. 백업과 복구 전략
[SQL2011 동영상 강좌] 26. 커서란?
'프로그램&DB > MS-SQL' 카테고리의 다른 글
[MS-SQL2011강좌] 16. SubQuery(서브쿼리) by 강동운님 (0) | 2011.08.23 |
---|---|
[MS-SQL2011강좌] 15. ORDER BY, GROUP BY, HAVING by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 13. UPDATE, DELETE 절 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 12. SELECT(JOIN) by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 11. SELECT(단일 테이블) by 강동운님 (0) | 2011.08.23 |