* Exam08_01 ~ 04 (전체코드는 아래 git 링크 참고)
https://github.com/eomcs/eomcs-docs/tree/master/sql
* Join
* 조인
=> 서로 관련된 테이블의 데이터를 연결하여 추출하는 방법
=> 기법
1) CROSS 조인(=Cartesian product)
-- 1) CROSS 조인(=Cartesian product) - 두 테이블의 데이터를 1:1로 모두 연결한다.
select b.bno, title, content, fno, filepath, a.bno
from board1 as b cross join attach_file1 as a;
2) NATURAL 조인
-- board3의 no와 attach_file3의 no는 PK/FK 관계가 아니다.
-- 그럼에도 불구하고 이름이 같기 때문에 이 컬럼을 기준으로 데이터를 연결한다.
select b.no, title, content, a.no, filepath, bno
from board3 b natural join attach_file3 a;
-- 고전 문법 :
-- 고전 문법에서는 where 절의 조건으로 두 테이블의 조인 기준이 되는 컬럼 값을 검사하기 때문에
-- 실행 결과는 정상적으로 나온다.
select b.no, title, content, a.no, filepath, bno
from board3 b, attach_file3 a
where b.no = a.bno;
3) JOIN ~ USING(컬럼명)
-- 3) JOIN ~ USING
-- 같은 이름을 가진 컬럼이 여러 개 있을 경우 USING을 사용하여 컬럼을 명시할 수 있다.
select b.bno, b.title, content, a.fno, a.title, a.bno
from board4 b join attach_file4 a using (bno);
-- join ~ using 의 한계
-- => 두 테이블에 같은 이름의 컬럼이 없을 경우 연결하지 못한다.
select no, title, content, fno, filepath, bno
from board5 b join attach_file5 a using (bno);
4) JOIN ~ ON
-- 4) JOIN ~ ON
-- 조인 조건을 on에 명시할 수 있다
-- 조건에 일치하는 경우에만 두 테이블의 데이터를 연결한다.
-- 이런 조인을 'inner join' 이라 부른다.
select no, title, content, fno, filepath, bno
from board5 b join attach_file5 a on b.no=a.bno;
-- SQL 문에서도 inner join 이라 기술할 수 있다.
-- 물론 inner를 생략할 수도 있다
select no, title, content, fno, filepath, bno
from board5 b inner join attach_file5 a on b.no=a.bno;
5) OUTER JOIN
-- 조인 조건에 일치하는 데이터가 없더라도 두 테이블 중에서 한 테이블의 데이터를
-- 결과로 포함시키는 명령이다.
-- 문법:
-- select 컬럼명, 컬럼명, ...
-- from 테이블1 t1 [left|right] outer join 테이블2 t2 on t1.컬럼=t2컬럼
-- left outer join => 왼쪽 테이블의 데이터는 반드시 포함시키라는 뜻이다.
-- right outer join => 오른쪽 테이블의 데이터를 반드시 포함시키는 뜻이다.
select no, title, content, fno, filepath, bno
from board5 b left outer join attach_file5 a on b.no=a.bno
order by no desc;
* 조인 연습문제
-- 조인 연습
-- 문제:
-- 모든 멤버의 번호와 이름을 출력하라!
-- 단 학생의 경우 재직여부도 출력하라!
-- 1) 모든 멤버 데이터 출력하기
select mno, name
from memb;
-- 2) 학생 데이터를 가져와서 연결하기
select mno, name, work
from memb natural join stnt;
-- 3) join ~ using으로 연결하기
select mno, name, work
from memb join stnt using(mno);
-- 4) 고전 문법으로 연결하기
select memb.mno, name, work
from memb, stnt
where memb.mno=stnt.mno;
-- 5) inner join ~ on 연결하기
select memb.mno, name, work
from memb inner join stnt on memb.mno=stnt.mno;
-- 6) inner 생략하기
select memb.mno, name, work
from memb join stnt on memb.mno=stnt.mno;
-- 7) 테이블에 별명 부여하기
select m.mno, name, work
from memb m join stnt s on m.mno=s.mno;
/*
안타깝게도 위의 SQL문은 학생 목록만 출력한다.
왜?
- memb테이블의 데이터와 stnt 테이블의 데이터를
연결할 때 mno가 같은 데이터만 연결하여 추출하기 때문이다.
해결책!
- 상대 테이블(stnt)에 연결할 대상(데이터)이 없더라도
select에서 추출하는 방법
*/
-- 8) outer join ~ on 으로 연결하기
select m.mno, name, work
from memb m left outer join stnt s on m.mno=s.mno;