정규화
- 정규화는 데이터베이스 설계에서 데이터 중복을 피하기 위해 테이블을 분리하는 과정임
- 데이터 관리의 편의성을 높이는 것이 목적임. 예를 들어, 동아리 정보가 대학교 테이블에 직접 기록되어 있다면, 동아리 이름이 바뀔 때 모든 레코드를 수정해야 하지만, 이를 동아리 테이블로 분리하면 동아리 테이블만 수정하면 됨
- 정규화의 결과로 응집도가 높아지고 결합도가 낮아지며, 이는 유지보수의 용이성으로 이어짐
- 이상현상 발생을 피하기 위함
FK가 왜 상대 테이블의 PK여야 하는가
- **FK(Foreign Key)**는 한 테이블이 다른 테이블과 관계를 맺기 위해 사용하는 키임
- **PK(Primary Key)**는 테이블의 각 행을 고유하게 식별할 수 있는 키로, 유일한 값임
- FK는 상대 테이블의 PK를 참조해야 데이터 무결성이 보장됨. 예를 들어, 대학교 테이블의 동아리 열이 동아리 테이블의 동아리번호 PK를 참조하게 되면, 동아리 번호가 잘못된 값이 들어갈 가능성이 없어짐
- 이름(Name) 같은 값은 고유하지 않을 수 있어 FK로 부적절함. 예를 들어, 여러 학생이 같은 이름을 가질 수 있음. 따라서 FK로 사용하기 위해서는 반드시 고유한 값을 가져야 함
JOIN 문법
중복 컬럼의 경우 컬럼명 앞에 테이블을 명시해야함
FROM 절에서 ALIAS 정의 후에는 WHERE/SELECT 절에서 테이블명 사용 불가
- INNER JOIN: 두 테이블에서 공통된 열의 값이 일치하는 행만 반환함 즉, 양쪽 테이블에 모두 존재하는 데이터만 결과에 포함됨(NATURAL JOIN은 조인 컬럼 및 조건을 지정할 수 없음, ALIAS를 사용할 수 없음, 조건절을 필수로 사용, 'INNER' 생략 가능)
- LEFT (OUTTER) JOIN: 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 데이터가 있으면 그 데이터를 포함함 일치하지 않는 오른쪽 테이블의 데이터는 NULL로 표시됨
- RIGHT (OUTTER) JOIN: 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서 일치하는 데이터가 있으면 그 데이터를 포함함 일치하지 않는 왼쪽 테이블의 데이터는 NULL로 표시됨
- FULL OUTER JOIN: 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 데이터는 NULL로 표시됨 이는 LEFT JOIN과 RIGHT JOIN의 조합으로, 모든 데이터가 결과에 포함됨
- OUTTER JOIN은 성능저하의 원인이 될 수 있음
ON 조건절
암시적 JOIN
모든 조건을 WHERE절에 기술
명시적 JOIN
JOIN 기준 조건은 ON절에 기술
ON절 괄호는 생략가능
JOIN과 무관한 일반조건은 WHERE절에 기술
USING 조건절
- ON절의 "=" 연산자 대신 USING 절 사용 가능 양쪽 테이블에 있는 컬럼이름만 명시
USING절 에서는 괄호 생략 불가
ALIAS 사용 불가
결론) NATURAL JOIN과 USING은 동일하게 사용될 수도 있지만
만약 여러 컬럼이 중복되는 경우 일부에 대해서만 JOIN을 걸고 싶으면 USING
SELF JOIN(셀프조인)
- FROM 절에 동일 테이블이 두번 이상 나타남
- 테이블 식별을 위해 반드시 별칭을 사용해야함
- 동일한 테이블을 개념적으로 서로 다른 두 개 의 테이블로 사용함
서브쿼리
- 서브쿼리는 하위 쿼리라고도 불리며, 다른 쿼리 내에 포함된 쿼리임. 서브쿼리는 SELECT, INSERT, UPDATE, DELETE 문에서 사용할 수 있음
- 서브쿼리는 주로 복잡한 데이터 검색이나 특정 조건을 만족하는 데이터를 조회하는 데 사용됨 JOIN 대신 서브쿼리를 사용하는 경우도 있지만, 서브쿼리는 성능 면에서 비효율적일 수 있음
'javaboiii의 DataBase' 카테고리의 다른 글
DB - 다중 행 함수(Multi-Row Function) (0) | 2024.08.20 |
---|---|
DB - 서브쿼리(Subquery) (0) | 2024.08.18 |
DB - DCL(Data Control Language) (0) | 2024.08.15 |
DB - TCL(Transaction Control Language) (0) | 2024.08.13 |
DB - REGEXP 함수 (0) | 2024.08.10 |