JOIN의 의미
데이터베이스에서 조인은 두 개 이상의 테이블 간에 관계를 맺어 데이터를 결합하는 작업을 의미
JOIN의 종류
INNER JOIN (내부 조인)
- 가장 일반적인 조인 종류로, 두 테이블 간에 일치하는 행만을 반환합니다.
- INNER JOIN은 두 테이블에서 공통된 값을 가진 행들을 연결합니다.
예시 !!!
== Users(ID) 테이블
+----+----------+-----------+
| ID | 이름 | 이메일 |
+----+----------+-----------+
| 1 | 홍길동 | hong@email.com |
| 2 | 김철수 | kim@email.com |
| 3 | 이영희 | lee@email.com |
+----+----------+-----------+
== Orders(주문번호) 테이블
+----------+------------+-------+
| 주문번호 | ID | 금액 |
+----------+------------+-------+
| 1 | 1 | 1000 |
| 2 | 1 | 1500 |
| 3 | 2 | 500 |
| 4 | 3 | 2000 |
+----------+------------+-------+
== 형식
SELECT *
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.공통컬럼 = 테이블2.공통컬럼;
== 명령어
SELECT Users.ID, Users.이름, Users.이메일, Orders.주문번호, Orders.금액
FROM Users
INNER JOIN Orders ON Users.ID = Orders.ID;
== 결과
+----+----------+-----------+----------+-------+
| ID | 이름 | 이메일 | 주문번호 | 금액 |
+----+----------+-----------+----------+-------+
| 1 | 홍길동 | hong@email.com | 1 | 1000 |
| 1 | 홍길동 | hong@email.com | 2 | 1500 |
| 2 | 김철수 | kim@email.com | 3 | 500 |
| 3 | 이영희 | lee@email.com | 4 | 2000 |
+----+----------+-----------+----------+-------+
CROSS JOIN (교차 조인):
- 두 테이블 간의 모든 가능한 조합을 반환합니다. 매우 많은 행을 생성할 수 있으므로 주의가 필요하다.
Colors 테이블
+--------+
| 색상 |
+--------+
| 빨강 |
| 파랑 |
| 노랑 |
+--------+
Sizes 테이블
+--------+
| 크기 |
+--------+
| 작음 |
| 중간 |
| 큼 |
+--------+
== 형식
SELECT *
FROM 테이블1
CROSS JOIN 테이블2;
== 명령어
SELECT Colors.색상, Sizes.크기
FROM Colors
CROSS JOIN Sizes;
== 결과
+--------+--------+
| 색상 | 크기 |
+--------+--------+
| 빨강 | 작음 |
| 빨강 | 중간 |
| 빨강 | 큼 |
| 파랑 | 작음 |
| 파랑 | 중간 |
| 파랑 | 큼 |
| 노랑 | 작음 |
| 노랑 | 중간 |
| 노랑 | 큼 |
+--------+--------+
LEFT JOIN (왼쪽 조인 또는 LEFT OUTER JOIN)
왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 행이 있으면 함께 반환합니다. 일치하는 행이 없으면 NULL 값으로 채웁니다.
예시!!!
MariaDB [haksa]> select * from st;
+---------+-----------+---------------+
| hakbun | name | tel |
+---------+-----------+---------------+
| 2023001 | 김영희 | 010-1234-5678 |
| 2023002 | 김철수 | 010-1234-5679 |
| 2023003 | 장나라 | 010-5678-1234 |
| 2023004 | 임재범 | 010-1234-1111 |
| 2023005 | 이효리 | 010-3892-1234 |
| 2023006 | 에일리 | 010-1234-3322 |
| 2023007 | 신효범 | 010-3231-0011 |
| 2023008 | 강수지 | 010-1300-1010 |
| 2023009 | 김국진 | 010-1234-1001 |
| 2023010 | 화요비 | 010-1231-1234 |
| 2023011 | 김건모 | 010-1231-1111 |
| 2023012 | 임창정 | 010-1111-2230 |
+---------+-----------+---------------+
12 rows in set (0.000 sec)
MariaDB [haksa]> select * from sungjuk;
+---------+-------------+-------+
| hakbun | kwamok_code | jumsu |
+---------+-------------+-------+
| 2023001 | A01 | 90 |
| 2023001 | A02 | 80 |
| 2023001 | P01 | 95 |
| 2023003 | A01 | 90 |
| 2023003 | A02 | 95 |
| 2023003 | B03 | 95 |
| 2023004 | A01 | 60 |
| 2023004 | A02 | 90 |
| 2023004 | B03 | 80 |
| 2023005 | A01 | 90 |
| 2023005 | A02 | 70 |
| 2023005 | P01 | 90 |
| 2023010 | A01 | 90 |
| 2023010 | A02 | 80 |
| 2023010 | P05 | 90 |
+---------+-------------+-------+
15 rows in set (0.000 sec)
== 형식
SELECT * FROM 왼쪽테이블
LEFT JOIN 오른쪽테이블 ON 왼쪽테이블.공통컬럼 = 오른쪽테이블.공통컬럼;
== 명령어
SELECT st.hakbun, st.name
FROM st
LEFT JOIN sungjuk ON st.hakbun = sungjuk.hakbun
WHERE sungjuk.jumsu IS NULL;
== 결과
+---------+-----------+
| hakbun | name |
+---------+-----------+
| 2023002 | 김철수 |
| 2023006 | 에일리 |
| 2023007 | 신효범 |
| 2023008 | 강수지 |
| 2023009 | 김국진 |
| 2023011 | 김건모 |
| 2023012 | 임창정 |
+---------+-----------+
RIGHT JOIN (오른쪽 조인 또는 RIGHT OUTER JOIN)
예시!!
st 테이블
+---------+-----------+---------------+
| hakbun | name | tel |
+---------+-----------+---------------+
| 2023001 | 김영희 | 010-1234-5678 |
| 2023002 | 김철수 | 010-1234-5679 |
| 2023003 | 장나라 | 010-5678-1234 |
+---------+-----------+---------------+
sungjuk 테이블
+---------+-------------+-------+
| hakbun | kwamok_code | jumsu |
+---------+-------------+-------+
| 2023001 | A01 | 90 |
| 2023002 | A02 | 80 |
| 2023003 | B03 | 95 |
+---------+-------------+-------+
== 형식
SELECT * FROM 왼쪽테이블
RIGHT JOIN 오른쪽테이블 ON 왼쪽테이블.공통컬럼 = 오른쪽테이블.공통컬럼;
== 방법
SELECT *
FROM st
RIGHT JOIN sungjuk ON st.hakbun = sungjuk.hakbun;
== 결과
+---------+-----------+---------------+---------+-------------+-------+
| hakbun | name | tel | hakbun | kwamok_code | jumsu |
+---------+-----------+---------------+---------+-------------+-------+
| 2023001 | 김영희 | 010-1234-5678 | 2023001 | A01 | 90 |
| 2023002 | 김철수 | 010-1234-5679 | 2023002 | A02 | 80 |
| 2023003 | 장나라 | 010-5678-1234 | 2023003 | B03 | 95 |
+---------+-----------+---------------+---------+-------------+-------+
FULL JOIN (전체 조인 또는 FULL OUTER JOIN)
FULL JOIN(또는 FULL OUTER JOIN)은 두 테이블 간의 조인에서 양쪽 테이블의 모든 행을 포함하며, 서로 일치하는 행이 없는 경우에는 NULL 값으로 채워진 결과를 반환하는 조인입니다. 이는 LEFT JOIN과 RIGHT JOIN의 결합된 형태로 생각할 수 있습니다.
예시
== st 테이블
+---------+-----------+---------------+
| hakbun | name | tel |
+---------+-----------+---------------+
| 2023001 | 김영희 | 010-1234-5678 |
| 2023002 | 김철수 | 010-1234-5679 |
| 2023003 | 장나라 | 010-5678-1234 |
+---------+-----------+---------------+
== sunjuk 테이블
+---------+-------------+-------+
| hakbun | kwamok_code | jumsu |
+---------+-------------+-------+
| 2023001 | A01 | 90 |
| 2023002 | A02 | 80 |
| 2023004 | B03 | 95 |
+---------+-------------+-------+
== 형식
SELECT * FROM 왼쪽테이블
FULL JOIN 오른쪽테이블 ON 왼쪽테이블.공통컬럼 = 오른쪽테이블.공통컬럼;
== 방법
SELECT *
FROM st
FULL JOIN sungjuk ON st.hakbun = sungjuk.hakbun;
== 결과
+---------+-----------+---------------+---------+-------------+-------+
| hakbun | name | tel | hakbun | kwamok_code | jumsu |
+---------+-----------+---------------+---------+-------------+-------+
| 2023001 | 김영희 | 010-1234-5678 | 2023001 | A01 | 90 |
| 2023002 | 김철수 | 010-1234-5679 | 2023002 | A02 | 80 |
| 2023003 | 장나라 | 010-5678-1234 | NULL | NULL | NULL |
| 2023004 | NULL | NULL | 2023004 | B03 | 95 |
+---------+-----------+---------------+---------+-------------+-------+
SELF JOIN (자기 조인)
테이블 내에서 자기 자신과 조인하는 것을 의미합니다. 주로 계층적 데이터나 부모-자식 관계를 가진 데이터에 사용됨.
+---------+-----------+---------------+
| hakbun | name | tel |
+---------+-----------+---------------+
| 2023001 | 김영희 | 010-1234-5678 |
| 2023002 | 김철수 | 010-1234-5679 |
| 2023003 | 장나라 | 010-5678-1234 |
+---------+-----------+---------------+
+---------+-------------+-------+
| hakbun | kwamok_code | jumsu |
+---------+-------------+-------+
| 2023001 | A01 | 90 |
| 2023002 | A02 | 80 |
| 2023003 | B03 | 95 |
+---------+-------------+-------+
== 방법
SELECT s1.hakbun AS student_id, s1.name AS student_name,
s2.hakbun AS related_student_id, s2.name AS related_student_name, s2.jumsu
FROM st s1
LEFT JOIN sungjuk s2 ON s1.hakbun = s2.hakbun;
== 결과
+-------------+---------------+---------------------+-------------------------+-------+
| student_id | student_name | related_student_id | related_student_name | jumsu |
+-------------+---------------+---------------------+-------------------------+-------+
| 2023001 | 김영희 | 2023001 | 김영희 | 90 |
| 2023002 | 김철수 | 2023002 | 김철수 | 80 |
| 2023003 | 장나라 | 2023003 | 장나라 | 95 |
+-------------+---------------+---------------------+-------------------------+-------+'DB' 카테고리의 다른 글
| MariaDB/MySQL 뷰(View) (2) | 2024.02.02 |
|---|---|
| MySql 샘플 DB (0) | 2024.02.01 |
| DB 생성과 정규화 (2) | 2024.01.31 |
| MySQL select문 (0) | 2024.01.30 |
| MariaDB 한글 깨짐 해결 방법 (0) | 2024.01.30 |