[주간 복습] 5주차 - SQL JOIN

김지환·2024년 3월 31일

inner join, left (outer) join, right (outer) join에 대해서 알아보자

사용할 예시 테이블은 아래와 같다.

users table

idemailname
1kim@gmail.comkim
2lee@gmail.comlee
3park@gmail.compark

channels table

idnameuser_id
1kimtube1
2leetube2

🏄‍♂️ 내부 조인

SELECT [...] FROM [table A] INNER JOIN [table B] ON A.Value = B.Value;

🏄‍♀️ 1. users INNER JOIN channels (명시적)

SELECT * FROM users INNER JOIN channels ON users.id = channels.user_id;

실행 결과

idemailnameidnameuser_id
1kim@gmail.comkim1kimtube1
2lee@gmail.comlee2leetube2

🏄‍♀️ 2. channels INNER JOIN users (명시적)

SELECT * FROM channels INNER JOIN users ON users.id = channels.user_id;

실행 결과

idnameuser_ididemailname
1kimtube11kim@gmail.comkim
2leetube22lee@gmail.comlee

🏄‍♀️ 3. 암시적 표현

SELECT * FROM channels, users WHERE channels.user_id = users.id;

위와 같이 작성한 것을 암시적으로 작성했다고 한다.
실행 결과는 명시적 표현과 동일하게 나온다.
(channels를 먼저 작성할 경우 channels의 fields와 records 먼저 나오고 users가 나온다.)


🏄‍♂️ 외부 조인(LEFT JOIN)

SELECT [...] FROM [table A] LEFT JOIN [table B] ON A.Value = B.Value;

왼쪽 테이블을 중심으로 오른쪽 테이블을 매칭시킨다.
왼쪽의 record는 무조건 표시하고,
오른쪽의 record 중 조건에 맞는 record가 없다면, null로 표시.
오른쪽의 record 중 조건에 맞는 record가 여러 개면, 왼쪽의 record를 여러번 표시.


SELECT u.name AS user_name, c.name AS channel_name 
FROM users AS u LEFT JOIN channels AS c 
ON u.id = c.user_id;

실행 결과

user_namechannel_name
kimkimtube
leeleetube
parknull

is null을 활용해서 한쪽 테이블에만 존재하는 데이터도 뽑아낼 수 있다.

SELECT u.name AS user_name, c.name AS channel_name 
FROM users AS u LEFT JOIN channels AS c 
ON u.id = c.user_id
WHERE c.user_id is null;

실행 결과

user_namechannel_name
parknull

🏄‍♂️ 외부 조인(RIGHT JOIN)

SELECT [...] FROM [table A] RIGHT JOIN [table B] ON A.Value = B.Value;

오른쪽 테이블을 중심으로 왼쪽 테이블을 매칭시킨다.
오른쪽의 record는 무조건 표시하고,
왼쪽의 record 중 조건에 맞는 record가 없다면, null로 표시.
왼쪽의 record 중 조건에 맞는 record가 여러 개면, 오른쪽의 record를 여러번 표시.


SELECT u.name AS user_name, c.name AS channel_name 
FROM channels AS c RIGHT JOIN users AS u
ON u.id = c.user_id;

쉬운 비교를 위해 LEFT JOIN의 예시와 FROM 절의 user와 channel의 위치만 바꿨다.

실행 결과

user_namechannel_name
kimkimtube
leeleetube
parknull

SELECT u.name AS user_name, c.name AS channel_name 
FROM channels AS c RIGHT JOIN users AS u
ON u.id = c.user_id
WHERE c.user_id is null;

실행 결과

user_namechannel_name
parknull
profile
세상의 문제 해결을 즐기는 프론트엔드 개발자

0개의 댓글