[MariaDB] JOIN

Geehyun(장지현)·2024년 2월 25일
0

MariaDB

목록 보기
7/12
post-thumbnail

JOIN절

JOIN 종류

JOIN은 두 개 이상의 테이블을 특정조건으로 연결해서 한 테이블 처럼 사용할 수 있게해주는 문법요소 입니다.

-- 사용법
FROM 테이블1(주 테이블)
{CROSS | INNER | {LEFT | RIGHT} OUTER} JOIN 테이블2
[ON 연결조건]

-- 사용예시
SELECT * FROM tbl_member AS MB
INNER JOIN tbl_orderinfo AS OI ON OI.memberId = MB.memberId; 
  • JOIN 대표적으로 CROSS JOIN / INNER JOIN / OUTER JOIN / SELF JOIN이 있습니다.
    JOIN 문 앞에 위 구분 키워드를 입력하지 않을 시 자동으로 INNER JOIN으로 간주 됩니다.
  • JOIN 구문을 생략하고 FROM 절에 콤마로 테이블 명만 구분줘도 INNER JOIN을 작성할 수 있지만, 가능한 명시적으로 작성해주는게 가독성 면에서 좋습니다.
    # 생략예시
    SELECT *
    FROM 테이블1, 테이블2
    ON 연결조건;
  • JOIN은 SELECT문, INSERT문, DELETE문, UPDATE문 등 다양한 곳에서 사용할 수 있지만, 예시로는 SELECT문에서 사용한 버전으로 작성할 예정입니다.

💡 어떤 테이블을 FROM 절에 쓰고, JOIN 절에 써야할까?
FROM 절에는 조회하는 주 목적이 되는 테이블을 작성해주야합니다.

  • 예시1
    " 2023년 총 매출 금액이 30,000원 이상인 회원 리스트를 뽑아주세요"
SELECT
	MB.memberId
    , MB.name
    , SUM(OI.orderAmount)
FROM tbl_member AS MB
INNER JOIN tbl_orderinfo AS OI
ON OI.memberId = MB.memberId
WHERE YEAR(OI.orderDate) = 2023
GROUP BY YEAR(OI.orderDate), memberId
HAVING SUM(OI.orderAmount) >= 30000;
  • 예시2
    "개발부서인 사원 정보를 뽑아주세요"
SELECT * 
FROM employees AS EM
INNER JOIN dept_emp AS DE ON DE.emp_no = EM.emp_no
INNER JOIN departments AS DP ON DP.dept_no = DE.dept_no
WHERE DP.dept_no = 'd005';

CROSS JOIN

CROSS JOIN은 상호 조인 이라고도 부르며, JOIN으로 연결한 각 테이블의 데이터를 전부 나열하는 방식입니다.
따라서, (테이블1의 행 개수) * (테이블2의 행 개수) 만큼의 행이 결과로 나오게 됩니다.

CROSS JOIN

  • 해당 CROSS JOIN의 위와 같은 이유 때문에 다른 JOIN 방식보다 속도가 느립니다.
  • 데이터 개수가 연결한 테이블의 각 행 개수를 서로 곱(Cartesian Product)한 만큼 나오기 때문에 사용하는데 주의가 필요하며, 자주 사용되지 않습니다.
-- 사용법
FROM 테이블1(주 테이블)
CROSS JOIN 테이블2
[ON 연결 조건];

-- 사용예시
SELECT *
FROM employees AS EM
CROSS JOIN salaries AS SL
LIMIT 100;

INNER JOIN

INNER JOIN은 내부 조인이리고도 부르며, 연결할 각 테이블에서 특정조건으로 연결된 데이터만 갖고오는 JOIN 방식입니다.
각 테이블의 교집합 데이터만 갖고온다고 볼 수 있습니다.

INNER JOIN

  • INNER JOIN의 경우 ON 절에 작성한 기준으로 교집합 데이터를 갖고오기 때문에 ON 절을 필수적으로 작성해야합니다. (안작성하면 CROSS JOIN처럼 데이터 갖고옴)
  • ON 절에는 각 테이블의 데이터를 묶어줄 수 있는 조건으로 작성합니다.
-- 사용법
FROM 테이블1(주 테이블)
INNER JOIN 테이블2
ON 연결 조건; # ON절을 필수적으로 명시합시다.

-- 사용예시
SELECT *
FROM tbl_member AS MB
INNER JOIN tbl_orderInfo AS OI
ON OI.memberId = MB.memberId   # 각 테이블의 memberId 컬럼이 서로 일치하는 기준으로 연결조건을 명시함.

OUTER JOIN

OUTER JOIN은 외부 조인이라고도 부르며, LEFT OUTER JOINRIGHT OUTER JOIN으로 나뉩니다.

LEFT / RIGHT의 키워드를 기준으로 기준 테이블을 정하고 해당 기준 테이블의 데이터 기준으로 데이터를 가져옵니다.

