1. 테이블에 데이터를 넣고 조회하는 방법 → 게시글 테이블이 필요함
password | id | user_name | title | content |
1234 → 바꾸려면? | 1 | ssar | 제목1 | 내용1 |
1234 | 2 | cos | 제목2 | 내용2 |
1234 | 3 | ssar | 제목3 | 내용3 |
2. 테이블 설계하는 방법
- 기본 : 그림이 나와야 함
그림을 보고 컬럼을 뽑아낼 수 있음
- 컬럼을 늘릴 수 없음 → 설계가 바뀜
- 중복되면 안됨 일관성 깨짐
- ,로 구분하면 안됨 원자성이 깨짐 나중에 조회가 안됨\
ex) 게시글의 제목만 넣으면 1건 → 쪼갤 필요 없음
2건 이상 → 무조건 쪼개야 함 / 오브젝트니까
오브젝트를 하나의 컬럼에 넣을 수 없음
user_tb | 1 | 1 |
id | username | password |
1 | ssar | 1234 |
2 | cos | 1234 |
board_tb | N | 1 | ㅤ |
id | title | content | user_id |
1 | 제목1 | 내용1 | 1 |
2 | 제목2 | 내용2 | 2 |
- 관계 // 비지니스를 알아야 함
user_tb : 여러 건을 쓸 수 있음 // 1 대 n
반대로도 봐야 함
board_tb : 한명이 한 건을 적을 수 있음 // 1대 1
⇒ 제일 큰 것 적기 // 둘의 관계는 1:n
user_tb | 1 | 1 |
id | username | password |
1 | ssar | 1234 |
2 | cos | 1234 |
fruit_tb | N | 1 | ㅤ |
id | name | price | pty(재고) |
1 | 바나나 | 100 | 100 |
2 | 딸기 | 500 | 50 |
but_tb | ㅤ | ㅤ | ㅤ |
id | user_id | product_id | pty |
1 | 1 | 2 | 30 |
2 | 1 | 1 | 20 |
n대 n의 관계 : 명단 테이블이 생김 ⇒ 동사(행위) 테이블이 생김
미리 만들 필요 없음
명사를 다 만들고 행위를 만들면 됨
3. 1대 N의 관계
- 양쪽에 한 군데 외래키가 필요함
- 외래키를 두는 위치 : n쪽
user_tb | 1 | 1 |
id | username | password |
1 | ssar | 1234 |
2 | cos | 1234 |
boat_tb | N | 1 | ㅤ |
id | name | price(조단위) | user_id |
1 | 이순신함 | 1000 | 1 |
2 | 장보고함 | 500 | 2 |
댓글 1대 N의 관계
board_tb | 1 | ㅤ |
id | username | password |
1 | ssar | 1234 |
2 | cos | 1234 |
reple_tb | N |
id | content |
1 | 내용1 |
2 | 내용2 |
join을 안하게 되면 하나의 테이블에만 접근하니까 조회가 엄청 빠름
ex) insert와 조회만 하는 DB에서는 중복되서 넣는게 좋음
insert는 귀찮지만 조회는 굉장히 편함
수정시 일관성이 빼질 수 있음
→ 실수할 가능성이 있기 때문에 외래키를 이용해서 join을 사용해야 함
4. join
user_tb | ㅤ | ㅤ |
id | username | password |
1 | ssar | 1234 |
2 | cos | 1234 |
boat_tb | ㅤ | ㅤ | ㅤ |
id | name | price(조단위) | user_id |
1 | 이순신함 | 1000 | 1 |
2 | 장보고함 | 500 | 2 |
select * from boat_tb where boat_tb id=1;
4. 프로젝션(Projection)
- 뽑아내기/ 퍼올리기
- 데이터베이스에서 특정 열이나 특정 표현식을 선택하여 결과로 반환하는 것 :
for문으로 두바퀴 돌게 됨
찾으면 옆에 붙음
user id는 기본키라 중복될 일이 없기 때문에 찾으면 끝나게 됨
5. SQL 쿼리의 실행순서
- From:
- 데이터를 가져올 테이블 또는 뷰를 지정
- 하드디스크에서 데이터를 읽어오는 단계
- 이 단계 이후 프로젝션이 가능함
- Where:
- 가져온 데이터에서 필요한 행을 선택
- 조건에 맞는 행만을 선택하는 단계 / 일종의 필터링 역할
- Select:
- 선택된 행에서 필요한 열을 선택합니다.
- 프로젝션 단계 : 테이블 전체가 아니라 필요한 열 만을 선택하는 것
- Order by:
- 결과를 정렬
- 정렬이 필요한 경우, 정렬을 수행하는 단계
- 비용이 많이 들 수 있는 작업, 필요한 경우에만 사용하는 것이 좋음
board_tb | N | ㅤ |
id | title | content |
1 | 1 | 내용1 |
2 | 2 | 내용2 |
like_tb | 1 | ㅤ |
id | board_id | user_id |
1 | 1 | 1 |
2 | 1 | 2 |
- 복합 유니크를 걸어야함
- 제약 조건 : 비지니즈로 나오는 것 어려움
설계는 많은 경험이 필요함
board_tb | 1 | ㅤ |
id | title | content |
1 | 1 | 내용1 |
2 | 2 | 내용2 |
reply_tb | N | ㅤ |
id | content | board_tb |
1 | 1 | 1 |
2 | 1 | 2 |
복합 유니크를 걸 필요 없음
board_tb | ㅤ | ㅤ |
id | title | content |
1 | 제목1 | 내용1 |
2 | 제목2 | 내용2 |
3 | 제목3 | 내용3 |
4 | 제목4 | 내용4 |
reply_tb | ㅤ | ㅤ | ㅤ |
id | user_id | board_id | content |
1 | 1 | 1 | 댓글1 |
2 | 1 | 1 | 댓글2 |
3 | 1 | 2 | 댓글3 |
6. inner join
- 두 테이블 간에 일치하는 행 만을 결과로 반환합니다.
select * from boat_tb b inner join user user_tb u on b.user_id = u.id where b.id = 1;
주도하는 테이블 (Driving Table) : from 바로 뒤 / 주도권을 가지고 있음
드리븐 테이블 (Driven Table) : join 뒤 / 조종 당하는 테이블
엔포드 : N 을 가진 테이블이 포링키 / 드라이빙테이블을 가짐
id | name | price(조단위) | user_id | id | paaword |
1 | 이순신함 | 1000 | 1 | ssar | 1234 |
2 | 장보고함 | 500 | 2 | cos | 1234 |
1 | 이순신함 | 1000 | 1 | ssar |
SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb INNER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
id | title | content | reply_content |
1 | 제목1 | 내용1 | 댓글1 |
1 | 제목 | 내용1 | 댓글2 |
3 | 제목3 | 내용2 | 댓글3 |
7. outer Join
- INNER JOIN과 달리 일치하지 않는 행도 결과에 포함
7-1. LEFT OUTER JOIN
: 왼쪽 테이블의 모든 행을 결과에 포함
오른쪽 테이블과 일치하는 행이 있으면 해당 행을 포함
일치하지 않는 경우 오른쪽 테이블의 열 → NULL
SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb LEFT OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
id | title | content | reply_content |
1 | 제목1 | 내용1 | 댓글1 |
1 | 제목1 | 내용1 | 댓글2 |
2 | 제목2 | 내용2 | 댓글3 |
3 | 제목3 | 내용3 | null |
4 | 제목4 | 내용4 | null |
7-2. RIGHT OUTER JOIN
: 오른쪽 테이블의 모든 행을 결과에 포함
왼쪽 테이블과 일치하는 행이 있으면 해당 행을 포함
일치하지 않는 경우 왼쪽 테이블의 열 → NULL
SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb RIGHT OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
id | title | content | reply_content |
1 | 제목1 | 내용1 | 댓글1 |
1 | 제목1 | 내용1 | 댓글2 |
2 | 제목2 | 내용2 | 댓글3 |
null | null | null | 댓글4 |
7-3. FULL OUTER JOIN
- 양쪽 테이블 중 어느 한쪽에라도 일치하는 행이 있으면 해당 행을 포함
어느 한쪽에만 있는 경우 → NULL
SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb FULL OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
id | title | content | reply_content |
1 | 제목1 | 내용1 | 댓글1 |
1 | 제목1 | 내용1 | 댓글2 |
2 | 제목2 | 내용2 | 댓글3 |
3 | 제목3 | 내용3 | null |
4 | 제목4 | 내용4 | null |
null | null | null | 댓글4 |
Share article