온라인 강의 자료모음 기업교육

JOIN 구문 익히기

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
AI · 풀스택 · 데이터 로드맵 Dave Lee 한 강사가 설계부터 강의까지 모두
사이트 바로가기

8. JOIN 구문 익히기

  • join은 두개 이상의 테이블로부터 필요한 데이터를 연결해 하나의 포괄적인 구조로 결합시키는 연산
  • INNER JOIN
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN

실습 환경 맞추기

  • Mysql Workbench (도커 환경이 아닌 분들은 다음 SQL로 customer 데이터베이스를 만들고, 데이터를 넣어야 합니다.)
    • File -> Open SQL Script -> 03_data/customer/customer_join.sql
In [30]:
db.close() # 이전에 연결된 데이터베이스 끊어주세요 (에러나면 이미 끊어진 것임)

고급 SQL을 체계적으로 정리한 온라인 강의입니다

중고급 SQL과 실전 데이터 분석

고급 SQL 쿼리, 실전 데이터 분석 기법

In [72]:
host_name = "0.0.0.0"
username = "root"
password = "korea123"
database_name = "customer"    # 데이터베이스 이름을 sakila 로 바꿔줘야 합니다.
In [73]:
db = pymysql.connect(
    host=host_name,  # DATABASE_HOST
    port=3306,
    user=username,  # DATABASE_USERNAME
    passwd=password,  # DATABASE_PASSWORD
    db=database_name,  # DATABASE_NAME
    charset='utf8'
)

8.1 INNER JOIN

  • INNER JOIN은 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
In [74]:
df = pd.read_sql("SHOW TABLES;", db)
In [75]:
df
Out[75]:
Tables_in_customer
0 customer_table
1 order_table

데이터 분석/과학 전문가가 되기 위한 체계적인 로드맵입니다

가장 빠른 데이터 분석/과학 풀로드맵 (2025)

데이터 수집 → 분석 → 머신러닝/딥러닝 전과정

In [76]:
df = pd.read_sql("SELECT * FROM customer_table", db)
In [77]:
df
Out[77]:
id customer_id customer_name
0 1 1 Robert
1 2 2 Peter
2 3 3 Smith
In [78]:
df = pd.read_sql("SELECT * FROM order_table", db)
In [79]:
df
Out[79]:
id order_id customer_id order_date
0 1 100 1 2017-10-23 04:42:17
1 2 200 4 2017-10-24 04:42:17
2 3 300 2 2017-10-25 04:42:17
  • 테이블 이름 다음에 한칸 띄고 새로운 이름을 쓰면, SQL구문 안에서 해당 이름으로 해당 테이블을 가리킬 수 있음 (AS 용법과 동일함)

풀스택 개발자가 되기 위한 체계적인 로드맵입니다

가장 빠른 풀스택 개발 로드맵 (2025)

파이썬 → Flask → FastAPI → Flutter 전과정

  • 위 구문에서 C는 customer_table, O는 order_table 이 됨
    • C.customer_id = O.customer_id 와 같이 SQL 구문 안에서 특정 테이블의 컬럼을 가리키기 위해 사용됨
  • 다음과 같이 써도 MySQL은 동작 (HIVE SQL등 몇몇 DB는 미지원, 내부적으로는 동일한 JOIN 오퍼레이션, 단, JOIN을 쓰는 것이 가독성이 높음)
In [80]:
df = pd.read_sql("SELECT * FROM customer_table C INNER JOIN order_table O ON C.customer_id = O.customer_id", db)
In [81]:
df
Out[81]:
id customer_id customer_name id order_id customer_id order_date
0 1 1 Robert 1 100 1 2017-10-23 04:42:17
1 2 2 Peter 3 300 2 2017-10-25 04:42:17
In [82]:
df = pd.read_sql("SELECT * FROM customer_table, order_table WHERE customer_table.customer_id = order_table.customer_id", db)

고급 SQL을 체계적으로 정리한 온라인 강의입니다

중고급 SQL과 실전 데이터 분석

고급 SQL 쿼리, 실전 데이터 분석 기법

In [83]:
df
Out[83]:
id customer_id customer_name id order_id customer_id order_date
0 1 1 Robert 1 100 1 2017-10-23 04:42:17
1 2 2 Peter 3 300 2 2017-10-25 04:42:17
In [84]:
df = pd.read_sql("SELECT C.customer_name FROM customer_table C INNER JOIN order_table O ON C.customer_id = O.customer_id", db)
In [85]:
df
Out[85]:
customer_name
0 Robert
1 Peter
  • JOIN은 INNER JOIN을 의미함
