백엔드/SQL 첫걸음

7장 복수의 테이블 다루기

dlng23 2024. 11. 2. 00:56

31강. 집합 연산

관계형 모델을 채개한 데이터베이스를 관계형 데이버테이스라 부름

 

1. SQL과 집합

데이터베이스에서는 하나의 행이 하나의 요소, 복수의 행을 반환한 결과 전체가 하나의 집합에 해당

 

2. UNION으로 합집합 구하기

합집합 : 집합을 서로 더한 것

 

- UNION

: 합집합을 나타내는 기호 

ex) 집합 A와 B의 합집합 → A ⋃ B

 

⋂ : 교집합을 나타내는 기호

ex) 집합 A와 B의 교집합 → A ⋂ B

 

SQL에서는 합집합을 나타낼 때 ⋃ 기호 대신 UNION 키워드 사용

 

ex)

a
1
2
3

<sample71_a>

a
2
10
11

<sample71_b>

SELECT * FROM sample71_a
UNION
SELECT * FROM sample71_b;
a
1
2
3
10
11

 

두 개의 SELECT 명령을 하나의 명령으로 합치기때문에 세미콜론은 맨 나중에 붙임

SELECT 명령의 실행결과(집합)를 합집합(UNION)으로 계산하여 최종 결과 반환

 

UNION을 이용하면 여러 개의 SELECT 명령을 하나로 묶을 수 있음

각각의 SELECT 명령의 열의 내용은 서로 일치해야 함

 

UNION으로 묶을 때 나열 순서는 합집합의 결과에 영향X

결과는 같으나 결괏값의 나열 순서는 달라질 수 있음

→ ORDER BY를 지정해야 함

 

- UNION을 사용할 때의 ORDER BY

ORDER BY를 지정할 때는 마지막 SELECT 명령에만 지정해야 함

SELECT a FROM sample71_a ORDER BY a # 첫 번재 SELECT 명령에 ORDER BY를 지정할 수 없음
UNION
SELECT b FROM sample71_b;

SELECT a FROM sample71_a
UNON
SELECT b FROM sample71_b ORDER BY b; # 이 경우에도 에러 발생
# 합집합의 결과를 정렬해야 함

SELECT a AS c FROM sample71_a
UNION
SELECT b AS c FROM sample71_b ORDER BY c;

SELECT 명령에서 열 이름이 일치하지 않는 경우 ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시킴

 

- UNION ALL

집합은 중복값이 존재X → UNION 결과도 중복값이 제거되어 있음

중복을 제거하지 않고 싶은 경우 → UNION ALL 사용

UNION의 경우는 기본 동작이 DISTINCT, 모든 결과를 얻고 싶은 경우 ALL을 지정해주어야 함

UNION ALL은 단순히 합치기때문에 중복값이 없는 경우 성능적으로 유리

 

3. 교집합과 차집합

교집합 : INTERSECT

차집합 : EXCEPT (Oracle의 경우 MINUS) 

 

교집합 : 두 개의 집합이 겹치는 부분

차집합 : 집합에서 다른 쪽의 집합을 제거하고 남은 부분

 

차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지 알 수 있음

 

32강. 테이블 결합

테이블 결합 : 여러 개로 나뉜 데이터를 하나로 묶어 결과를 내는 방법

 

1. 곱집합과 교차집합

곱집합 : 두 개의 집합을 곱하는 연산 방법 

'적집합' or '카티전곱 (Cartesian product)' 이라고도 부름

 

- 교차결합(Cross Join)

데이터베이스의 테이블은 집합의 한 종류

SELECT 명령에서 FROM 구에 테이블을 두 개 지정하면 곱집합으로 계산됨

SELECT * FROM 테이블명1, 테이블명2

 

ex) 

SELECT * FROM sample72_x;
x
A
B
C

 

SELECT * FROM sample72_y;
y
1
2
3

 

SELECT * FROM sample72_x, sample72_y;
x y
A 1
B 1
C 1
A 2
B 2
C 2
A 3
B 3
C 3

 

FROM 구에 복수의 테이블을 지정하여 교차결합

 

- UNION 연결과 결합 연결의 차이

UNION으로 합집합을 구했을 경우에는 세로 방향으로 더해짐

FROM 구로 테이블을 결합할 경우에는 가로 방향으로 더해짐

 

2. 내부결합

기본키는 하나의 데이터행을 대표할 수 있는 속성을 가짐

다른 테이블의 데이터를 참조해야 하는 경우, 참조할 테이블의 기본키와 동일한 이름과 자료형으로 열을 만들어서 행을 연결하는 경우가 많음

 

상품코드 상품명 메이커명 가격 상품분류
0001 상품◯◯ ◯◯메이커 100 식료품
0002 상품⨉⨉ ◯◯메이커 200 식료품
0003 상품△△ △△메이커 1980 생활용품
상품코드 입고날짜 재고수
0001 2014-01-03 200
0002 2014-02-10 500
0003 2014-02-14 10

 

원하는 결과)

상품명 재고수
상품◯◯ 200
상품⨉⨉ 500

재고수 테이블과 상품 테이블을 결합해 가로로 나열하고자 함

 

SELECT * FROM 상품, 재고수;

 

