조인이란 테이블 간에 일치하는 칼럼을 기준으로 두 테이블을 하나로 합쳐 보여 주는 명령
조인 형식: FROM 절의 '테이블A'를 기준으로 JOIN 절의 '테이블B'를 연결하라는 의미. ON 키워드 다음에는 조인 조건을 작성하는데, 이때 사용하는 칼럼을 조인 칼럼이라고 한다.SELECT 칼럼명1, 칼럼명2, ... FROM 테이블A JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;
-- stargram DB 진입
USE stargram;
-- 1번 사진 댓글 정보 조회
SELECT *
FROM comments
WHERE photo_id = 1;
-- comments 테이블과 users 테이블 조인
SELECT *
FROM comments
JOIN users ON comments.user_id = users.id;
-- comments 테이블과 users 테이블 조인
SELECT nickname, body
FROM comments
JOIN users ON comments.user_id = users.id
WHERE photo_id = 1;
1. 조인 칼럼이 필요하다
2. 조인 칼럼은 자료형이 일치해야 한다
3. 조인 조건을 명시해야 한다
4. 연속적으로 조인할 수 있다
-- 연속 조인 연습
SELECT nickname, body, filename
FROM comments
JOIN users ON comments.user_id = users.id
JOIN photos ON comments.photo_id = photos.id;
5. 중복 칼럼은 테이블명을 붙여 구분한다
-- 중복 칼럼 id에 테이블명 명시
SELECT comments.id, body, users.id, nickname
FROM comments
JOIN users ON comments.user_id = users.id
WHERE photo_id = 2;
6. 테이블에 별칭을 사용할 수 있다
-- comments 테이블과 users 테이블에 별칭 붙이기
SELECT nickname, body
FROM comments AS c
JOIN users AS u ON c.user_id = u.id;
7. 적절한 조인 유형을 선택한다
INNER 조인, LEFT 조인, RIGHT 조인, FULL 조인 (다음 절에서 자세히)
INNER 조인은 가장 기본이 되는 조인으로, 양쪽 테이블에서 조인 조건을 만족하는 데이터를 찾아 조인한다. (INNER 키워드는 생략 가능)
-- photos 테이블과 users 테이블 INNER 조인
SELECT *
FROM photos
JOIN users ON photos.user_id = users.id;
LEFT 조인은 왼쪽 테이블(FROM)의 모든 데이터에 대해 오른쪽 테이블(JOIN)을 조인. 오른쪽 테이블에 해당하는 데이터가 없으면 NULL 값으로 채운다.
-- photos 테이블과 users 테이블 LEFT 조인
SELECT *
FROM photos
LEFT JOIN users ON photos.user_id = users.id;
RIGHT 조인은 오른쪽 테이블(JOIN)의 모든 데이터에 대해 왼쪽 테이블(FROM)을 조인. 왼쪽 테이블에 해당하는 데이터가 없으면 NULL 값으로 채운다.
-- photos 테이블과 users 테이블 RIGHT 조인
SELECT *
FROM photos
RIGHT JOIN users ON photos.user_id = users.id;
FULL 조인은 두 테이블의 모든 데이터를 결합하는 조인
MySQL은 FULL 조인을 지원하지 않는다. 하지만 UNION 연산자를 사용하여 FULL 조인한 결과처럼 만들 수 있다.
-- photos 테이블과 users 테이블을 FULL 조인한 결과와 같게 만들기
(
SELECT *
FROM photos
LEFT JOIN users ON photos.user_id = users.id
)
UNION -- 두 쿼리의 결과 테이블을 하나로 합치기(중복 데이터는 제거)
(
SELECT *
FROM photos
RIGHT JOIN users ON photos.user_id = users.id
);
-- users 테이블과 photos 테이블 조인
SELECT *
FROM users
JOIN photos ON users.id = photos.user_id;
-- users 테이블과 photos 테이블 조인
SELECT nickname AS '게시자', filename AS '파일명'
FROM users
JOIN photos ON users.id = photos.user_id
WHERE nickname = '홍팍';
-- users, photos, likes 테이블 조인
SELECT COUNT(*) AS '홍팍이 올린 사진의 좋아요 수'
FROM users
JOIN photos ON users.id = photos.user_id AND nickname = '홍팍'
JOIN likes ON photos.id = likes.photo_id;
-- comments 테이블과 users 테이블 조인
SELECT COUNT(*) AS '해삼이 작성한 모든 댓글의 수'
FROM comments
JOIN users ON comments.user_id = users.id AND nickname = '해삼';
-- comments 테이블과 photos 테이블 조인
SELECT body AS '댓글 내용', filename AS '파일명'
FROM comments
LEFT JOIN photos ON comments.photo_id = photos.id;
-- stargram DB 진입
USE stargram;
-- 7.4.1 사용자 닉네임과 계정 공개 여부 조회
SELECT nickname AS '닉네임', private AS '계정 공개 여부'
FROM users
JOIN settings ON users.id = settings.user_id;
-- 7.4.2 사진 파일명과 올린 사람 닉네임 조회
SELECT filename AS '파일명', nickname AS '게시자'
FROM photos
JOIN users ON photos.user_id = users.id;
-- 7.4.3 모든 사진 파일명과 올린 사람 닉네임 조회
SELECT filename AS '파일명', nickname AS '게시자'
FROM photos
LEFT JOIN users ON photos.user_id = users.id;