전체 테이블 구성 이해하기
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 ... 으로 손쉽게 필터링해서 사용할 수 있습니다.