In [86]:
df = pd.read_sql("SELECT * FROM customer_table C JOIN order_table O ON C.customer_id = O.customer_id", db)

데이터 분석/과학 전문가가 되기 위한 체계적인 로드맵입니다

가장 빠른 데이터 분석/과학 풀로드맵 (2025)

데이터 수집 → 분석 → 머신러닝/딥러닝 전과정

In [87]:
df
Out[87]:
id customer_id customer_name id order_id customer_id order_date
0 1 1 Robert 1 100 1 2017-10-23 04:42:17
1 2 2 Peter 3 300 2 2017-10-25 04:42:17

8.2 OUTER JOIN

  • OUTER JOIN은 조인하는 테이블의 ON 절의 조건 중 한쪽의 데이터를 모두 가져옴
  • OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN 이 있음

8.2.1 LEFT OUTER JOIN

No description has been provided for this image

In [88]:
df = pd.read_sql("SELECT * FROM customer_table C LEFT OUTER JOIN order_table O ON C.customer_id = O.customer_id", db)

풀스택 개발자가 되기 위한 체계적인 로드맵입니다

가장 빠른 풀스택 개발 로드맵 (2025)

파이썬 → Flask → FastAPI → Flutter 전과정

In [89]:
df
Out[89]:
id customer_id customer_name id order_id customer_id order_date
0 1 1 Robert 1.0 100.0 1.0 2017-10-23 04:42:17
1 2 2 Peter 3.0 300.0 2.0 2017-10-25 04:42:17
2 3 3 Smith NaN NaN NaN NaT
In [92]:
SQL = """
    SELECT * 
    FROM customer_table C 
    LEFT OUTER JOIN order_table O ON C.customer_id = O.customer_id 
    WHERE O.order_id IS NULL
"""
In [93]:
df = pd.read_sql(SQL, db)
In [94]:
df
Out[94]:
id customer_id customer_name id order_id customer_id order_date
0 3 3 Smith None None None None

No description has been provided for this image

고급 SQL을 체계적으로 정리한 온라인 강의입니다

중고급 SQL과 실전 데이터 분석

고급 SQL 쿼리, 실전 데이터 분석 기법

In [95]:
SQL = """
    SELECT * FROM order_table O 
    LEFT OUTER JOIN customer_table C 
    ON C.customer_id = O.customer_id
"""

df = pd.read_sql(SQL, db)
In [96]:
df
Out[96]:
id order_id customer_id order_date id customer_id customer_name
0 1 100 1 2017-10-23 04:42:17 1.0 1.0 Robert
1 3 300 2 2017-10-25 04:42:17 2.0 2.0 Peter
2 2 200 4 2017-10-24 04:42:17 NaN NaN None

8.2.2 RIGHT OUTER JOIN

No description has been provided for this image

In [49]:
df = pd.read_sql("SELECT * FROM customer_table C RIGHT OUTER JOIN order_table O ON C.customer_id = O.customer_id", db)

데이터 분석/과학 전문가가 되기 위한 체계적인 로드맵입니다

가장 빠른 데이터 분석/과학 풀로드맵 (2025)

데이터 수집 → 분석 → 머신러닝/딥러닝 전과정

In [50]:
df
Out[50]:
id customer_id customer_name id order_id customer_id order_date
0 1.0 1.0 Robert 1 100 1 2017-10-22 02:35:50
1 2.0 2.0 Peter 3 300 2 2017-10-24 02:35:50
2 NaN NaN None 2 200 4 2017-10-23 02:35:50
  • RIGHT JOIN 은 RIGHT OUTER JOIN을 의미
In [51]:
df = pd.read_sql("SELECT * FROM customer_table C RIGHT JOIN order_table O ON C.customer_id = O.customer_id", db)
In [52]:
df
Out[52]:
id customer_id customer_name id order_id customer_id order_date
0 1.0 1.0 Robert 1 100 1 2017-10-22 02:35:50
1 2.0 2.0 Peter 3 300 2 2017-10-24 02:35:50
2 NaN NaN None 2 200 4 2017-10-23 02:35:50