2 minute read

  1. INNER JOIN
  2. NATURAL JOIN
  3. USING 조건절
  4. ON 조건절

INNER JOIN

  • OUTER(외부) JOIN에 대비하여 내부조인이라고 하며, JOIN조건에서 동일한 값이 있는 행만 반환한다.
  • INNER JOIN 표시는 WHERE절에서 사용하고 있던 JOIN조건을 FROM절에서 사용하겠다는 의미이므로 USING이나 ON조건절을 필수적으로 사용해야한다.
  • inner은 생략가능 (default값이기 떄문)
  • 사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다.

    WHERE 절 JOIN 조건

    SELECT EMP.deptno , EMPNO, ENAME, DNAME
    FROM EMP, DEPT
    WHERE EMP.DEPTNO = DEPT.DEPTNO;
    

    FROM 절 JOIN조건

    SELECT EMP.deptno , EMPNO, ENAME, DNAME
    FROM EMP INNER JOIN DEPT
    ON EMP.deptno = DEPT.deptno;
    
    INNER 키워드 생략
    SELECT EMP.deptno , EMPNO, ENAME, DNAME
    FROM EMP JOIN DEPT
    ON EMP.DEPTNO = DEPT.DEPTNO;
    

NATURAL JOIN

  • 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행
  • 별도의 join칼럼을 지정하지 않아도 공통된 칼럼을 자동으로 인식하여 join을 처리한다.

      SELECT DEPTNO, EMPNO, DNAME
      FROM EMP NATURAL JOIN dept;
    

USING 조건절

  • NATURAL JOIN에서는 모든 일치되는 칼럼들에 대해 JOIN이 일어나지만, FROM절의 USING조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 JOIN할수 있다.

    SELECT DEPNO, DNAME, DEPT.LOC
    FROM DEFT JOIN DEPT_TEMP
    USING (DEPTNO, DNAME);
    

ON 조건절

  • JOIN 서술부 (ON부분)과 JOIN 서술부 (WHERE 조건절)를 분리하여 이해가 쉬우며, 칼럼명이 다르더라고 JOIN 조건을 사용할 수 있응 장점이 있다.

    SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
    FROM EMP E JOIN DEPT D
    ON (E.DEPTNO = D.DEPTNO);
    
  • ON 조건절과 WHERE 검색 조건은 충돌 없이 사용할 수 있다.
    WHERE절의 JOIN조건과 같은 일을 하면서도, 명시적으로 JOIN조건을 구분할수 있다.

    부서코드 30인 부서의 소속 사원 이름 및 부서코드, 부서이름을 찾아본다. SQL문

    SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME
    FROM EMP E JOIN DEPT D
    ON (E.DEPTNO = D.DEPTNO)
    WHERE E.DEPTNO = 30;
    

과제 풀이 : 6주차 join과제


6-3 : NATURAL JOIN을 하는 한글 질의문과 SQL문을 작성하라. [1점]

한글 질의문 : 선수 이름, 선수아이디, 팀이름, 팀아이디를 찾아본다.

SQL문

SELECT PLAYER_NAME, PLAYER_ID, TEAM_NAME, TEAM_ID
FROM PLAYER  NATURAL JOIN TEAM;


6-4 : SCHEDULE과 STADIUM 테이블을 ON 조건절을 이용하여 조인하여 경기일과 구장명, 홈팀 점수 및 원정팀 점수를 출력하는 한글 질의문과 SQL문을 작성하라.
(단, WHERE 절로 조건을 지정하여 특정 조건에 맞는 행만을 출력하라.) [2점]

SQL문

SELECT SCHE_DATE 경기일, STADIUM_NAME 구장명, HOME_SCORE 홈팀점수 , AWAY_SCORE 원정팀점수
FROM SCHEDULE SC JOIN STADIUM ST
ON (SC.STADIUM_ID = ST.STADIUM_ID)
WHERE SC.STADIUM_ID IN ('B01', 'B02');


6-5 : CROSS JOIN(p. 243)을 참고하고, STADIUM을 좌측, TEAM을 우측 테이블로 하는 CROSS JOIN을 수행하는 SQL문을 작성하고, 인출된 행의 개수를 작성하라. [1점]

SQL문

SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
FROM STADIUM CROSS JOIN TEAM;


6-6 : RIGHT OUTER JOIN(p. 248)을 참고하고, STADIUM을 좌측, TEAM을 우측 테이블로 하는 RIGHT OUTER JOIN을 수행하는 SQL문을 작성하고, 인출된 행의 개수를 작성하라. [1점]

SQL문

SELECT STADIUM_NAME, S.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
FROM STADIUM S RIGHT OUTER JOIN TEAM T
ON S.STADIUM_ID  =T.STADIUM_ID
ORDER BY HOMETEAM_ID;