본문 바로가기
백엔드/SQL

SQL 7장

by dustnn 2025. 4. 14.
UNION: 합집합

 

"여러 개의 SELECT 문 하나로 묶기"

 

ex. A UNION B = SELECT 명령어 A와 B를 하나로 합치기

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

 

각각의 SELECT 명령의 열 구성(개수&자료형)은 서로 일치해야 함

 

SELECT *FROM sample71_a
UNION
SELECT *FROM sample71_b
UNION
SELECT *FROM sample31;

=> 열 구성이 다르므로 불가능

 

다만, * 쓰지 않고 열을 따로 지정하여 데이터를 서로 맞춰주면 UNION 실행 가능

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

 

 

UNION 사용 시 ORDER BY

 

- 마지막 SELECT 문에만 지정 가능

- SELECT 명령에서 열 이름 서로 일치시켜줄 것

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

 

 

UNION 사용 시 ALL

 

- 디폴트: DISTINCT

- 중복 제거 원치 않을 경우: ALL

(UNION DISTINCT 는 존재x)

SELECT *FROM sample71_a
UNION ALL
SELECT *FROM sample71_b;

 

테이블 결합

 

몇 개의 테이블로 나누어 저장됨 -> 하나로 묶고 싶을 때

 

교차결합(Cross Join)

 

: FROM 구에 두 개 테이블 가능 -> 두 테이블의 곱집합(카티전곱)

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

 

내부 결합

 

: 교차결합으로 계산된 곱집합에서 원하는 조합을 검색

: 테이블 수가 많아지면 교차결합 곤란 -> 내부 결합 사용

 

- 테이블의 데이터는 유일한 값(기본키) 가지는 것이 좋음 -> 대표성 확보

- 다른 테이블 데이터 참조 시, 참조할 테이블의 기본키와 동일한 이름/자료형으로 열을 만들어 행 연결

CREATE TABLE 상품 (
	상품코드 CHAR(4) NOT NULL,
    상춤명 VARCHAR(30),
    메이커명 VARCHAR(30),
    가격 INTEGER,
    상품분류 VARCHAR(30),
    PRIMARY KEY(상품코드)
);
상품코드 상품명 메이커명
0001 상품xx xxx
0002 상품oo ooo
0003 상품** ***
CREATE TABLE 재고수 (
	상품코드 VARCHAR(4),
    입고날짜 DATE,
    재고수 INTEGER
);
상품코드 입고날짜 재고수
0001 2025-01-03 200
0002 2025-02-10 500
0003 2025-02-14 10

 

=> 두 테이블을 상품코드를 통해 연결 가능

 

<WHERE 절로 원하는 행만 검색>

SELECT *FROM 상품, 재고수;

교차결합(카티션곱)

 

* "WHERE": "상품코드가 같다" + "상품분류 = '식료품'"이라는 조건에 맞는 행만 검색 가능

: 열 이름이 같기 때문에 테이블명까지 함께 써줘야 함

SELECT *FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드 //교차결합
	AND 상품.상품분류='식료품'; //검색조건

 

 

<데이터 관리>

 

분할된 두 개의 테이블의 특정 열들 같이 출력하고 싶을 때 내부 결합

 

=> 위 테이블의 메이커명 열과 아래 테이블의 상품명을 같이 출력하고 싶을 때

SELECT S.상품명, M.메이커명
	FROM 상품2 S INNER JOIN 메이커 M
    	ON S.메이커코드=M.메이커코드;

외부 결합

 

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

 

내부 결합은 해당 열이 두 테이블에 모두 존재해야 가능

외부 결합은 특정 테이블을 기준으로 지정할 수 있음

- LEFT JOIN: 기준 테이블이 왼쪽

- RIGHT JOIN: 기준 테이블이 오른쪽

 

관계형 모델

 

<투플(tuple) = 행(row) = 인스턴스>

- 투플의 유일성: 하나의 릴레이션에는 동일한 투플이 존재할 수 없음(속성 4개 중 하나는 달라야 함)

- 투플의 순서는 중요하지 않음

- 카디널리티: 투플 개수

 

<속성(attribute) = 열(column)>

- 도메인(domain): 각 애트리뷰트에 대하여 허용된 값의 집합

ex. 남자 혹은 여자 둘 중 하나

- 애트리뷰트: (중요)원자값(더 이상 나누어지지 않는 값)만을 가질 수 있음

ex. "과목명"은 원자값을 가지지만, "수강과목 리스트"는 원자값을 갖지 않음

- 애트리뷰트의 순서는 중요하지 않음

- 차수(degree): 속성 개수

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

DML: SQL 연산자와 내장함수(2)  (0) 2025.04.15
SQL 8장  (0) 2025.04.14
DML: SQL 연산자와 내장 함수(1)  (0) 2025.04.13
DML: SELECT(데이터 조회)  (0) 2025.04.11
DML: INSERT & DELETE & UPDATE  (0) 2025.04.11