JOIN 구문 익히기

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 사이트와, 다음 두 채널도 오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 뉴스레터 오픈 [구독해보기]
●  잔재미코딩 유투브 오픈 [구독해보기]

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() # 이전에 연결된 데이터베이스 끊어주세요 (에러나면 이미 끊어진 것임)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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 용법과 동일함)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
  • 위 구문에서 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)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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

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)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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

본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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

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)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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