초급의 끄적거림

[SQL] join의 종류 (inner join / left join / right join) 본문

DB/Oracle

[SQL] join의 종류 (inner join / left join / right join)

codingD 2019. 7. 29. 16:58

 [내부 조인 (inner join)]

⊙ 두 테이블에 공통으로 존재하는 컬럼을 이용하는 방식 (수식어가 없는 조인 → 생략가능)

⊙ 내부 조인 -  동등조인 (equi join)      : 공통존재 칼럼의 값이 같을 경우 추출

                    -  자연조인 (natural join) : 두 테이블의 모든 컬럼을 비교하여 같은 컬럼명을 가진 모든 컬럼 값이 같은 경우 추출

                    -  교차조인 (cross join)    : 조인 조건이 없는 모든 데이터의 조합을 추출

 

 Q. 수강신청한 학생들을 조회하시오

 select STU.hakno, STU.uname, STU.phone, SU.gcode

 from tb_student STU join tb_sugang SU

 on STU.hakno=SU.hakno;

 

 → 내부 조인을 이용할 경우, 공통적인 것만 가져왔기 때문에 수강 신청을 하지않은 학생에 대해서는 알기 어려움

 

[외부 조인 (outer join)]

 특정 테이블의 모든 데이터를 기준으로 다른 테이블의 정보를 추출 (다른 테이블에 값이 없어도 출력가능)

 외부 조인 - 왼쪽 외부 조인 (left outer join) 

                 - 오른쪽 외부 조인 (right outer join)

                 - 완전 외부 조인 (full outer join) : 양쪽의 모든 데이터를 추출

 

 

[왼쪽 외부 조인 (left outer join)]

⊙ 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출

⊙ outer 는 생략가능 → left join

 - 수강신청을 하든 안하든 left에 해당하는 모든 학생들 조회

 select SU.hakno, STU.uname, STU.phone, SU.gcode

 from tb_student STU left outer join tb_sugang SU 

 on STU.hakno=SU.hakno;

 

 

 

 

 

[오른쪽 외부 조인 (right outer join)]

 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출

⊙ outer 는 생략가능 → right join

 - 방향만 바뀌기 때문에 left join과 같은 결과값이 발생

 select SU.hakno, STU.uname, STU.phone, SU.gcode

 from tb_sugang SU right outer join tb_student STU

 on SU.hakno=STU.hakno;

 

 

 

 

 

문1)  수강신청을 하지 않은 과목들을 조회 (left join, right join 활용 - 모든 방법 총동원)

 <방법 1. not in 연산자>

 ① 수강신청을 한 과목들 조회, 같은 과목끼리 그룹을 짓게 함

 select gcode from tb_sugang group by gcode;

 

 ② 수강신청을 하지 않은 과목들을 조회 (수강신청을 한 과목들을 조회 했을 때와는 반대로 조회) 

 - 과목에 대한 정보가 적기 때문에 tb_gwamok 을 join 해서 정보를 늘려줄 수 있음

 - 수강신청한 과목을 제외하는 것을 이용하여 수강신청 하지 않은 과목을 조회함

 

 select gcode

 from tb_gwamok

 where gcode not in (select gcode from tb_sugang group by gcode);

 

 

 

 <방법2. left join & not null>

 ① 과목명을 넣기 위해 tb_gwamok 을 left join 으로 만듦

 select GW.gcode, GW.gname, GW.ghakjum, SU.gcode

 from tb_gwamok GW left join tb_sugang SU

 on GW.gcode=SU.gcode;

 

 - SU.gcode가 null이 나올 수 있는 것은 GW.gcode가 다 들어올 수 있는 것과 다르게 수강처리가 된 것만 적히기 때문에 수강처리가 되지 않은 것에는 null값이 발생

 

 is null 을 이용해 null 이 적힌 것만 모음 (null = 수강신청 X)

 select GW.gcode, GW.gname, GW.ghakjum

 from tb_gwamok GW left join tb_sugang SU

 on GW.gcode=SU.gcode

 where SU.gcode is null;

 

 

 

<방법3. right join & not null>

 ⊙ left join 을 이용한 결과와 right join 을 이용한 결과값이 동일해야 함.

 ①  과목명을 넣기 위해 tb_gwamok 을 right join 으로 만듦

    - 수강신청이 없는 과목에는 null 적힘

 select SU.gcode, GW.gcode, GW.gname, GW.ghakjum

 from tb_sugang SU right join tb_gwamok GW

 on SU.gcode=GW.gcode;

 

 

② is null 을 이용해 null 이 적힌 것만 모음 ( null = 수강신청 X)

 select GW.gcode, GW.gname, GW.ghakjum

 from tb_sugang SU right join tb_gwamok GW

 on SU.gcode=GW.gcode

 where SU.gcode is null; 

 

 

 <left/right join & left/right join 대신 콤마( , ) 와 (+) 사용>

 <left join>

 - left join 이용

 select STU.hakno, STU.uname, SU.gcode

 from tb_student STU left join tb_sugang SU

 on STU.hakno=SU.hakno;

 

 - left join → , 와 (+) 이용 : left에 해당하지 않는 곳에 (+) 붙이기

 select STU.hakno, STU.uname, SU.gcode

 from tb_student STU , tb_sugang SU

 on STU.hakno=SU.hakno(+);

 

 <right join>

 - right join

 select STU.hakno, STU.uname, SU.gcode

 from tb_sugang SU right join tb_student STU

 on SU.hakno=STU.hakno;

 

 - right join → , 와 (+) 이용 : right 에 해당하지 않는 곳에 (+) 붙이기

 select STU.hakno, STU.uname, SU.gcode

 from tb_sugang SU , tb_student STU

 on SU. hakno(+)=STU.hakno;

 

 

 

'DB > Oracle' 카테고리의 다른 글

[SQL] 트랜잭션 (Transaction)  (0) 2019.07.30
[SQL] rownum  (0) 2019.07.29
[SQL] 학사프로그램 inner join 활용  (0) 2019.07.29
[SQL] 학사관리프로그램 만들기  (0) 2019.07.26
[SQL] case when ~ then end 구문 / decode() 함수  (0) 2019.07.25
Comments