두 개 이상의 테이블에서 데이터를 검색하는 방법으로, 각 테이블에서 적절한 행을 서로 연결하여 하나의 결과를 가져올 수 있다.
⏩ 쿼리문 작성 순서
- ERD 확인
- JOIN 조건 확인
- SQL 한번에 작성하지 말고 조금씩 조회> 추가 > 조회
: 두 테이블이 공통적으로 가지고 있는 행만을 조회 ➡️ NULL행이 존재하지 않음
데이터가 규칙 없이 섞이는 것 방지하기 위하여 반드시 ON을 작성하기
➰ 예시 문제
❔ county table에서 Continent가 EUROPE인 도시의 이름과 Continent 조회 🔽
❔ Continent가 ASIA인 city의 인구수의 합을 조회 🔽
❔ 회원 중에서, 2월에 로그인한 회원의 아이디와 이메일, 로그인 일자를 조회 (중복X) 🔽
: 양쪽이 공통으로 가지고 있는 행뿐만 아니라 왼쪽[오른쪽]에만 있는 행도 포함하여 조회 ➡️ 왼쪽[오른쪽]에만 존재하는 행인 경우 오른쪽[왼쪽] 행의 값은 NULL로 조회된다.
FROM 다음에 왼쪽[오른쪽]에 놓을 테이블을 적고
LEFT JOIN 다음에 오른쪽[왼쪽]에 놓을 테이블을 적는다
➰ 예시 문제
❔ 회원 테이블에서 아무도 가지고 있지 않은 회원등급의 이름을 조회
❗A와 B가 공통으로 가지고 있는 컬럼을 작성하여 조회할 때 주의사항 🔽
a_name이라는 컬럼이 novel 테이블에도 있고 tb_author 테이블에도 있기 때문에
조회할 때 그냥 a_name만 작성하면 모호하다는 에러문이 뜬다.
⬇️
어떤 테이블에 속하는 a_name을 말하는 것인지 명시하여 작성해야 한다.
왼쪽 테이블과 오른쪽 테이블의 합집합
💡 MySQL은 FULL OUTER JOIN이 없다.
(LEFT JOIN 과 RIGHT JOIN을 이용해 FULL OUTER JOIN을 사용)
두 테이블의 곱집합
자신에게 조인하는 것
여러 쿼리의 조회 결과들의 합집합.
JOIN은 테이블을 옆으로 붙이는 작업인 반면 UNION은 위아래로 붙인다.
UNION
: 중복되는 데이터를 제외하고 출력
UNION ALL
: 중복되는 데이터까지 포함하여 출력
A테이블>
u_id phone addr
---- ----- -----
id001
id002
id003
B테이블>
u_id phone addr
---- ----- -----
id003
id004
id005
UNION 이용시
u_id phone addr
---- ----- -----
id001
id002
id003
id004
id005
UNION ALL 이용시
u_id phone addr
---- ----- -----
id001
id002
id003
id003
id004
id005
UNION 사용 조건
- 위아래로 딱 맞게 붙여야 하므로 조회하는 컬럼의 개수가 같아야 한다.
- 컬럼의 이름이 같아야 한다 (다를 경우, AS 작성하여 이름을 같게 만들 수 있다).
- 본래 데이터 타입이 같아야 한다.
➡ 그러나 MySQL에서는 이것들을 무시하고 실행
컬럼의 이름이 다르지만 조회가 된다.
참조사이트
https://sql-joins.leopard.in.ua/
https://www.javatpoint.com/mysql-cross-join