조인(Join)
새로운 테이블
create table profile (
userid varchar(20) not null, -- member 와 같이 primary key 로 하면 안됨
height double,
weight double,
mbti varchar(10),
foreign key(userid) references member(userid)
);
profile의 userid는
MK_member의 primary key 인 userid 의 foreign key.
insert into profile values ('grapes', 190, 100, 'ESFP'); -- Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`kdt`.`profile`, CONSTRAINT `profile_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `member` (`userid`))
MK_member에 없는 userid를 insert하려고 하면 에러가 발생한다.
insert into profile values ('apple', 160, 50, 'ISTP');
insert into profile values ('orange', 170, 60, 'ENFP');
insert into profile values ('banana', 155, 45, 'ISTJ');
완성된 profile table
조인
/*
조인
관계성을 갖는 테이블끼리.
select 필드명1, 필드명2, ... from 테이블1, [inner, left, right] join 테이블2 on 테이블1.연결할필드 = 테이블2.연결할필드
*/
inner join
-- inner 조인
-- 조인하는 테이블의 on절의 조건이 일치하는 결과만 출력
-- 두 테이블의 교집합
-- join, inner join, cross join 모두 같은 의미로 사용됨
select userid, name, gender, mbti from MK_member inner join profile on member.userid = profile.userid;
이렇게 코드를 작성하면 에러가 발생한다.
수정된 코드
select m.userid, m.name, m.gender, p.mbti from MK_member m inner join profile p on m.userid = p.userid;
left, right join
-- left/right
-- 두 테이블이 조인될 때 왼쪽/오른쪽을 기준으로 기준 테이블의 데이터를 모두 출력
-- outer join 은 조인하는 테이블의 on절에 조건 중 한쪽의 데이터를 모두 가져온다.
left
select m.userid, m.name, m.gender, p.mbti from MK_member m left outer join profile p on m.userid = p.userid;
right
select m.userid, m.name, m.gender, p.mbti from MK_member m right outer join profile p on m.userid = p.userid;
데이터 정규화
데이터 정규화
- 데이터 베이스를 설계할 때 중복을 최소화하는 것
- 조직화되어 있지 않은 테이블과 관계들을 조직화된 테이블과 관계들로 나누는 것
데이터 정규화가 필요한 경우
- 데이터를 갱신, 삽입, 삭제, 테이블을 수정할 때.. 원하지 않게 데이터가 삭제되거나 가공되는 일이 발생할 수 있음. -> '이상 현상'
- 이상 현상이 발생할 가능성이 있다면 정규화가 반드시 필요
테이블 설계는 중요하다. 경험이 없다면 이상현상이 발생하는 경우가 많다.
정규화의 종류
1. 1NF(제 1정규화)
- 테이블 안의 모든 값들은 단일 값이어야 한다.
- 더 이상 쪼개질 수 없는 단위로 저장
2. 2NF(제 2정규화)
- 1NF를 만족하면서, 완전함수 종속성을 가진 관계들로만 테이블을 생성
- 종속성들 중 종속 관계에 있는 열들끼리 테이블을 구분해 주는 것
- 기본키에 속하지 않은 속성 모두가 기본키에 완전 함수 종속이 정규형
- 함수 종속성: x값에 따라 y값이 결정되는 경우
3. 3NF (제 3정규화)
- 2NF를 만족하면서, 기본키에 대해 이행적 함수 종속이 되지 않는 것을 의미
4. 비정규화
- 정규형에 일치하게 되어 있는 테이블을 정규형을 지키지 않는 테이블로 변경
- 테이블을 조회하는 용도로 사용하거나, 너무 데이터가 많이 나뉘어 성능이 저하된다면 비정규화를 하여 테이블을 다루는 것이 더 효율적일 수 있음
- 어떤 작업을 수행하는지, 어떤 데이터를 사용하는지에 따라 적절한 정규화를 하는 것이 좋음
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] db 사용자관리 (0) | 2023.09.20 |
---|---|
[MySQL] 문자열 함수, 유니온, 서브쿼리, 복사 (0) | 2023.09.20 |
[MySQL] 정렬, Limit, group함수 (0) | 2023.09.19 |
[MySQL] 데이터 수정, 삭제, 검색, where (0) | 2023.09.19 |
[MySQL] 데이터 타입, 테이블 다루기 (0) | 2023.09.18 |
댓글