ECC/SQL 첫걸음

[SQL] 7. 복수의 테이블 다루기

jiheechoi 2025. 4. 11. 14:32

1. 집합 연산

1) 집합과 SQL

-SELECT 명령을 실행하면 결과로 몇 개의 행이 반환되는데, 이때 반환된 결과 전체를 하나의 집합이라고 생각하면 됨.

  →즉, 데이터베이스에서는 테이블의 행이 집합의 요소에 해당함.

 

2) UNION으로 합집합 구하기

-SQL에서 합집합을 계산할 경우에는 UNION 키워드를 사용함.

SELECT a FROM sample71_a
UNION
SELECT b FROM sample71_b;

   

→UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있음.

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

   →열 이름이 다르더라도 열 개수와 자료형이 일치하면 됨. 

-SELECT 명령들을 UNION 으로 묶을 때 나열 순서는 합집합의 결과에 영향을 주지 않음.

SELECT a FROM sample71_a
UNION
SELECT b FROM sample71_b
UNION
SELECT age FROM sample31;

 

-UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정할 수 없음. 즉, 마지막 SELECT 명령에만 지정할 수 있음. 

-합집합의 결과를 정렬하는 것이기 때문에 ORDER BY 구를 사용하여 정렬할 때에는, 서로 동일한 별명을 붙여 이름을 일치시켜야 함.

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

 

-UNION은 합집합을 구하는 것이므로 두 개의 집합에서 겹치는 부분은 공통 요소가 됨. 

-중복을 제거하지 않고 2개의 SELECT 결과를 그냥 합치고 싶은 경우, UNION ALL을 사용함.

   →DISTINCT나 ALL로 중복제거 여부를 지정할 수 있다는 점은 SELECT 명령과 동일하지만, UNION의 기본동작은 ALL이 아닌 DISTINCT임. 

SELECT a FROM sample71_a
UNION ALL
SELECT b FROM sample71_b;

 

3) 교집합과 차집합

-SQL에서 교집합을 구하려면 INTERSECT를 이용하고, 차집합을 구하려면 EXCEPT를 이용함. (MySQL은 지원 X)

2. 테이블 결합

1) 곱집합과 교차결합

-집합 X 와 집합 Y의 곱집합은 집합 X의 요소에 집합 Y의 각 요소를 붙여 계산하는 것임.

-FROM 구에 복수의 테이블을 지정하면 교차결합을 함. 교차결합은 두 개의 테이블을 곱집합으로 계산함.

SELECT * FROM sample72_x, sample72_y;

 

-UNION으로 합집합을 구하면 세로 방향으로 더해지게 되는 한편, FROM 구로 테이블을 결합할 경우 가로 방향으로 더해지게 됨.

 

2) 내부 결합

-내부 결합이란, 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것임.

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

 

-교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 조건을 '결합조건' 이라고 부름.

 

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

-INNER JOIN으로 두 개 테이블을 가로로 결합할 수 있음. 

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

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

 

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

-코드와 이름을 가지는 테이블로 분할해 관리하면 저장공간을 절약할 수 있음.

-외부키: 다른 테이블의 기본키를 참조하는 열

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

  →자기 자신의 기본키를 참조하는 열을 자기 자신이 가지는 데이터 구조로 되어 있을 경우에 자주 사용함.

SELECT S1.상품명, S2.상품명
 FROM 상품 S1 INNER JOIN 상품 S2
  ON S1.상품코드 = S2.상품코드;

 

5) 외부결합

-결합 방법은 크게 내부결합과 외부결합의 두가지로 구분됨.

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

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

 

-외부결합은 결합하는 테이블 중 어느 쪽을 기준으로 할지 결정할 수 있음.

  →왼쪽 테이블을 기준으로 결합할 때: LEFT JOIN / 오른쪽 테이블을 기준으로 결합할 때: RIGHT JOIN

-구식방법에서의 외부결합(Oracle): FROM 구에 결합 조건을 기술하지 않고 WHERE 구로 결합조건을 지정. 그냥 조건식을 지정하면 내부결합이 되어버리므로 외부결합으로 진행하고 싶은 경우에는 (+) 라는 특수 기호를 붙여서 조건식을 지정함.

SELECT 상품3.상품명, 재고수.재고수
 FROM 상품3.재고수
 WHERE 상품3.상품코드 = 재고수.상품코드 (+)
  AND 상품3.상품분류 = '식료품';

 

3. 관계형 모델

1) 관계형 모델

-관계형 모델의 기본적인 요소는 릴레이션임. 

  →관계형 모델의 릴레이션은 SQL에서 말하는 테이블에 해당됨.

-릴레이션에는 몇가지 속성이 있는데, 이 속성은 속성 이름과 형 이름으로 구성됨.

  →관계형 모델의 속성은 SQL에서 말하는 열에 해당함.

-SQL에서의 행은 관계형 모델에서 튜플이라고 불린다.

-관계대수: 릴레이션은 튜플의 집합이며, 릴레이션에 대한 연산이 집합에 대한 연산에 대응된다는 이론

  →관계대수의 기본규칙

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

2)관계형 모델과 SQL

-합집합: 합집합은 릴레이션끼리의 덧셈을 말함. 

  →SQL에서는 UNION에 해당함.

-차집합: 차집합은 릴레이션끼리의 뺄셈을 말함

  →SQL에서는 EXCEPT에 해당함.

-교집합: 교집합은 릴레이션끼리의 공통부분을 말함.

  →SQL에서는 INTERSECT에 해당함.

-곱집합: 곱집합은 릴레이션끼리의 곱셈을 말함.

  →SQL에서는 FROM구에 복수의 테이블을 지정한 경우 곱집합으로 계산됨.

-선택: 선택은 튜플의 추출을 말하며, 제한이라고 불리기도 함.

  →SQL에서 튜플은 행을 말하기 때문에, WHERE 구에 조건을 지정해 검색하는 것에 해당. 

-투영: 선택은 속성의 추출을 말함.

  →SQL에서 속성은 열을 말하기 때문에, SELECT 구에 결과로 반환할 열을 지정하는 것에 해당함.

-결합: 결합은 릴레이션끼리 교차결합해 계산된 곱집합에서 결합조건을 만족하는 튜플을 추출하는 연산

  →SQL에서는 내부결합에 해당함.