데이터베이스 작업을 하다 보면 특정 레코드가 테이블에 존재하는지 확인해야 하는 경우가 종종 있습니다. 이럴 때 EXISTS 문을 사용하면 간단하게 처리할 수 있습니다.
EXISTS 문은 뒤따르는 서브쿼리(subquery)가 하나 이상의 레코드를 반환하면 TRUE를 반환하고, 결과가 없으면 FALSE를 반환합니다.
기본 문법
SELECT * FROM table_name WHERE EXISTS(sub_query)
서브쿼리가 하나 이상의 행(row)을 반환하면 EXISTS는 TRUE를 반환합니다.
Python에서 MySQL로 레코드 존재 여부를 확인하는 단계
MySQL 커넥터(mysql.connector) 모듈을 임포트합니다.
connect()메서드를 사용해 데이터베이스와 연결을 설정합니다.cursor()메서드로 커서 객체를 생성합니다.적절한 SQL 문을 사용해 쿼리를 작성합니다.
execute()메서드로 SQL 쿼리를 실행합니다.작업이 끝나면 연결을 닫습니다(close).
예제 테이블
다음과 같이 "Sales"라는 이름의 테이블이 있다고 가정해 보겠습니다.
+------------+---------+ | sale_price | tax | +------------+---------+ | 1000 | 200 | | 500 | 100 | | 50 | 50 | | 180 | 180 | +------------+---------+
Python 코드 예제
import mysql.connector
db = mysql.connector.connect(
host="your host",
user="your username",
password="your password",
database="database_name"
)
cursor = db.cursor()
query = "SELECT sale_price FROM Sales WHERE EXISTS(SELECT * FROM Sales WHERE tax>150)"
cursor.execute(query)
rows = cursor.fetchall()
for row in rows:
print(row)
db.close()코드 설명
위 코드에서 서브쿼리 SELECT * FROM Sales WHERE tax>150는 tax 값이 150보다 큰 레코드(200, 180)가 존재하기 때문에 TRUE를 반환합니다. 따라서 EXISTS 문도 TRUE를 반환하여 전체 레코드의 sale_price 값이 조회됩니다.
반대로 tax가 150보다 큰 레코드가 하나도 없었다면, EXISTS는 FALSE를 반환했을 것이고 아무런 결과도 출력되지 않았을 것입니다.
실행 결과
1000 500 50 180
마무리
EXISTS 문은 대량의 데이터에서 특정 조건을 만족하는 레코드의 존재 여부만 빠르게 확인할 때 유용합니다. 실제 존재 여부만 필요하다면 SELECT * 대신 SELECT 1을 사용하거나 LIMIT 1을 추가하면 성능을 더욱 최적화할 수 있습니다.