일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- distinct
- 모조칼럼
- 부트스트랩
- Bootstrap
- tomcat
- 이클립스
- Oracle DB
- HTML
- Java
- 답변형 게시판
- jQuery
- rownum
- 제약조건
- alias
- Oracle SQL
- HTTP Status 404
- HTTP Status 500
- group by
- ||
- JSP
- JavaScript
- 과정평가형
- oracle
- sql developer
- 성적프로그램
- SQL
- github
- CRUD
- git
- 한글 인코딩
초급의 끄적거림
[SQL] join의 종류 (inner join / left join / right join) 본문
[내부 조인 (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 |