1장_9절. 조인(JOIN)

1. JOIN 개요
->두개 이상의 테이블과 연결,결합하여 데이터를 출력하는 것.
->대부분의 SQL문장의 상당수가 JOIN이다.
->RDBMS(Relation Datebase Management System : 관계형 데이터베이스 관리시스템)의 핵심기능
->일반적으로 PK(주키), FK(외래키)의 연관으로써 JOIN성립

#중요 : from절에 여러개의 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 두개의 테이블만에만 JOIN이 일어난다

ex) (((a join d) join c) join b)
1.a와 d를 조인하고 
2.결과 집합을 c와 조인처리
3.결과 집합을 b와 조인처리

2. EQUL JOIN(equal join : 등가 조인)
->두 개 테이블 간의 column값이 일치하는 경우에 사용됨
->JOIN조건은 where절에 '='연산자를 사용해서 기술됨
->"테이블.칼럼명"처럼 테이블명과 칼럼명이 같이 나타난다.
   why테이블과 칼럼명을 모두 나타냄??
   (1)칼럼명만 사용하면 각각의 테이블에서 칼럼명이 동일할 수 있기 때문에 파싱단계에서 에러가 발생
   (2)sql사용자가 조회할 데이터를 알기 쉽게함(가독성,유지보수성 향상)
->from절에 n개의 테이블이 표시되어있다면 join조건은 n-1개 이상이 필요하다.
  ex) from a,b,c,d,e 이면 join조건을 4개 이상으로 기술하지 않으면 에러발생

방법(1) where절에 join조건을 표시한다.
SQL> select 테이블1.칼럼명, 테이블2.칼럼명
  2  from 테이블1, 테이블2
  3  where 테이블1.칼럼명 = 테이블2.칼럼명;
방법(2) on절에 join조건을 넣는다(ANSI/ISO SQL표준방식)
SQL> select 테이블1.칼럼명, 테이블2.칼럼명
  2  from 테이블1 inner join 테이블2
  3  on 테이블1.칼럼명 = 테이블2.칼럼명;

2-가)선수-팀 EQUL JOIN사례 : 선수테이블과 팀 테이블에서 K-리그 소속 선수들의 이름, 백넘버, 소속되어있는 팀명, 연고지를 출력하라
방법(1)where절 사용
SQL> select player.player_name, player.back_no, player.team_id,
  2  team.team_name, team.region_name
  3  from player, team
  4  where player.team_id = player.team_id;
방법(2)on절 사용
SQL> select player.player_name, player.back_no, player.team_id,
  2  team.team_name, team.region_name
  3  from player inner join team
  4  on player.team_id =  team.team_id;
방법(3)alias 사용
SQL> select P.player_name, P.back_no, P.team_id,
  2  T.team_name, T.region_name
  3  from player P, team T
  4  where P.team_id = T.team_id;

#alias사용시, 주의사항
1)대문자, 소문자는 구문하지 않는다. (P와 p는 같음, T와 t는 같음)
2)alias를 정하였으면, 테이블명을 쓸 수 없다.(player의 alias를 p나P로 정하였으면, 
player.player_name은 사용X
p.player_name은 사용O
P.player_name도 사용O)

#alias의 대소문자 구분 안하는 SQL문
SQL> select p.player_name, P.back_no, p.team_id,
  2  t.team_name, T.region_name
  3  from player P, team t
  4  where p.team_id = T.team_id;

2-나). 선수-팀 where절 검색 조건 사례 : where절에 골키퍼인 선수들에 대한 데이터만을 백넘버 순(오름차순)으로 출력하라
방법(1) inner join사용
SQL> select p.player_name 선수이름, p.back_no 백넘버,
  2  t.region_name 연고지, t.team_name 팀명
  3  from player p inner join team t
  4  on p.team_id = t.team_id
  5  where p.position = 'GK'
  6  order by 백넘버 asc;
방법(2) where절에 join조건 적용
SQL> select p.player_name 선수이름, p.back_no 백넘버,
  2  t.region_name 연고지, t.team_name 팀명
  3  from player p, team t
  4  where p.team_id = t.team_id
  5  and p.position = 'GK'
  6  order by 백넘버 asc;