상품코드 상품명 메이커명 가격 상품분류 상품코드 재고수
0001 상품◯◯ ◯◯메이커 100 식료품 0001 200
0002 상품⨉⨉ ◯◯메이커 200 식료품 0001 200
0003 상품△△ △△메이커 1980 생활용품 0001 200
0001 상품◯◯ ◯◯메이커 100 식료품 0002 500
0002 상품⨉⨉ ◯◯메이커 200 식료품 0002 500
0003 상품△△ △△메이커 1980 생활용품 0002 500
0001 상품◯◯ ◯◯메이커 100 식료품 0003 10
0002 상품⨉⨉ ◯◯메이커 200 식료품 0003 10
0003 상품△△ △△메이커 1980 생활용품 0003 10

교차결합하여 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE 구로 조건 지정

 

상품코드가 같다는 조건 지정)

SELECT * FROM 상품, 재고수
	WHERE 상품.상품코드 = 재고수.상품코드;
상품코드 상품명 메이커명 가격 상품분류 상품코드 재고수
0001 상품◯◯ ◯◯메이커 100 식료품 0001 200
0002 상품⨉⨉ ◯◯메이커 200 식료품 0002 500
0003 상품△△ △△메이커 1980 생활용품 0003 10

위와 같이 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 '내부 결합(Inner Join)'이라 부름

 

상품분류가 '식료품'이라는 조건 추가)

SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
	WHERE 상품.상품코드 = 재고수.상품코드
    	AND 상품.상품분류 = '식료품';
상품명 재고수
상품◯◯ 200
상품⨉⨉ 500

 

WHERE 구에는 두 개의 조건식이 지정되어 있음

첫 번째 조건식: 교차결합으로 계산된 곱집합에서 원하는 조합을 검색 → 결합조건

두 번째 조건식: 검색 조건

 

3. INNER JOIN으로 내부결합하기

  • FROM 구에 테이블을 복수 지정해 가로 방향으로 테이블을 결합할 수 있음
  • 교차결합을 하면 곱집합으로 계산됨
  • WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색할 수 있음

위와 같은 결합방법 대신 INNER JOIN 키워드를 사용한 결합방법으로 사용할 수 있음

SELECT 상품.상품명, 재고수.재고수
	FROM 상품 INNER JOIN 재고수
      ON 상품.상품코드 - 재고수.상품코드
    WHERE 상품.상품분류 = '식료품';

 

SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건

테이블과 테이블 사이 INNER JOIN 키워드 넣음

WHERE구 대신 ON을 사용하여 결합조건 지정

 

4. 내부결합을 활용한 데이터 관리

A 테이블과 B 테이블을 결합했을 때, A와 B 중 어느 쪽이 하나의 행만 가지는지(일대다, 다대일) or 양쪽 모두 하나의 행을 가지는지(일대일) 등과 같은 '서로 결합하는 테이블 간의 관계' 중요

 

- 외부키

다른 테이블의 기본키를 참조하는 열

 

- 자기결합(Self Join)

테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것

 

5. 외부결합

'어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지'를 변경할 수 있는 결합방법

LEFT JOIN(기준이 되는 테이블을 왼쪽에 기술), RIGHT JOIN(기준이 되는 테이블을 오른쪽에 기술)을 사용해 외부결합

 

 

33강. 관계형 모델

1. 관계형 모델

관계형 모델의 릴레이션(Relation)은 SQL에서 말하는 테이블에 해당

관계형 모델의 릴레이션에는 몇 가지 속성(attribute)이 있음

속성은 SQL에서 말하는 열에 해당

SQL에서의 행은 관계형 모델에서 '튜플(tuple)'이라 불림

 

릴레이션은 튜플의 집합

관계대수 : 릴레이션에 대한 연산이 집합의 대한 연산에 대응된다는 이론

 

- 관계대수의 규칙

  • 하나 이상의 관계를 바탕으로 연산
  • 연산한 결과, 반환되는 것 또한 관계
  • 연산을 중첩 구조로 실행해도 상관x

 

2. 관계형 모델과 SQL

관계대수에서는 자주 사용될 것 같은 릴레이션의 연산 방법을 몇 가지 규정

 

- 합집합

릴레이션끼리의 덧셈 / SQL에서는 UNION에 해당

 

- 차집합

릴레이션끼리의 뺄셈 / SQL에서는 EXCEPT에 해당

 

- 교집합

릴레이션끼리의 공통부분 / SQL에서는 INTERSECT에 해당

 

- 곱집합

릴레이션끼리의 대전표를 조합하는 연산 / SQL에서는 FROM 구에 복수의 테이블을 지정한 경우에 해당

CROSS JOIN으로 교차결합을 하면 곱집합을 구할 수 있음

 

- 선택

튜플의 추출 / 제한이라고도 불림 / SQL에서 WHERE 구에 조건을 지정해 데이터를 검색하는 것에 해당

 

- 투영

속성의 추출 / SQL에서 SELECT 구에 결과로 반환할 열을 지정하는 것에 해당

 

- 결합

릴레이션끼리 교차결합해 계산된 곱집합에서 결합조건을 만족하는 튜플을 추출하는 연산 / SQL에서는 내부결합에 해당

'백엔드 > SQL 첫걸음' 카테고리의 다른 글

8장 데이터베이스 설계  (0) 2024.11.02
6장 데이터베이스 객체 작성과 삭제  (0) 2024.10.12
5장 집계와 서브쿼리  (0) 2024.10.11
4장 데이터의 추가, 삭제, 갱신  (0) 2024.10.05
3장 정렬과 연산  (0) 2024.10.05