오늘은 SELECT 구문에서 JOIN, UNION, VIEW를 학습하였습니다.

Today I Learned
JOIN
- 정규화로 쪼개놓은 테이블들을 이어서(합쳐서) 활용할 수 있도록 하는 방법
- inner join, outer join, self join, cross join(cartesian product)
- from 절에 들어가는 연산
- select * from member inner join notice on member.? = notice.?;
- 평범한 inner join의 모습이다.(이런경우 주인공은 자식이다)
Inner Join
- 테이블 간에 관계가 있는 것들만 뽑아내는 것.
- 연습
- 회원의 목록과 그 회원이 작성한 게시글의 수를 출력하시오
- select m.*, n.c from member m inner join (select writer_id, count(id) c from notice group by writer_id) n on m.nicnake=n.writer_id;
- select m.nicname, m.pwd, count(n.id) from member m join notice n on m.nicname=n.writer_id group by m.nicname, m.pwd;
- 이 두 쿼리는 동일한 결과를 가져온다. 하지만, 서브쿼리는 최대한 안쓰는게 좋다.
Outer Join
- 관계가 있던 없던 간에 outer들도 모두 포함시켜서 조인하자
- left, right, full
- 왼쪽(오른쪽) 또는 양쪽에 있는 outer를 모두 끼워서 조회하자!
- select * from member left outer join notice on member.nicname=notice.writer_id;
- 조인 하되, 게시글을 쓰지 않은 멤버도 포함해서 조인하는 것
JOIN시 유의사항
- 조인은 무조건 주인공이 있어야 한다.
- 보통 inner join은 자식이 주인공이다.
- 하지만 부모가 주인공이 될 수도 있다.
- 부모가 주인공인 경우, 자식의 내용을 붙이려면 통계만 붙일 수 있다.(그렇지 않으면 자식의 갯수만큼 부모가 늘어나는 현상 발생)
- 누가 중심인지를 정확히 파악하자.
- outer 조인의 경우 방향쪽이 주인공이다.(left는 왼쪽 것이 주인공)
3중 JOIN
- 글을 쓴 회원을 게시글과 함께 댓글까지 출력하시오
- select * from member m right join notice n on m.nicname=n.writer_id left join "comment" c on n.id=c.notice_id;
VIEW
- 화면상에 보여지는 데이터와, 실제 데이터베이스의 구조는 다르다.
- 화면상에 보이는 것처럼 테이블을 합쳐서 마치 실제 존재하는 테이블인 것 처럼 두고 쓸 수 있다.
- 개념적인 가상테이블이다.
- join으로 만들어 둔 테이블을 VIEW로 만들어서 쓸 수 있음.
- VIEW에는 order by와 where절을 넣지 않는다.(만들어진 view를 정렬하거나 조건으로 탐색해야함)
- CREATE VIEW 뷰이름 AS SELECT ~~~~;
UNION
- 테이블의 레코드들을 통합하고자 할때 사용.
- 합칠 테이블의 컬럼 수를 맞춰줘야 한다.
- select col1, col2 from table1 UNION select col3, col4 from table2;
- UNION, UNION ALL, MINUS, INTERSECT
- UNION : 중복 제거(한 테이블 내에서 중복되는것도 제거된다)
- UNION ALL : 중복 포함하여 통합
- MINUS : 같은 레코드를 제거하고 남은 것(테이블 간 차집합)
- INTERSECT : 테이블 간 교집합