MySQL - 서브쿼리: 초보자 가이드

안녕하세요, 미래의 데이터 마법사 여러분! 오늘 우리는 MySQL 서브쿼리의 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 저는 친절한 안내자로, 복잡한 개념을 쉽게 이해할 수 있도록 작은 조각으로 나누어 설명해 드릴게요. 커피(또는 차, 당신이 좋아하는 음료라면)를 한 잔 마시고, 함께 빠져보겠습니다!

MySQL - SubQuery

서브쿼리는 무엇인가요?

시작하기 전에 서브쿼리가 무엇인지 이해해 보겠습니다. 파티를 계획하고 초콜릿 케이크를 좋아하는 친구들의 목록을 만들어야 한다고 가정해 봅시다. 먼저 모든 친구들의 목록을 만들고, 초콜릿 케이크를 좋아하는 사람들을 동그랗게 표시합니다. SQL 용어로는, 주요 목록이 주쿼리이고, 초콜릿 케이크 좋아하는 사람들을 동그랗게 표시하는 과정이 서브쿼리입니다. 쿼리 안에 쿼리 - 꽤 멋진 것 아닙니까?

이제 서브쿼리를 다양한 MySQL 문에서 어떻게 사용할 수 있는지 탐구해 보겠습니다.

SELECT 문과 함께 사용하는 서브쿼리

SELECT 문은 데이터베이스의 확대镜과 같습니다. 특정 정보를 찾아서 검색하는 데 도움이 됩니다. SELECT에 서브쿼리를 추가하면, 더 가까이서 더 잘 볼 수 있는 두 번째 확대镜을 추가하는 것과 같습니다!

가정해 봅시다. 우리는 employeesdepartments라는 두 개의 테이블이 있습니다. 'IT' 부서에서 일하는 모든 직원을 찾고 싶습니다.

SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'IT'
);

이 예제에서, 서브쿼리 (SELECT department_id FROM departments WHERE department_name = 'IT')가 먼저 실행됩니다. IT 부서의 department_id를 찾습니다. 그런 다음, 주요 쿼리는 이 ID를 사용하여 해당 부서의 모든 직원을 찾습니다.

이를 다음과 같이 생각해 보세요: 먼저 "IT 부서의 ID는 무엇인가?"라고 물고, 그 답변을 사용하여 "이 ID를 가진 부서에서 누가 일하고 있나?"라고 물어봅니다.

INSERT 문과 함께 사용하는 서브쿼리

이제 INSERT와 함께 사용하는 서브쿼리에 대해 이야기해 보겠습니다. 이는 정보를 하나의 목록에서 다른 목록으로 복사하는 것과 같지만, 특정 부분만 복사하는 것입니다.

가정해 봅시다. 우리는 top_performers 테이블이 있고, 판매액이 $100,000을 초과한 직원으로 채우고 싶습니다.

INSERT INTO top_performers (employee_id, employee_name, sales)
SELECT employee_id, CONCAT(first_name, ' ', last_name), total_sales
FROM employees
WHERE total_sales > 100000;

여기서, 서브쿼리는 실제로는 전체 SELECT 문입니다. 판매액이 $100,000을 초과한 모든 직원을 찾습니다. INSERT 문은 이들을 top_performers 테이블에 추가합니다.

이는 "모든 스타 세일즈맨을 찾아 VIP 목록에 추가하자!"라고 말하는 것과 같습니다.

비교 연산자와 함께 사용하는 서브쿼리

서브쿼리는 비교 연산자(>, <, = 등)와 함께 사용할 수도 있습니다. 이는 다른 쿼리의 결과와 값을 비교하고 싶을 때 유용합니다.

모든 직원 중 평균 급여보다 더 많이 벌고 있는 직원을 찾아보겠습니다.

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);

서브쿼리 (SELECT AVG(salary) FROM employees)는 평균 급여를 계산합니다. 주요 쿼리는 각 직원의 급여를 이 평균과 비교합니다.

이는 "우리 회사의 높은 수익자는 누구인가?"라고 묻는 것과 같습니다.

IN 또는 NOT IN 연산자와 함께 사용하는 서브쿼리

IN과 NOT IN 연산자는 값이 목록의 어떤 값과 일치하는지 확인하는 데 매우 유용합니다. 서브쿼리와 함께 사용하면 목록이 동적으로 생성됩니다!

모든 직원 중 관리자인 사람들을 찾아보겠습니다.

SELECT first_name, last_name
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);

여기서, 서브쿼리는 모든 관리자 ID의 목록을 생성합니다. 주요 쿼리는 이 목록에 있는 모든 직원을 찾습니다.

이는 "관리자 목록에 누가 있는가?"라고 묻는 것과 같습니다.

클라이언트 프로그램에서 사용하는 서브쿼리

대부분의 예제는 SQL 내에서 직접 작성되지만, 서브쿼리는 클라이언트 프로그램에서도 사용할 수 있습니다. 이는 복잡한 연산이 필요하거나 서브쿼리가 사용자 입력에 따라 달라질 때 특히 유용합니다.

이는 간단한 Python 예제를 사용하여 설명할 수 있습니다. mysql-connector 라이브러리를 사용합니다.

import mysql.connector

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

# 사용자 입력을 얻습니다
department = input("Enter department name: ")

# 쿼리를 작성하고 실행
query = """
SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = %s
)
"""
cursor.execute(query, (department,))

# 결과를 가져오고 인쇄
for (first_name, last_name) in cursor:
print(f"{first_name} {last_name}")

# 연결을 닫습니다
cursor.close()
cnx.close()

이 스크립트는 사용자가 부서 이름을 입력하고, 해당 부서의 모든 직원을 찾습니다. 이는 친절한 로봇 어시스턴트가 빠르게 정보를 찾아주는 것과 같습니다.

결론

축하합니다! MySQL 서브쿼리의 강력한 세계로 첫 걸음을 뗐습니다. 연습이 완벽을 만든다는 것을 기억하고, 이 개념들을 실험해 보지 마세요.

다음은 우리가 다룰 서브쿼리 유형의 빠른 참조 표입니다:

서브쿼리 유형 설명 예제 사용 사례
SELECT SELECT 문 내의 쿼리 테이블 간 관련 데이터 찾기
INSERT INSERT에서 SELECT를 서브쿼리로 사용 필터된 데이터를 다른 테이블로 복사
비교 서브쿼리 결과와 비교 집계 결과와 비교
IN/NOT IN 목록에 포함 여부 확인 관련 데이터의 일치 여부 확인
클라이언트 프로그램 애플리케이션 코드에서 사용 사용자 입력에 따른 동적 쿼리

서브쿼리는 SQL의 비밀 무기입니다.처음에는 어렵게 보일 수 있지만, 연습을 통해 곧 마스터하게 될 것입니다!

미래의 데이터 주인 여러분, 행복하게 쿼리를 작성하세요!

Credits: Image by storyset