JOIN 성립 조건
- 두 테이블에 공통된 조인 속성을 가지고 있어야 한다.
- 보통 PK와 FK 연관에 의해 성립된다. (equi-join)
- 특별한 경우, PK-FK 관계가 없어도 논리적인 값들의 연관만으로 조인이 성립 가능하다.
Format
SELECT t1.c1, t2.c2, …
FROM t1 JOIN t2 ON t1.c1 = t2.c2
WHERE 검색조건;
Example
SELECT PLAYER.PLAYER_NAME 선수명, TEAM.TEAM_NAME 소속팀명
FROM PLAYER JOIN TEAM ON PLAYER.TEAM_ID = TEAM.TEAM_ID;
선수들의 이름, 백넘버, 소속 팀명 및 팀 연고지를 검색하라.
SELECT PLAYER.PLAYER_NAME, PLAYER.BACK_NO, PLAYER.TEAM_ID,
TEAM.TEAM_NAME, TEAM.REGION_NAME
FROM PLAYER JOIN TEAM ON PLAYER.TEAM_ID = TEAM.TEAM_ID;
PLAYER 테이블과 TEAM 테이블을 JOIN 한다. 어떤 조건일 때?
-> PLAYER 테이블의 TEAM_ID 가 TEAM 테이블의 TEAM_ID 와 같을 때 !
포지션이 'GK'인 선수들의 이름, 백넘버, 소속 팀명 및 팀 연고지를 검색하라. 단, 백넘버의 오름차순으로 출력하라.
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 백넘버, P.TEAM_ID 팀코드,
T.TEAM_NAME 소속팀, T.REGION_NAME 연고지
FROM PLAYER P JOIN TEAM T ON P.TEAM_ID = T.TEAM_ID
WHERE P.POSITION = 'GK'
ORDER BY P.BACK_NO;
팀 정보와 그 팀의 전용구장 정보를 같이 출력하라.
SELECT T.TEAM_NAME, T.REGION_NAME, S.STADIUM_ID,
S.STADIUM_NAME, S.SEAT_COUNT
FROM TEAM T JOIN STADIUM S ON T.STADIUM_ID = S.STADIUM_ID;
선수, 소속 팀, 그 팀의 전용구장 정보를 같이 출력하라.
SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션,
T.TEAM_NAME 소속팀, T.REGION_NAME 연고지,
S.STADIUM_NAME 전용구장, S.SEAT_COUNT 좌석수
FROM PLAYER P
JOIN TEAM T ON P.TEAM_ID = T.TEAM_ID
JOIN STADIUM S ON T.STADIUM_ID = S.STADIUM_ID
ORDER BY 선수명;
조인을 여러번 하는 경우이고, 순서는 상관없다.
두 테이블의 조인 속성 이름이 같을 때 사용한다.
USING 뒤의 괄호는 필수이다.
Format
SELECT t1.c1, t2.c2, …
FROM t1 [[INNER] JOIN t2 USING (조인_속성_리스트)]⁺ /* 예: (c1, c2) */
WHERE 검색조건;
Example
WITH TEAM_TEMP AS
(
SELECT TEAM_ID, TEAM_NAME, STADIUM_ID
FROM TEAM
),
STADIUM_TEMP AS
(
SELECT STADIUM_ID, STADIUM_NAME, SEAT_COUNT
FROM STADIUM
)
SELECT *
FROM TEAM_TEMP JOIN STADIUM_TEMP USING (STADIUM_ID);
ON절의 경우 출력이 다음과 같다.
GK 포지션의 선수마다 팀 연고지명, 팀명, 구장명을 출력하라.
SELECT PLAYER_NAME 선수명, POSITION 포지션, REGION_NAME 연고지명,
TEAM_NAME 팀명, STADIUM_NAME 구장명
FROM PLAYER
JOIN TEAM USING (TEAM_ID)
JOIN STADIUM USING (STADIUM_ID)
WHERE POSITION = 'GK'
ORDER BY 선수명;
홈팀이 3점 이상 차이로 승리한 경기의 경기장 이름, 경기 일정, 홈팀 이름과 원정팀 이름 정보를 출력하라.
SELECT STADIUM_NAME 경기장명, SCHE_DATE 경기일정,
HT.TEAM_NAME 홈팀명, AT.TEAM_NAME 원정팀명,
HOME_SCORE '홈팀 점수', AWAY_SCORE '원정팀 점수'
FROM SCHEDULE SC
JOIN STADIUM ST ON SC.STADIUM_ID = ST.STADIUM_ID
JOIN TEAM HT ON SC.HOMETEAM_ID = HT.TEAM_ID
JOIN TEAM AT ON SC.AWAYTEAM_ID = AT.TEAM_ID
WHERE HOME_SCORE >= AWAY_SCORE + 3;