self join
cross join
ㅡㅡㅡㅡㅡ
2개 엮으면 JOIN
근데 여기서부터 벌써 복잡하기 시작....
3개면.... ㄷㄷㄷㄷ
-> VIEW 개념 등장
내가 보고싶은대로 볼 수 있는 테이블 단위
이거를 그냥 '하나의 테이블'로 다른 이름으로 지정하면
마치 함수처럼 사용 가능
-> 자 이제 간단하게 만들어보자
쨘!
보통 JOIN, GROUP BY 정도만 VIEW로 묶는다.
ㅡㅡㅡㅡㅡ
* VIEW 사용 이유 - 딱 2가지! *
1) 복잡한 식을 단순화
2) 일반 사용자들에게 테이블을 공개하고 싶지 않을 때
- 작성자가 누구인지, 조회수가 몇 인지 등을 공개하고 싶지 않을 때
- 관리자 입장에서 보안 문제로
- '읽기' 전용의 테이블을 제공할 때 사용
-> NOTICE 원본을 공개하는게 아니라 단축해서 보여준다는 것
시퀄
- 마스터 데이터
오라클
- 딕셔너리
공통이름
- 메타데이터
그런 메타데이터를 저장하는 테이블 =
오라클은 그냥 제공하지 않고... 조회용 테이블을 제공
- 컬럼 다 보여주는 것도 있고
- 줄여서 보여주는 것도 있고
1. 테이블 목록 보고 싶으면
2. NOTICE에서 만든 컬럼들을 보고 싶으면
... 등등등등 이런 기능들이 있다~
다시 돌아오자! ㅋㅋㅋ
* SELF JOIN *
- 이게 따로 있는게 아니라 개념만 있는 것 (코드식은 같다)
- 테이블이 ... '자신과' 함치는 것
WHY?!
ex) 게시글 > 댓글 > 대댓글 (그럼 대댓글은 댓글을 참조함)
우리는 대댓글을 위한 테이블을 만들지는 않음
사원 테이블을 만들면, 부장 테이블, 차장 테이블, 대리 테이블... 이렇게 따로 만들지 않음
이럴 경우 참조되는 상사(?)를 join하는 것을 self-join이라고 함
참조란 적은 쪽을 참조하는 것
- 부하가 상사를 참조하는 쪽으로 하는게 옳다.
정형돈 < 유재석, 강호동 < 뉴렉
참조 키 표현 (상사)
'자기 참조'가 됨
Q. 유재석 상사에 대한 더 자세한 정보를 뽑아라.
- 자기가 스스로를 JOIN해서 / 정보를 (이름) 뽑음
조원 < 조장 < 뉴렉 / 만들어보자
(먼저 참조키 추가. MEMEBER 우클릭 > NULL 아니게, 중복 아니게 (ID, NICNAME), 컬럼 추가 (ALTER TABLE로 추가하지 말고 이렇게 우클릭으로 추가하기! "이런걸 암기하는게 실력이 아니라 서비스 만드는게 실력입니다." ) BOSS_NICNAME / NVARCHAR(50)으로 하자)
-> 조장은 NEWLEC을 보스로 하기
조원은 조장 닉네임
사원 - M
보스 - B
별칭 필수!
이거 이해
김영화 상사 ---- 황지산
황지산의 상사가 있을 수 있음
Q. 옆에다가 BOSS의 BOSS를 만들어보자.
-> JOIN 한 번 더
부모를 왼쪽에 써주기
참조되는 녀석 = 참조 키
지금 제일 밑에가 M.
M < B < B2 (제일 상사)
테이블을 '떨어진' 여러개라고 생각하기
이거 이해
cf) 부모를 왼쪽에 써주기 - 우선 M, B, B2 이렇게 테이블이 따로 존재한다고 생각 근데 M에는 ID~ BOSS_NICNAME까지 B에는 ID~ BOSS_NICNAME 에다가 BOSS_NAME를 조인 B2에는 ID~ BOSS_NICNAME, BOSS_NAME에다가 NAME(상사의 상사)을 조인 첫번째 문제 : BOSS_NICNAM을 토대로, 옆에 BOSS_NAME을 불러오기 SELECT M.*, B.NAME BOSS_NAME // M 전체 테이블하고 + B.NAME을 불러와서 BOSS_NAME이라고 하자 - 지금 SELF JOIN이니까 B.NAME 컬럼은 M.NAME하고 다를바가 없는거 - 근데 B.NAME을 불러오는 이유는 ~ B를 JOIN했는데 '거기서' NAME만 가지고 오고 싶어서 그러함 FROM MEMBER M LEFT JOIN MEMBER B // 위에 은정님 사진에서 빨간색으로 막 추가가 되는 테이블이 B인 것 ON B.NICNAME = M.BOSS_NICNAME; - M에서 'BOSS_NICNAME'이 있었지. 각 조마다 3-4개씩 같은 값들이 나왔을거다. - 만약 그 값이 JISAN이면 ----- B에서 NICNAME으로 JISAN을 사용하는 사람이 있겠지? 바로 JISAN님. 갓챠~ ★ - (아래 그림판으로 그림(?ㅎㅎ)을 그려봤다. 자. M에는 JISAN님이 4개 있어. 그런데 B랑 JOIN할거란 말이야. 조건이 뭐냐면 JISAN의 데이터를 들고와야하는거니까, -> B.NICNAME = M.BOSS_NICNAME이 같은걸 JOIN 하겠다. 이게 아래 그림에서 1번! - 그리고 2번! B.NAME을 불러와서 BOSS_NAME이라고 하겠다. |
두번째 문제 : BOSS_NAME을 토대로, 거기에 적힌 사람들의! B2_NAME (보스의 보스)를 불러오기 SELECT M.*, B.NAME BOSS_NAME, B2.NAME B2_NAME // B2의 NAME을 불러오는 것 FROM MEMEBER M LEFT JOIN MEMBER B ON B.NICNAME = M.BOSS_NICNAME LEFT JOIN MEMBER B2 ON B2.NICNAME = B.BOSS_NICNAME; |
SELECT M.*, B.NAME BOSS_NAME, B2.NAME B2_NAME
FROM MEMBER M
LEFT JOIN MEMBER B ON B.NICNAME = M.BOSS_NICNAME
LEFT JOIN MEMBER B2 ON B2.NICNAME = B.BOSS_NICNAME;
ㅡㅡㅡㅡㅡ
* CROSS JOIN *
- 선생님은 현실에서 쓴 적이 한 번도 없으시다고 ㅎㅎㅎ
- 더미 데이터 만들 때 사용
만약에 MEMBER와 관련 없는 "COMMENT"를 CROSS JOIN하면
-> ON 필요 없음
두 개의 데이터를 '곱하기'로 만들어낸 데이터 :) (왜 필요한지는 선생님도 모르시겠다고 ㅎㅎ)
-> 624개가 나옴 (MEBER가 24개, "COMMENT"가 26개)
ㅡㅡㅡㅡㅡ
// ANSI 구문
선생님은 JOIN할 때 ORACLE거 안쓰신다고 함
- 오라클 구문이 직관적이지 않아서
하지만 실무에서 오라클을 쓸 수도 있으니.. 알아는보자
OUTER를 껴놓아보자
(+) 추가하라는것
- 오른쪽에 껴놓으면 LEFT OUTER JOIN임 (방향 선생님도 헷갈리신다고 함)
NULL 추가라고 생각해서 방향을 외워야겠다.
FULL OUTER JOIN은
-> 오라클에 없당 (양쪽에 (+) 넣으면 오류 나옴)
Q. 댓글 조회
SELECT * FROM "COMMENT";
Q. NOTICE_ID로 정렬
Q. 15번 NOTICE_ID에 해당되는 댓글 수를 출력해보라.
지금 한 줄 뽑으니까 ORDER BY는 의미가 없고ㅎㅎ
이거 이해
컬럼 하나 추가하면 JOIN이 생각나지 (복잡복잡)
-> 서브쿼리 등장!
지금 둘의 결과는 같음
2가 더 쉬운 방법
내일 둘의 장단점을 알아보자 ~
CF) 오류해결
VIEW를 만들면 N.ID, N.TITLE ... 이렇게 N. M. .. 이런게 사라지게 됨
-> 새로 만들어지는 것
그래서 칼럼명이 겹치면 안된다는 아주 간단한 문제였다.
오늘 꼭 복습할 거
추후 '유니온'이 남아있음 -> JSP 가서 코드 완성
59일차. DB 12 - 모델링 (개념설계 실습) (0) | 2021.05.13 |
---|---|
58일차. DB 11 - 모델링 (개념설계, 논리설계) (0) | 2021.05.12 |
56일차. DB 10 - JOIN (0) | 2021.05.10 |
55일차. DB 9 - JOIN (INTRO) (0) | 2021.05.07 |
Oracle 기본 함수 정리 (0) | 2021.04.30 |