31. 집합 연산
SQL과 집합
SELECT 명령을 실행하면 데이터베이스에 질의, 그 결과로 몇 개의 행이 출력되는 과정
이때, 반환된 결과 전체를 하나의 집합으로 보고 집합 내 하나의 행을 하나의 요소로 간주
UNION
집합의 연산 중 '합집합'을 위해 사용하는 명령어
합집합이란 집합을 서로 더하는 것을 의미하며 A∪B와 같이 표현
SQL에서 SELECT 명령의 실행 결과를 하나의 집합으로 다룰 수 있으며 UNION은 다음과 같이 표현
mysql> SELECT * FROM t1;
mysql> SELECT * FROM t2;
mysql> SELECT * FROM t1; UNION SELECT * FROM t2; // 집합의 합집합 연산
* 합집합 시, 동일 행은 한 개만 출력
: 각각의 SELECT 명령의 열의 내용은 서로 일치해야 하며 열 이름은 다르지만 열 개수와 자료형이 서로 같은 경우 일치하는 것으로 간주
ORDER BY
UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬하는 것이 불가능
mysql> SELECT a FROM t1 ORDER BY a
UNION
SELECT b FROM t2; // 에러 발생
* ORDER BY 지정을 원하는 경우 마지막 SELECT 구문에서만 지정
mysql> SELECT a FROM t1
UNION
SELECT b FROM t2 ORDER BY b; // 에러 발생
* 마지막 SELECT 명령이 아닌 합집합의 결과를 정렬하는 경우 열 이름이 일치하지 않을 때 에러 발생
mysql> SELECT a AS col1 FROM t1
UNION
SELECT b AS col1 FROM t2 ORDER BY col1;
* 동일한 별명을 붙여 해당 열을 정렬
: UNION으로 SELECT 명령을 연결하는 경우, 가장 마지막 SELECT 명령에서 통일된 별명을 가진 열을 ORDER BY 명령어로 정렬
UNION ALL
중복값을 제거하지 않고 2개의 SELECT 명령 결과를 그대로 합칠 때 사용 가능한 명령어
mysql> SELECT * FROM t1
UNION ALL
SELECT * FROM t2;
* UNION은 이미 존재하는 값인지 검사를하는 처리가 필요하므로 성능적으로 UNION ALL이 유리
교집합/차집합
현재 교집합과 차집합은 MySQL에서 구현이 불가하지만 SQL에서는 구현 가능
| 교집합: 두 집합이 겹쳐지는 공통 부분을 연산하며 INTERSECT 명령어 사용
| 차집합: 집합에서 다른쪽 집합을 제거하고 남은 부분으로 만약 대상이 되는 두 집합의 공통부분이 없는 경우 차집합을 구해도 결과는 바뀌지 않으며 완전히 같은 두 집합의 차집합은 공집합, EXCEPT 명령어 사용
* Oracle에서는 MINUS 명령어 사용
32. 테이블 결합
곱집합
두 개의 집합을 곱하는 연산 방법으로 '적집합' 또는 '카티전곱(Cartesian Product)' 명칭 사용
ex) 집합 X, Y의 곱집합
집합 X = {A, B, C}, 집합 Y = {1, 2, 3}이라는 요소를 가질 때 집합 X와 Y의 곱집합
A,1 | A,2 | A,3 |
B,1 | B,2 | B,3 |
C,1 | C,2 | C,3 |
교차집합(Corss Join)
SELECT * FROM [table name1, table name2];
- 두 개의 테이블을 곱집합으로 계산하는 것
: UNION으로 합집합을 구하는 경우 세로 방향으로 정해지지만, FROM 구로 테이블을 결합하는 경우에는 가로 방향으로 확대
- SELECT 명령의 FROM 구문에서 테이블 두개를 지정하는 경우 이들은 곱집합으로 계산
: 단, 교차결합의 경우 테이블 수가 많아질 때 조합의 수가 크게 늘어나는 단점
내부결합(INNER JOIN)
SELECT * FROM [table name];
교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것으로 이전에 WHERE 구에 결합조건을 지정하던 것과 달리 ON을 사용해 결합조건을 지정하는 방식
: 두 테이블을 가로로 결합 가능
ex) 상품분류가 '도서'인 상품들의 상품명과 재고수를 표시하는 예제
상품코드 | 상품명 | 가격 | 상품분류 |
00112 | XX도서 | 25,000 | 도서 |
<상품 테이블>
상품코드 | 입고날짜 | 재고수 |
00112 | 2024-11-02 | 105 |
<재고수 테이블>
I) 상품 테이블과 재고수 테이블을 교차결합
II) 상품 테이블의 상품코드와 재고수 테이블의 상품코드가 서로 같은 행을 검색
mysql> SELECT * FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드;
III) 교차결합을 이용해 상품분류 '도서' 조건 추가
IV) 상품명과 재고수만 반환하도록 SELECT 구문에 열을 지정
mysql> SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
WEHRE 상품.상품코드 = 재고수.상품코드 AND 상품.상품분류 = '도서';
* 첫 번째 조건식: 교차결합으로 계산된 곱집합에서 원하는 조건 검색이자 결합 조건
* 두 번째 조건식: 원하는 조건을 검색하는 검색 조건
외부 결합(OUTER JOIN)
교차결합으로 결합 조건을 지정하여 검색하는 사고 방식을 동일하지만 '어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰 것인지' 변경 가능
단, 결합 당하는 테이블에 결합 기준이 되는 테이블과 동일한 값이 없는 경우 NULL로 표시
| LEFT JOIN: 왼쪽 테이블을 기준으로 오른쪽 테이블을 결합
| RIGHT JOIN: 오른쪽 테이블을 기준으로 왼쪽 테이블을 결합
'백엔드 > SQL 첫걸음' 카테고리의 다른 글
8. 데이터베이스 설계 (1) | 2024.11.02 |
---|---|
6. 데이터베이스 객체 작성과 삭제 (0) | 2024.10.12 |
5. 집계와 서브쿼리 (0) | 2024.10.11 |
4. 데이터의 추가, 삭제, 갱신 (0) | 2024.10.05 |
3. 정렬과 연산 (1) | 2024.10.05 |