MySQL - 자체 조인: 초보자를 위한 친절한 가이드

안녕하세요, 초보 프로그래머 여러분! 오늘 우리는 MySQL 자체 조인의 세계로 흥미로운 여정을 떠납니다. 이 것에 대해 새로운 것이라고 걱정하지 마세요 - 저는 당신의 신뢰할 수 있는 가이드로, 여러 해 동안의 교육 경험을 바탕으로 이 것을 가능한 한 명확하고 재미있게 만들 것입니다. 그래서, 커피 한 잔 (또는 차, 그게 당신의 취향이라면)을 따라와서, 이제 시작해봅시다!

MySQL - Self Join

자체 조인이란?

뭉치기를 시작하기 전에, 기본적인 것부터 시작해보겠습니다. 가족 모임에 가셨을 때, 누가 누구와 관련이 있는지 파악하고 싶어질 때를 상상해보세요. MySQL에서 자체 조인이 하는 일은 바로 그것입니다 - 자신의 테이블을 자신과 조인할 수 있습니다!

기술적으로 말하면, 자체 조인은 테이블을 자신과 조인하는 것입니다. 마치 동일한 테이블의 두 부본을 가지고 옆에 비교하는 것과 같습니다. 이는 동일한 테이블 내에서 관계를 찾고 싶을 때 매우 유용할 수 있습니다.

이 개념을 설명하기 위해 간단한 예제를 보겠습니다.

예제 1: 직원 계층 구조

가정할 때 employees라는 테이블이 다음과 같은 구조를 가지고 있습니다:

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50),
manager_id INT
);

이제 데이터를 몇 개 삽입해보겠습니다:

INSERT INTO employees (employee_id, employee_name, manager_id)
VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Bob Johnson', 1),
(4, 'Alice Brown', 2),
(5, 'Charlie Davis', 2);

누가 누구를 관리하는지 찾아보기 위해 자체 조인을 사용할 수 있습니다:

SELECT
e1.employee_name AS employee,
e2.employee_name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id;

이 쿼리는 다음과 같은 결과를 줄 것입니다:

employee manager
John Doe NULL
Jane Smith John Doe
Bob Johnson John Doe
Alice Brown Jane Smith
Charlie Davis Jane Smith

이게 멋지지 않나요? 동일한 테이블을 두 번 사용하여 (별칭을 e1e2로 사용하여) 직원-관리자 관계를 찾아보았습니다!

자체 조인과 ORDER BY 절

이제 기본적인 것을 배웠으니, 약간의 맛을 더해보겠습니다. 가끔씩 결과를 특정 방식으로 정렬하고 싶을 수 있습니다. 그때는 ORDER BY 절이 유용하게 사용됩니다.

예제 2: 정렬된 직원 계층 구조

이전 쿼리를 수정하여 결과를 직원 이름으로 정렬해보겠습니다:

SELECT
e1.employee_name AS employee,
e2.employee_name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id
ORDER BY
e1.employee_name;

이제 결과는 다음과 같이 정렬됩니다:

employee manager
Alice Brown Jane Smith
Bob Johnson John Doe
Charlie Davis Jane Smith
Jane Smith John Doe
John Doe NULL

이제 결과가 직원 이름으로 알파벳 순으로 정렬되어 있습니다. 대규모 데이터셋을 다루고 정보를 더 정리된 방식으로 제시해야 할 때 이는 매우 유용할 수 있습니다.

클라이언트 프로그램을 사용한 자체 조인

이제 실제 세계의 상황에서 자체 조인을 어떻게 사용할 수 있는지 이야기해보겠습니다. 예를 들어, 회사 디렉토리 애플리케이션을 개발하고 있다고 가정해보세요. 각 직원과 그들의 관리자 정보를 표시하고 싶습니다.

다음은 자체 조인을 클라이언트 프로그램에서 사용하는 예제 Python 스크립트입니다:

import mysql.connector

# 데이터베이스에 연결
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# 자체 조인 쿼리 실행
query = """
SELECT
e1.employee_id,
e1.employee_name,
e2.employee_name AS manager_name
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id
ORDER BY
e1.employee_name
"""

cursor.execute(query)

# 결과를 가져와 표시
print("Employee Directory:")
print("------------------")
for (employee_id, employee_name, manager_name) in cursor:
print(f"ID: {employee_id}, Name: {employee_name}, Manager: {manager_name or 'N/A'}")

# 연결 닫기
cursor.close()
cnx.close()

이 스크립트는 MySQL 데이터베이스에 연결하여 자체 조인 쿼리를 실행하고, 직원 디렉토리를 깔끔하게 출력합니다.

이 스크립트를 실행하면 다음과 같은 것을 볼 수 있습니다:

Employee Directory:
------------------
ID: 4, Name: Alice Brown, Manager: Jane Smith
ID: 3, Name: Bob Johnson, Manager: John Doe
ID: 5, Name: Charlie Davis, Manager: Jane Smith
ID: 2, Name: Jane Smith, Manager: John Doe
ID: 1, Name: John Doe, Manager: N/A

이제 MySQL과 Python을 사용하여 간단한 직원 디렉토리를 만들었습니다!

결론

자체 조인은 처음에는 약간 어려울 수 있지만, 익숙해지면 매우 강력한 도구입니다. 단일 테이블 내에서 관계를 찾는 데 매우 유용할 수 있습니다.

기억하시기 바랍니다, 연습이 완성입니다. 다양한 쿼리와 데이터셋을 실험해보지 마세요. 얼마 지나지 않아 자체 조인을 마스터하실 것입니다!

이 가이드가 유용하고, 조금은 재미있었기를 바랍니다. 질문이 있다면 언제든지 물어보세요. 행복한 코딩을 하시고, 쿼리가 항상 원하는 결과를 반환하길 바랍니다!

Credits: Image by storyset