백엔드/SQL 첫걸음

7. 복수의 테이블 다루기

smallsilver_west 2024. 11. 2. 21:59

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