전체 테이블 구성 이해하기
MEMBER 테이블
| ID |
NAME |
| NEWLEC |
뉴렉 |
| YJS |
유재석 |
| JUNG |
정형돈 |
| KANG |
강호동 |
NOTICE 테이블 (게시글)
| ID |
TITLE |
WRITER_ID |
| 1 |
ORACLE 개요 |
NEWLEC |
| 2 |
SQL 구문 |
NEWLEC |
| 3 |
DML 사용하기 |
NEWLEC |
| 4 |
DML 사용하기 |
DRAGON |
| 5 |
DML 사용하기 |
DRAGON |
③ COMMENT 테이블 (댓글)
| ID |
COMMENT |
NOTICE_ID |
| 1 |
많은 도움~ |
1 |
| 2 |
정리를 잘하네요~ |
1 |
| 3 |
감사합니다. |
3 |
JOIN 순서 및 해석
SELECT N.ID, N.TITLE, N.WRITER_ID, M.NAME,
COUNT(C.ID) CNT
FROM MEMBER M
RIGHT OUTER JOIN NOTICE N ON M.ID = N.WRITER_ID
LEFT OUTER JOIN COMMENT C ON N.ID = C.NOTICE_ID
GROUP BY N.ID, N.TITLE, N.WRITER_ID, M.NAME;
- MEMBER M RIGHT OUTER JOIN NOTICE N ON M.ID = N.WRITER_ID
- MEMBER 테이블 기준이 아닌 NOTICE 기준으로 남김없이 JOIN (즉, NOTICE에 있는 5개 모두 남음)
- MEMBER에 없는 DRAGON은 M.NAME이 NULL로 나옴
- LEFT OUTER JOIN COMMENT C ON N.ID = C.NOTICE_ID
- 위에서 만들어진 NOTICE 기반 테이블에 COMMENT를 붙임
- COMMENT가 없는 게시글은 C.ID가 NULL이 됨
VIEW 생성 쿼리 설명
CREATE VIEW NOTICEVIEW AS
SELECT N.ID, N.TITLE, N.WRITER_ID, M.NAME WRITER_NAME,
COUNT(C.ID) CNT
FROM MEMBER M
RIGHT OUTER JOIN NOTICE N ON M.ID = N.WRITER_ID
LEFT OUTER JOIN COMMENT C ON N.ID = C.NOTICE_ID
GROUP BY N.ID, N.TITLE, N.WRITER_ID, M.NAME;
- 이 VIEW는 위 SELECT 결과를 논리적으로 저장해놓은 가상 테이블입니다.
- 추후 사용자는 SELECT * FROM NOTICEVIEW WHERE ... 으로 손쉽게 필터링해서 사용할 수 있습니다.