OUTER JOIN

즉 LEFT 기준일 시 왼쪽 테이블 기준으로 데이터를 가져오기 때문에 왼쪽 테이블에는 데이터가 있고, 우측 테이블에는 없는 데이터도 가져옵니다.
마찬가지로 RIGHT 기준일 경우 우측 테이블에는 있고, 좌측 테이블에는 없는 데이터도 가져옵니다.
=> ON 연결조건절에 해당하지 않는 데이터라도 기준 테이블에 있는 데이터면 가져옵니다. (없는 컬럼은 null로 표시)

-- 사용법 
# LEFT JOIN
FROM 테이블1
LEFT OUTER JOIN 테이블2
ON 연결 조건;

# RIGHT JOIN
FROM 테이블1
RIGHT OUTER JOIN 테이블2
ON 연결조건;

# 사용 예시는 아래 내용 참고

💡 어떤게 LEFT테이블이고, RIGHT 테이블일까?
일단 기본적으로 해당 JOIN절 기준으로 좌측에 있는 테이블을 LEFT 테이블 / JOIN절에 작성한 테이블을 RIGHT 테이블 이라고 합니다.

다중 JOIN으로 여러 테이블을 연결했을 경우 ON절에 작성한 테이블 기준으로 LEFT 테이블을 결정합니다.

-- 기본 OUTER JOIN 사용예시
SELECT *
FROM 테이블A AS A
LEFT OUTER JOIN 테이블B AS B ON B.컬럼1 = A.컬럼1;
# LEFT OUTER JOIN이기 때문에 A 테이블 기준으로 데이터 가져옴.

SELECT *
FROM 테이블A AS A
RIGTH OUTER JOIN 테이블B AS B ON B.컬럼1
# RIGHT OUTER JOIN이기 때문에 B 테이블 기준으로 데이터 가져옴.

-- 다중 조인에서 OUTER JOIN 사용예시
SELECT *
FROM 테이블A AS A
RIGHT OUTER JOIN 테이블B AS B ON B.컬럼1 = A.컬럼1    # LEFT : 테이블A / RIGHT : 테이블B 
LEFT OUTER JOIN 테이블C AS C ON C.컬럼1 = A.컬럼1     # LEFT : 테이블A / RIGHT : 테이블C
LEFT OUTER JOIN 테이블D AS D ON D.컬럼2 = C.컬럼2     # LEFT : 테이블C / RIGHT : 테이블D
RIGHT OUTER JOIN 테이블E AS E ON E.컬럼1 = A.컬럼1    # LEFT : 테이블A / RIGHT : 테이블E 
;

SELF JOIN

자체 조인이라고도 하며 INEER JOIN 또는 OUTER JOIN을 이용해 자기 자신 테이블을 JOIN하는 것을 말합니다.

주로 자신 테이블 안에서 특정 조건으로 데이터를 뽑는다던가 특정 연산을 하고싶다던가 하는 작업을 하고자할 때 사용합니다.

-- 사용법
# INNER JOIN 사용
FROM 테이블1
INNER JOIN 테이블1
ON 연결 조건;

# OUTER JOIN 사용
FROM 테이블1
LEFT OUTER JOIN 테이블1
ON 연결 조건;

-- 사용예시
SELECT T1.*
FROM titles AS T1
INNER JOIN titles AS T2     # 자기자신을 JOIN함
ON T1.emp_no = T2.emp_no AND T1.title <> T2.title;

NESTED JOIN

다중 조인이라고도 하며 3개 이상의 테이블을 JOIN할 경우를 말합니다.

  • 각 테이블에서 연관된 컬럼으로 ON으로 묶어주는 식으로 구성합니다.
  • 여러 테이블에 있는 컬럼일 때는 데이터가 적은쪽 테이블에서 갖고오는게 좋습니다.
-- 사용법
FROM 테이블1
INNER JOIN 테이블2 ON 연결조건
INNER JOIN 테이블3 ON 연결조건
OUTER JOIN 테이블4 ON 연결조건
...
;

-- 사용예시
SELECT
	EM.emp_no, EM.first_name, EM.last_name, EM.gender
	, DP.dept_no, DP.dept_name
	, TT.title, TT.from_date
FROM employees AS EM
INNER JOIN dept_emp AS DE ON DE.emp_no = EM.emp_no
INNER JOIN departments AS DP ON DP.dept_no = DE.dept_no
LEFT OUTER JOIN titles AS TT ON TT.emp_no = EM.emp_no
LIMIT 100
;

참고

MariaDB로 따라 하며 배우는 SQL프로그래밍 데이터베이스 기초에서 실무까지 - 나익수, 서연경 지음
위 책을 공부하며 작성하고 있습니다!

profile
개발자를 꿈꾸는 병아리 (블로그 이전 준비중 입니다.)

0개의 댓글