발자취
#11 모델링2 (테이블 최적화, 정규형), 서브쿼리 본문
#01 대응수 최적화 (다대다에서 1대다로)
- 기본적으로 모든 관계는 M:N(다대다) 관계
- Entity - Relationship - Entity 3개의 테이블이 필요함
- 필요하지 않은 경우엔 1대다로 축소할 수 있음 (이력관리가 필요한 경우엔 다대다, 아니면 1대다 형태여도 됨!)
#02 정규화
- 데이터 중복 방지를 위해 사용하는 모델링 기법 (공간 낭비를 방지하기 위해)
- 정규화를 통하면 여러 개의 테이블로 분리됨
- 필요시에 조인을 통해 큰 테이블로 합칠 수 있음
- 정규형
1. 제1정규형(1NF)
- multi-value 금지
(1) 취미 - 독서, 영화감상 (x)
(2) 취미 - 독서
취미 - 영화감상 (O)
2. 제2정규형(2NF)
- 키 컬럼과 나머지 일반 컬럼이 직접적인 연관관계(직접 종속) 만 가지도록 테이블 구성
3. 제3정규형(3NF)
- 일반 컬럼끼리 간접 연관관계(간접 종속)를 가지지 않도록 테이블 분리
4. BCNF 정규형
- 모든 결정자/식별자(discriminator)가 후보키 집합에 속한 경우
#03 서브쿼리
- 쿼리 안에 또 쿼리가 들어있는 경우
select count(emp_no) from salaries where salary in (select salary from salaries where emp_no='10001');
- 종류
- 단일행(단일컬럼) 서브쿼리: 서브쿼리의 결과물이 레코드 한 줄
- 일반 연산자 (=, >, <, ...) 사용
- 다중행(단일컬럼) 서브쿼리
- 다중행 연산자 (IN, ALL, ANY, EXISTS) 사용
- ALL: 여러 개의 레코드의 AND 효과 (가장 큰 값보다 큰)
- ANY: 여러 개의 레코드의 OR 효과 (가장 작은 값보다 큰)
- IN/EXISTS: 결과값 중에 있는 것 중에서의 의미
- IN: 전체 레코드 스캔
- EXISTS: 존재 여부만 확인 (상대적으로 속도 빠름) 결과는 TRUE/FALSE
- (다중행)다중컬럼 서브쿼리: 컬럼 자체가 여러 개
#03-2 서브쿼리 실습

서브쿼리를 사용하여 국가명이 ‘South Korea’인 나라의 국가코드를 찾아 이에 해당하는 도시의 수를 조회했습니다.

같은 내용을 join을 사용해 확인해보았습니다.

city 테이블에서 국가코드가 ‘KOR’인 도시의 평균 인구수보다 많은 도시들의 이름, 인구수를 인구수가 많은 순서로 정렬하여 조회합니다.

국가명이 ‘South Korea’, ‘China’, ‘Japan’인 국가의 국가코드를 찾아 이에 해당되는 도시의 국가코드와 도시의 수를 조회합니다. 이때 국가코드는 그룹화하여 조회합니다.

같은 내용을 join을 사용해 확인해보았습니다.

인구가 5,000,000명 이상인 도시의 이름, 국가코드, 인구수를 조회했습니다.
'3-1 > 데이터베이스' 카테고리의 다른 글
| #13 반정형데이터 (NoSQL, JSON) (0) | 2023.08.12 |
|---|---|
| #12 역정규화, DML 실습 4 (0) | 2023.08.12 |
| #10 DML 실습 3 (Group by, having, charset/collation) (0) | 2023.08.12 |
| #09 DCL 실습 (0) | 2023.08.12 |
| #08 DDL 실습 (0) | 2023.08.12 |