select name, goods_nm, pay_date # 컬럼 순서가 같고, 그 형식이 같아야 함
from 테이블명1
union (all) #수직결합 명시
select name, goods_nm, pay_date # 컬럼 순서가 같고, 그 형식이 같아야 함
from 테이블명 2 ;
< KEY >
< KEY의 종류 >
🔔 Primary key(기본키) 🔔
Candidate key(후보키): 유일성(중복된 행이 없음)과 최소성(최소한의 컬럼으로 유일성을 만족하는 특징)을 만족하는 키
Super key(슈퍼키): 유일성은 만족하지만 최소성은 만족하지 않는 키
Alternate key(대체키): 후보키 중 기본키로 선택되지 못한 키
🔔 Foreign Key(외래키) 🔔
학과정보 테이블
학과 번호(PK) | 학과 |
---|---|
1 | 국어국문학과 |
2 | 컴퓨터공학과 |
학번 | 이름 | 학과번호(FK) |
---|---|---|
1234 | 홍길동 | 1 |
5678 | 임꺽정 | 2 |
<정규화란>
<정규형의 종류>
1. 제1정규형 (1NF): 각 컬럼이 원자값(atomic value)을 가지도록 테이블을 설계
ex)
회원번호 | 이름 | 구매상품 | 가격 |
---|---|---|---|
1 | 홍길동 | 샴푸 | 5,000 |
1 | 홍길동 | 린스 | 4,000 |
2 | 임꺽정 | 우유 | 1,000 |
3 | 이순신 | 우유 | 1,000 |
회원번호
+ 구매상품
]인 테이블구매상품
에 의해 가격
이 결정됨 → 완전함수종속성 위배기본키와 부분함수종속성을 갖는 컬럼(=가격 컬럼)
을 다른 테이블로 분해하면 제2정규형을 만족하게 됨테이블 1
회원번호 | 이름 | 구매상품 |
---|---|---|
1 | 홍길동 | 샴푸 |
1 | 홍길동 | 린스 |
2 | 임꺽정 | 우유 |
3 | 이순신 | 우유 |
테이블 2
상품명 | 가격 |
---|---|
샴푸 | 5,000 |
린스 | 4,000 |
우유 | 1,000 |
구매번호 | 구매상품 | 가격 |
---|---|---|
A1 | 샴푸 | 5,000 |
A2 | 우유 | 1,000 |
A3 | 우유 | 1,000 |
구매번호 | 구매상품 | 가격 |
---|---|---|
A1 | 샴푸, 린스 | 9,000 |
A2 | 샴푸, 우유 | 6,000 |
구매번호
에 의해 구매상품
이 결정되고, 구매상품
에 의해 가격
이 결정 되는데, 구매번호
에 의해서도 가격
이 결정되는 상황 (구매 당 상품을 1개만 구입할 수 있어, 구매가 일어나면 해당 상품에 맞는 가격이 매칭되는 구조이기 때문)테이블1 | 테이블2 | ||
---|---|---|---|
구매번호 | 구매상품 | 구매상품 | 가격 |
A1 | 삼푸 | 삼푸 | 5,000 |
A2 | 우유 | 우유 | 1,000 |
A3 | 우유 |
📌 DB 정리 및 JOIN
JOIN
은 정규화로 인해 분리된 테이블에서 필요한 데이터를 결합하여 조회하는 도구<조인의 첫번째 단계: 공통컬럼 찾기>
<조인의 두번째 단계: 적절한 조인 방식 찾기>
<조인의 종류>
INNER JOIN
(가장 많이 사용) : 두 테이블에서 일치하는 값을 가진 행을 출력 (교집합)LEFT JOIN
(가장많이사용)RIGHT JOIN
FULL OUTER JOIN
# INNER JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블1 as a
inner join 테이블2 as b
on a.공통컬럼=b.공통컬럼
-- ANIMAL_INS: 동물 보호소에 들어온 동물의 정보. (I)
-- ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보. (O)
-- Where 절을 이용해서 원하는 조건을 설정한다.
SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME;
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1 -- left에 위치한 테이블. (기준)
left join 테이블2 as 테이블명2 -- right에 위치한 테이블.
on a.공통컬럼=b.공통컬럼
select *
from basic.s1 a
left join basic.s2 b
on a.name=b.name
→ 결과값으로, 기준인 s1 의 모든데이터가 출력
→ right 에 위치한 s2 테이블의 경우, 이름이 같다는 조건을 만족한 경우 데이터를 반환하였고, 만족하지 못한 경우 NULL 값을 반환
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1 -- left에 위치하는 테이블.
right join basic.theglory2 as 테이블명2 -- RIGHT 에 위치 하는 테이블. (기준)
on a.공통컬럼=b.공통컬럼
select *
from basic.s1 a
right join basic.s2 b
on a.name=b.name
→ 결과값으로, 기준인 s2 의 모든데이터가 출력
→ left에 위치한 s1 테이블의 경우, 이름이 같다는 조건을 만족한 경우 데이터를 반환하였고, 만족하지 못한 경우 NULL 값을 반환
select 컬럼1, 컬럼2,...
from table1 left join table2
on a.공통컬럼=b.공통컬럼
union
select 컬럼1, 컬럼2,...
from table1 right join table2
on a.공통컬럼=b.공통컬럼
select *
from basic.s1 as a left join basic.s2 as b
on a.name=b.name
union
select *
from basic.s1 as a right join basic.s2 as b
on a.name=b.name