• 6주차 과제 - JOIN
  • 실습 환경 : Oracle
  • 해결 날짜 : 2021-04-09

  • 과제

    • 6-1) [예제1-*]을 변형하여 EMP와 DEPT 테이블을 조인하우여 사원번호와 사원이름, 부서번호, 부서이름을 출력하는 SQL문을 작성하라. [1점]

      • SQL문 :
      SELECT E.EMPNO AS "사원 번호", E.ENAME AS "사원 이름"
              , D.DEPTNO AS "부서 번호", D.DNAME AS "부서 이름"
      FROM EMP E, DEPT D
      WHERE E.DEPTNO = D.DEPTNO;
      
      • 실행 결과 :

      image

    • 6-2) [예제2]를 변형하여 TEAM, STADIUM, SCHEDULE 테이블을 조인하여 경기일과 구장명, 홈팀이름, 원정팀이름을 출력하는 SQL문을 작성하라. (단, 경기일과 구장명 순으로 오름차순 정렬하여 출력하라.) [2점]

      • SQL문 :
      SELECT SC.SCHE_DATE AS "경기일", ST.STADIUM_NAME AS "구장명",
              (SELECT T.TEAM_NAME FROM TEAM T WHERE T.TEAM_ID = SC.HOMETEAM_ID) AS "홈팀 이름",
              (SELECT T.TEAM_NAME FROM TEAM T WHERE T.TEAM_ID = SC.AWAYTEAM_ID) AS "원정팀 이름"
      FROM TEAM T, STADIUM ST, SCHEDULE SC
      WHERE T.STADIUM_ID = ST.STADIUM_ID
          AND ST.STADIUM_ID = SC.STADIUM_ID
      ORDER BY 경기일 ASC, 구장명 ASC;
      
      • 실행 결과 :

      image

    • 6-3) [예제2]를 변형하여 NATURAL JOIN을 하는 한글 질의문과 SQL문을 작성하라. [1점]

      • 한글 질의문 : PLAYER 테이블과 TEAM 테이블에서 NATURAL JOIN을 사용해 팀명, 선수명, 포지션, 생년월일을 찾아 출력하라.

      • SQL문 :

      SELECT TEAM_NAME AS "팀명", PLAYER_NAME AS "선수명"
          , POSITION AS "포지션", BIRTH_DATE AS "생년월일"
      FROM PLAYER NATURAL JOIN TEAM;
      
      • 실행 결과 :

      image

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

      • 한글 질의문 : SCHEDULE 테이블과 STADIUM 테이블에서 ON 조건절을 이용해 조인하여 경기일, 구장명, 홈팀 점수 및 원정팀 점수를 출력하되, 홈팀이 승리한 경우에만 출력하라.

      • SQL문 :

      SELECT SC.SCHE_DATE AS "경기일", ST.STADIUM_NAME AS "구장명",
              SC.HOME_SCORE AS "홈팀 점수", SC.AWAY_SCORE AS "원정팀 점수"
      FROM SCHEDULE SC JOIN STADIUM ST
      ON SC.STADIUM_ID = ST.STADIUM_ID
      WHERE SC.HOME_SCORE > SC.AWAY_SCORE;
      
      • 실행 결과 :

      image

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

      • SQL문 :
      SELECT *
      FROM STADIUM CROSS JOIN TEAM;
      
      • 인출된 행의 개수 : 20(STADIUM 행 개수) X 15(TEAM 행 개수) = 300개

      • 실행 결과 :

      image

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

      • SQL문 :
      SELECT *
      FROM STADIUM S RIGHT OUTER JOIN TEAM T
      ON S.STADIUM_ID = T.STADIUM_ID;
      
      • 인출된 행의 개수 : 우측 테이블인 TEAM의 행의 개수인 15개

      • 실행 결과 :

      image

    • 6-7) [예제10]을 수행해 보고, 6-5와 6-6에서 수행한 SQL문과 함께 결과를 비교하라. [2점]

      • SQL문 :
      SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
      FROM STADIUM LEFT OUTER JOIN TEAM
      ON STADIUM.HOMETEAM_ID = TEAM.TEAM_ID
      ORDER BY HOMETEAM_ID;
      
      • 실행 결과 :

      image

      • 비교 결과 :
        • 6-5의 CROSS JOIN은 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 의미하기 때문에 좌측 테이블인 STADIUM과 우측 테이블인 TEAM 사이의 모든 경우의 수를 산출하여 20*15=300개의 행이 출력된다.
        • 6-6의 RIGHT OUTER JOIN은 우측 테이블인 TEAM에서 데이터를 모두 읽은 후, 좌측 테이블인 STADIUM에서 JOIN 대상 데이터를 읽어 온다. 이 때 STADIUM에서 조인 조건 값이 없는 경우 TEAM의 column 값을 NULL로 채운다. 즉, 우측 테이블에서 데이터를 읽어오고, 좌측 테이블에서도 채우되 조인 조건 값이 없는 경우에만 NULL값으로 채운다.
        • 6-7의 LEFT OUTER JOIN은 좌측 테이블인 STADIUM에서 데이터를 모두 읽은 후, 우측 테이블인 TEAM에서 JOIN 대상 데이터를 읽어 온다. 이 때 TEAM에서 조인 조건 값이 없는 경우(홈팀이 없는 경기장인 경우) TEAM의 column 값을 NULL로 채운다. 즉, 좌측 테이블에서 데이터를 읽어오고, 우측 테이블에서도 채우되 조인 조건 값이 없는 경우에는 NULL값으로 채운다.
        • 따라서 6-5의 CROSS JOIN은 테이블 간의 가능한 모든 경우의 수를, 6-6의 RIGHT OUTER JOIN은 우측 테이블에서 먼저 읽고 좌측 테이블도 읽되 조인 조건 값이 없는 경우에만 NULL로 채우고, 6-7의 LEFT OUTER JOIN은 RIGHT OUTER JOIN과 반대로 좌측 테이블에서 먼저 읽고 우측 테이블도 읽되 조인 조건 값이 없는 경우에만 NULL로 채운다.