1. 곱집합과 교차결합
곱집합 : 집합의 연산 방법 중 하나, 카티전곱(Cartesian product)라고도 불림
교차결합(Cross Join)
SELECT * FROM 테이블명1, 테이블명2
SELECT * FROM sample72_x;
SELECT * FROM sample72_y;
SELECT * FROM sample72_x, sample72_y;
FROM구에 테이블 두 개를 지정해 곱집합 구하기
- FROM구에 복수의 테이블을 지정하면 교차결합을 함. 교차결합은 두 개의 테이블을 곱집합으로 계산
UNION의 연결과 결합 연결의 차이
- UNION으로 합집합을 구했을 경우에는 세로 방향으로 더해짐
- FROM 구로 테이블을 결합할 경우에는 가로 방향으로 더해짐
* 결합은 열(가로)방향으로 확대됨!
2. 내부 결합
: 결합 방법으로는 교차결합보다 내부결합이 자주 사용됨
CREATE TABLE 상품(
상품코드 CHAR(4) NOT NULL,
상품명 VARCHAR(30),
메이커명 VARCHAR(30),
가격 INTEGER,
상품분류 VARCHAR(30),
PRIMARY KEY (상품코드)
);
상품 테이블 작성하기
CREATE TABLE 재고수 (
상품코드 CHAR(4),
입고날짜 DATE,
재고수 INTEGER
);
재고수 테이블 작성하기
- 재고수 테이블에서 상품분류가 식료품인 상품의 재고수를 표시하는 경우, 상품코드보다 상품명으로 표시하면 알아보기 쉬울 것
- 재고수 테이블과 상품 테이블을 결합해 가로로 나열하고자 함
SELECT * FROM 상품, 재고수;
상품 테이블과 재고수 테이블을 교차결합하기
- FROM 구에 테이블을 복수로 지정하면 곱집합으로 계산됨
- 이렇게 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE 구로 조건을 지정함 : 상품코드가 같다는 조건필요
SELECT * FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드;
상품코드가 같은 행을 검색하기
- 내부결합: 교차결합으로 계산된 곱집합에서 원하는 조합으로 검색하는 것
SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드
AND 상품.상품분류 = '식료품';
검색할 행과 반환할 열 제한하기
- 상품분류가 '식료품'이라는 조건 필요 : WHERE구에 조건 추가
- 조건 추가할 때는 기존 조건식과 상품분류의 조건식이 모두 참이어야 하므로 AND로 조건식 연결
- 상품명과 재고수만 반환히도록 SELECT 구에 열 지정
- WHERE 구에 두 개의 조건식 저장되어있음
* 첫 번째: 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것
* 두 번째: 결합 조건이 아닌 검색 조건
- 첫 번째 조건식의 조건을 '결합조건'이라 부름
3. INNER JOIN으로 내부결합하기
- 상품 테이블과 재고수 테이블을 이용한 사례를 INNER JOIN을 활용해 바꾸기
SELECT 상품.상품명, 재고수.재고수
FROM 상품 INNER JOIN 재고수
ON 상품.상품코드 = 재고수.상품코드
WHERE 상품.상품분류 = '식료품';
내부결합
SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건
* INNER JOIN으로 두 개 테이블을 가로로 결합할 수 있음!
4. 내부 결합을 활용한 데이터 관리
- 코드와 이름을 가지는 테이블로 분할해 관리하면 저장공간 절약 가능
CREATE TABLE 메이커 (
메이커코드 CHAR(4) NOT NULL,
메이커명 VARCHAR(30),
PRIMARY KEY(메이커코드)
);
메이커 테이블 작성하기
- 상품 테이블에서 메이커명을 메이커코드로 변경해둠
SELECT S.상품명, M.메이커명
FROM 상품2 S INNER JOIN 메이커 M
ON S.메이커코드 = M.메이커코드;
상품 테이블과 메이커 테이블을 내부결합하기
- 테이블에 S, M이라는 별명을 붙임 : SELECT 명령에서 복수의 테이블을 다룰 경우 어느 테이블의 열인지 정확하게 지정해야 하기때문
- 상품 테이블의 메이커코드만을 살펴보면 중복하는 행이 있음 : 기본키 제약은 상품코드에만 적용되어있어 데이터상 제약 위반 X
- 메이커 테이블은 메이커코드에 기본키가 지정되어 있어 중복을 허용하지 않음
- 메이커코드는 유일하게 하나씩만 존재, 중복될 수 없음 : 존재하지 않거나 하나만 존재
외부키 : 다른 테이블의 기본키를 참조하는 열
- 메이커 테이블의 메이커코드는 기본키
- 상품 테이블의 메이커코드는 '외부키'
자기결합(Self Join)
- 테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것
SELECT S1.상품명, S2.상품명
FROM 상품 S1 INNER JOIN 상품 S2
ON S1.상품코드 = S2.상품코드;
상품 테이블을 자기결합하기
- 상품 테이블을 가로로 두 개 나열해 상품코드로 결합
- 자기결합에서는 결합의 좌우가 같은 테이블이 됨 : 구별하기 위해 꼭 별명을 붙여야 함
5. 외부 결합
- '어느 한쪽에만 존재한느 데이터 행을 어떻게 다룰지'를 변경할 수 있는 결합방법
- 상품3 테이블에 상품코드가 0009인 행 추가, 재고수 테이블에는 0009 상품에 대한 데이터 X
- 이 상태에서는 곱집합을 구해도 0009 = 0009가 되는 행은 존재하지 않으므로 내부결합 결과에서는 상품고드가 0009인 상품이 제외됨
SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 INNER JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';
내부결합에서는 상품코드가 0009인 상품이 제외됨
- 이 경우에는 외부결합을 사용하면 됨
- 외부결합은 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있음
상품테이블(결합의 왼쪽)을 기준으로 INNER JOIN대신 LEFT JOIN 사용
SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 LEFT JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';
외부결합으로 상품코드 0009인 상품도 결과에 포함하기
- 재고수 테이블에는 0009에 대한 데이터가 없으므로 NULL로 표시됨
- 상품테이블을 오른쪽에 지정하는 경우나 재고 테이블을 기준으로 삼고 싶다면 RIGHT JOIN을 사용하여 외부결합을 하면된다
* LEFT JOIN ,RIGHT JOIN으로 외부결합을 할 수 있음!
'데이터분석 > SQL' 카테고리의 다른 글
SQL 첫걸음 - 데이터베이스 설계 (0) | 2025.03.07 |
---|---|
SQL 첫걸음 - 관계형 모델 (0) | 2025.03.07 |
SQL 첫걸음 - 집합 연산 (0) | 2025.03.07 |
SQL 첫걸음 - 뷰 작성과 삭제 (0) | 2025.03.07 |
SQL 첫걸음 - 인덱스 구조 & 인덱스 작성과 삭제 (0) | 2025.03.07 |