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 |