[MYSQL] 정규형, INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

yellowbutter·2024년 5월 19일
0

MYSQL

목록 보기
10/10
post-thumbnail

정규화

1. 제 1 정규화
한 칸엔 하나의 데이터만, JSON이나 array 데이터 타입 쓰면 한 칸에 여러 자료를 저장할 수 있다.
하지만 일부 수정은 어렵고 느릴 수 있다.

2.제 2정규화
partial dependency를 제거한 테이블
현재 컬럼과 관련 없는 컬럼을 다른 테이블로 빼는 작업
비관계형 db들은 정규화 안하는 경우 많다.

  • primary key는 행을 서로 구분할 수 있는 유니크한 데이터를 담고있는 컬럼
  • 하나의 컬럼만으로 primary key를 정할 수 없는 경우가 있다.

3.제 3정규화

  • 제2정규형에서 transitive dependency 제거
  • 제2정규형을 만족하는 테이블에서
    primary key 또는 composite primary key 컬럼에 종속된게 아닌 일반 컬럼에 종속된 컬럼을
    다른 테이블로 빼면 3정규형 테이블이다.

4. 테이블 나눌때 유의사항

  • 첫 컬럼은 항상 primary key를 넣는게 좋다.
  • 동명이인 등이 생겼을때 구분이 쉽다.
  • 다른 테이블의 데이터 사용시 primary key 쓸 수 있으면 적기

  • 이렇게 다른 테이블의 primary key를 사용하는 컬럼을
    foreign key라고 한다.

5. DBeaver에서 foregin key 설정하기


-어떤 테이블의 primary key를 사용하는지 선택
-어떤 컬럼에 foreign key 등록할지 선택
-저장까지 하기


  • 그럼 이렇게 foreign key라고 생성됨
  • 장점 : 조회 쉬움, 다른 테이블에서 쓰는 데이터 실수로 삭제 방지

6. SQL코드로 foregin key 설정하기

CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
프로그램 VARCHAR(100),
강사id INT REFERENCES 다른테이블(다른테이블컬럼)
)

CREATE TABLE 테이블명 (
id INT,
프로그램 VARCHAR(100),
강사id INT,
CONSTRAINT 제약조건작명 PRIMARY KEY (id),
CONSTRAINT 제약조건작명2 FOREIGN KEY (강사id) REFERENCES 다른테이블(다른테이블컬럼),
)

  • 이미 생성된 테이블을 수정

ALTER TABLE 테이블명 ADD
CONSTRAINT 제약조건작명 FOREIGN KEY (강사id) REFERENCES teacher(id)

테이블 2개를 합치려면

SELECT 프로그램, 가격, 강사, 출신대학
FROM program, teacher
WHERE program.강사id = teacher.id

  • 이 방법 외에 INNER JOIN 이라는 방법도 있다.

INNER JOIN

  • 테이블 2개를 합쳐서 출력

1. 테이블1 INNER JOIN 테이블2 ON 조건식

SELECT * FROM program INNER JOIN teacher
ON 강사.id = teacher.id

  • 그냥 INNER JOIN만 하게 되면 가능한 모든 행의 경우의 수가 나온다.

2. CROSS JOIN
CROSS JOIN써도 모든 행의 경우가 나온다. (더미 데이터)

SELECT FROM program INNER JOIN teacher
SELECT
FROM program CROSS JOIN teacher

3. 출력하고 싶은 테이블이 3개 이상인 경우

SELECT *
FROM 테이블1
INNER JOIN 테이블2 ON 조건1
INNER JOIN 테이블3 ON 조건2

  • 맨 뒤에 GROUP BY 조건 붙이면 그룹지을 수 있다.

LEFT JOIN, RIGHT JOIN, FULL JOIN

  • 테이블끼리 합칠 때 NULL이 발생하는 부분을 미리 찾고 싶을 때 사용하는 경우가 많다.

1. LEFT JOIN, RIGHT JOIN

왼쪽 테이블 전체 + 공통된 행 출력하고 싶으면 LEFT JOIN
오른쪽 테이블 전체 + 공통된 행 출력하고 싶으면 RIGHT JOIN

SELECT *
FROM program
LEFT JOIN teacher
ON program.강사id = teacher.id

SELECT *
FROM program
LEFT JOIN teacher
ON program.강사id = teacher.id
WHERE 컬럼명 IS NULL

2. FULL JOIN

LEFT JOIN과 RIGHT JOIN 결과를 합해서 출력하고 싶으면 FULL JOIN 문법 사용

SELECT *
FROM program
FULL JOIN teacher
ON program.강사id = teacher.id

  • 하지만 MYSQL, MariaDB, SQLite 에선 사용할 수 없다.
  • 거기선 LEFT JOIN, RIGHT JOIN 결과를 UNION 연산자로 묶으면 된다.
    -LEFT JOIN / LEFT OUTER JOIN , RIGHT JOIN / RIGHT OUTER JOIN
    , FULL JOIN / FULL OUTER JOIN

같은 뜻이라 대부분의 DBMS에선 혼용해서 사용가능

profile
기록은 희미해지지 않는다 🐾🧑‍💻

0개의 댓글