#inner조인과 그냥 조인 차이점?
(1)inner조인을 사용할 경우 from~on절에서 조인을 하므로 where절에서는 조인된 상태에서 다른 조건들을 비교하기만 한다
(2)그냥 조인을 사용할 경우 where절에서 조인을 하므로, 조건을 비교한다는 where절의 원래 목적과 안맞는다???
=>inner join ~ on 이 좋음??

2-다) 팀-구장 EUQL JOIN사례 : 팀테이블과 구장테이블의 관계를 이용해, 소속팀이 가지고 있는 전용구장의 정보를 팀의 정보와 함께 출력
방법(1)
SQL> select t.region_name, t.team_name, t.stadium_id,
  2  s.stadium_name, s.seat_count
  3  from team t inner join stadium s
  4  on t.stadium_id = s.stadium_id;
방법(2)
SQL> select region_name, team_name, t.stadium_id,
  2  stadium_name, seat_count
  3  from team t inner join stadium s
  4  on t.stadium_id = s.stadium_id;

#방법1과 2의 차이점
select 문에서 regoin_name, team_name, stadium_name, seat_count는 SQL문장에서 유일하게 사용되는 칼럼명으로 중복되지 않으므로, 앞에 "테이블명."을 붙이지 않아도되며
stadium_id는 team테이블과 stadium테이블 모두에서 쓰이므로"t.stadium_id, s.stadium_id"로 앞에 "테이블명."을 붙여야한다.

3.Non EQUL JOIN
->비등가 join
->두 개의 테이블간에 칼럼 값들이 일치하지 않는 경우에 사용한다.
->연산자 "="가 등가조인, 연산자 "Between, >, >=, <, <="가 비등가조인
->두 개의 테이블이 PK-FK 연관관계를 가지지 않을때 Non EQUL JOIN을 사용한다.

방법
SQL> select 테이블1.칼럼명, 테이블2, 칼럼명
  2  from 테이블1, 테이블2
  3  where 테이블1.칼럼명 between 테이블2.칼럼명 and 테이블2.칼럼명2;

예제)사원들이 받고있는 급여가 어느 등급인지 출력하라.
SQL> select e.ename 사원명, e.job 직무, e.sal 현재급여, s.grade 급여등급
  2  from emp e, salgrade s
  3  where e.sal between s.losal and s.hisal;
결과)

4. 3개 이상의 TABLE JOIN
->테이블A의 정보와 테이블C의 정보를 모두 출력하고싶다.
->테이블A와 테이블C사이에 FK관계가 없다.
->테이블A는 테이블B와, 테이블B는 테이블C와 FK관계가있다.
->3개 이상의 TABLE JOIN을 사용함

예제) player 테이블의 소속팀코드가 team 테이블의 팀코드와 PK-FK관계이고, 
stadium 테이블의 운동장코드가 team 테이블의 전용구장코드와 PK=FK관계이다.
K01, K03에 대한 정보를 출력
방법1)where절에 join 사용
SQL> select p.player_name 선수명, p.position 포지션,
  2  t.region_name 연고지, t.team_id 팀, t.team_name 팀명,
  3  s.stadium_name 구장명
  4  from player p, team t, stadium s
  5  where t.team_id in('K01','K03')
  6  and p.team_id =  t.team_id
  7  and t.stadium_id = s.stadium_id
  8  order by 팀, 선수명;
방법2)inner join사용
SQL> select p.player_name 선수명, p.position 포지션,
  2  t.region_name 연고지, t.team_id 팀, t.team_name 팀명,
  3  s.stadium_name 구장명
  4  from player p inner join team t
  5  on p.team_id = t.team_id
  6  inner join stadium s
  7  on t.stadium_id = s.stadium_id
  8  where t.team_id in('K01','K03')
  9  order by 팀, 선수명;
결과)

예제2)골키퍼만 출력하되, 백넘버->팀명순으로 정렬하여 출력하기(where절 사용하기)
SQL> select p.player_name 선수명, p.position 포지션, p.back_no 백넘버,
  2  t.region_name 연고지, t.team_id 팀, t.team_name 팀명,
  3  s.stadium_name 구장명
  4  from player p inner join team t
  5  on p.team_id = t.team_id
  6  inner join stadium s
  7  on t.stadium_id = s.stadium_id
  8  where p.position = 'GK'
  9  order by p.back_no, 팀;
결과)

댓글

이 블로그의 인기 게시물

1장_1절 관계형 데이터베이스 개요

1장_2절 DDL(Data Definition Language : 데이터 정의어)

1장_5절. Where 조건절