- 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;
- 실행 결과 :
-
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;
- 실행 결과 :
-
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;
- 실행 결과 :
-
-
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;
- 실행 결과 :
-
-
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개
-
실행 결과 :
-
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개
-
실행 결과 :
-
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;
- 실행 결과 :
- 비교 결과 :
- 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로 채운다.
-