SQL에서는 두 개의 테이블을 공통 컬럼 또는 지정된 조건을 기준으로 결합할 수 있으며, 목적에 따라 다양한 종류의 JOIN이 제공됩니다.
이 글에서는 그중에서도 셀프 조인(SELF JOIN)에 대해 자세히 알아보겠습니다.
셀프 조인은 이름 그대로 테이블 자기 자신과 수행하는 조인입니다. 동일한 테이블의 두 복사본 사이에서 이루어지며, 특정 조건에 따라 한 테이블의 행이 같은 테이블의 다른 행들과 매칭됩니다.
셀프 조인 기본 문법
SELECT a.column1 , b.column2
FROM table_name a, table_name b
WHERE condition;
여기서 a와 b는 동일한 테이블에 붙인 두 개의 별칭(alias)입니다. 셀프 조인은 같은 테이블을 대상으로 수행하기 때문에 FROM 절에 동일한 테이블 이름이 두 번 사용됩니다.
예제 테이블 소개
설명을 위해 다음과 같은 'Students' 테이블이 있다고 가정해 보겠습니다.
Students
+----------+--------------+-----------+
| id | Student_name | Dept_id |
+----------+--------------+-----------+
| 2 | Rohit | 121 |
| 3 | Kirat | 121 |
| 4 | Inder | 123 |
+----------+--------------+-----------+
위 테이블에 a.Dept_id < b.Dept_id라는 조건으로 셀프 조인을 수행해 보겠습니다. 즉, 각 행이 자신보다 Dept_id 값이 큰 다른 행들과 매칭되는 방식입니다.
Python에서 MySQL로 셀프 조인을 수행하는 단계
MySQL 커넥터(mysql.connector) 모듈을 임포트합니다.
connect() 메서드를 사용하여 데이터베이스와 연결을 설정합니다.
cursor() 메서드로 커서 객체를 생성합니다.
적절한 SQL 문법으로 쿼리를 작성합니다.
execute() 메서드를 사용하여 SQL 쿼리를 실행합니다.
작업이 끝나면 연결을 종료(close)합니다.
전체 예제 코드
import mysql.connector
db=mysql.connector.connect(host="your host", user="your username", password="your password", database="database_name")
cursor=db.cursor()
query="SELECT a.Dept_id,b.Student_name FROM Students a, Students b WHERE a.Dept_id<b.Dept_id"
cursor.execute(query)
rows=cursor.fetchall()
for x in rows:
print(x)
db.close()
실행 결과
| Dept_id | Student_name |
|---|---|
| 120 | Rohit |
| 120 | Kirat |
| 120 | Inder |
| 121 | Inder |
| 121 | Inder |
위 결과를 보면 Dept_id가 작은 행이 Dept_id가 더 큰 학생 이름과 짝을 이루어 출력된 것을 확인할 수 있습니다. 이처럼 셀프 조인은 조직도에서 상사-부하 관계를 찾거나, 같은 부서에 속한 사람들을 비교하는 등 하나의 테이블 내에서 행 간 관계를 분석할 때 유용하게 활용됩니다.