[DB] 순수 관계 연산자: INNER JOIN

젠니·2023년 6월 4일
0

데이터베이스

목록 보기
15/21

8. INNER JOIN

JOIN 성립 조건

  • 두 테이블에 공통된 조인 속성을 가지고 있어야 한다.
    - 보통 PK와 FK 연관에 의해 성립된다. (equi-join)

    - 특별한 경우, PK-FK 관계가 없어도 논리적인 값들의 연관만으로 조인이 성립 가능하다.

ON절

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;

Equi-Join 연산

선수들의 이름, 백넘버, 소속 팀명 및 팀 연고지를 검색하라.

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절

두 테이블의 조인 속성 이름이 같을 때 사용한다.
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;

profile
젠니의 개발 라이푸우

0개의 댓글