JOIN의 종류
조인 유형 | 내용 | |
내부조인 INNER JOIN | 두 테이블에 공통으로 존재하는 칼럼을 이용하는 방식 (공통 컬럼 기반) | |
동등 조인 EQUI JOIN | 공통 존재 칼럼의 값이 같은 경우를 추출 | |
자연 조인 NATURAL JOIN | 두 테이블의 모든 컬럼을 비교하여 같은 컬럼명을 가진 모든 컬럼 값이 같은 경우를 추출 | |
교차 조인 CROSS JOIN | 조인 조건이 없는 모든 데이터의 조합을 추출 | |
외부 조인 OUTER JOIN | 특정 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출 | |
왼쪽 외부 조인 LEFT OUTER JOIN | 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출 | |
오른쪽 외부 조인 RIGHT OUTER JOIN | 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출 | |
완전 외부 조인 FULL OUTER JOIN | 양쪽의 모든 데이터를 추출 |
1. INNER JOIN 내부 조인
select SU.hakno, STU.uname, SU.gcode, GW.gname, GW.ghakjum from tb_sugang SU inner join tb_student STU on SU.hakno=STU.hakno inner join tb_gwamok GW on SU.gcode=GW.gcode order by SU.hakno; |
-> inner join 의 inner는 생략가능하다 .

문제) 학번별 수강신청과목의 총 학점을 조회
select SU.hakno, STU.uname, sum(GW.ghakjum) from tb_sugang SU inner join tb_student STU on SU.hakno=STU.hakno inner join tb_gwamok GW on SU.gcode=GW.gcode group by SU.hakno, STU.uname order by SU.hakno; |

문제) 디자인교과목 대상으로 학번별 수강신청과목의 총 학점을 조회
select AA.hakno, STU.uname, AA.총학점 from( select SU.hakno, sum(GW.ghakjum) as 총학점 from tb_sugang SU join tb_gwamok GW on SU.gcode=GW.gcode where GW.gcode like 'd%' group by SU.hakno ) AA join tb_student STU on AA.hakno=STU.hakno order by AA.hakno; |

-> 강사님 풀이
select CC.hakno, STU.uname, CC.총학점 from( select BB.hakno, sum(BB.ghakjum) 총학점 from( select AA.hakno, AA.gcode, GW.ghakjum from( select hakno, gcode from tb_sugang where gcode like 'd%' ) AA join tb_gwamok GW on AA.gcode=GW.gcode ) BB group by BB.hakno ) CC join tb_student STU on CC.hakno=STU.hakno; |
문제) 과목코드 p001을 신청한 학생들의 명단을 조회
select SU.gcode, GW.gname, SU.hakno, STU.uname from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno join tb_gwamok GW on SU.gcode=GW.gcode where SU.gcode='p001'; |

문제) 프로그램 교과목 중에서 학점이 제일 많은 과목을 신청한 학생들 명단 조회
select SU.gcode, STU.uname, SU.hakno, GW.gname from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno join tb_gwamok GW on SU.gcode=GW.gcode where GW.ghakjum=3; |

-> 선생님 풀이
--프로그램 교과목조회 select * from tb_gwamok where gcode like 'p%'; --프로그램 교과목 중에서 가장 많은 학점 조회 select max(ghakjum) from tb_gwamok where gcode like 'p%'; --프로그램 교과목 중에서 가장 많은 학점을 가진 교과목들 조회 select gcode, ghakjum from tb_gwamok where ghakjum = (select max(ghakjum) from tb_gwamok where gcode like 'p%') and gcode like 'p%'; |
문제) 수강신청을 하지 않은 학생들의 명단을 조회하시오
--수강신청을 한 학생들 select hakno from tb_sugang SU group by hakno --수강신청을 하지 않은 학생들 select hakno, uname from tb_student where hakno not in ( select hakno from tb_sugang SU group by hakno); |

2. OUTER JOIN 외부조인
1) left outer join
: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터 추출
1) select STU.hakno, STU.uname, STU.phone, SU.gcode 2) select STU.hakno, STU.uname, SU.gcode 3) |

2) right outer join
: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출
1) select STU.hakno, STU.uname, STU.phone, SU.gcode 2) select STU.hakno, STU.uname, SU.gcode |

문제) 수강신청을 하지 않은 학생들의 명단을 조회하시오
- 방법 1
--수강신청한 과목 select gcode from tb_sugang group by gcode --수강신청하지 않은 과목 select gcode from tb_gwamok where gcode not in ( select gcode from tb_sugang group by gcode ); |
- 방법 2 : left join
-> left join 명령문을 적은 후 where조건절로 gcode에 null값이 들어가 있는 것을 찾는다.
select GW.gcode, GW.gname, GW.ghakjum, SU.gcode |
- 방법 3 : right join
-> right join 명령문을 적은 후 where조건절로 gcode에 null값이 들어가 있는 것을 찾는다.
select SU.gcode, 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; |

'공부 > SQL 활용' 카테고리의 다른 글
7월29일 - SQL활용 9 : rownum (0) | 2019.07.30 |
---|---|
7월30일 - SQL 활용 8 : 트랜잭션 (0) | 2019.07.30 |
7월26일 - SQL활용 6 : 학사관리프로그램 (0) | 2019.07.26 |
7월25일 - SQL 활용 5 : JOIN (0) | 2019.07.25 |
7월24일 - SQL활용 4 : View & Index (0) | 2019.07.24 |