MySQL에서 테이블의 전체 데이터가 아닌, 특정 조건을 만족하는 일부 행만 선택해서 조회해야 하는 경우가 자주 있습니다. 이 글에서는 서브쿼리와 NOT IN 연산자를 활용해 원하는 행만 골라서 출력하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다. 학생 ID, 이름, 점수를 저장하는 간단한 구조입니다.
mysql> create table DemoTable625 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentFirstName varchar(100), StudentScore int ); Query OK, 0 rows affected (1.01 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable625(StudentFirstName,StudentScore) values('John',98);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable625(StudentFirstName,StudentScore) values('Chris',39);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable625(StudentFirstName,StudentScore) values('Bob',41);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable625(StudentFirstName,StudentScore) values('David',40);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable625(StudentFirstName,StudentScore) values('Robert',52);
Query OK, 1 row affected (0.18 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable625;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+------------------+--------------+ | StudentId | StudentFirstName | StudentScore | +-----------+------------------+--------------+ | 1 | John | 98 | | 2 | Chris | 39 | | 3 | Bob | 41 | | 4 | David | 40 | | 5 | Robert | 52 | +-----------+------------------+--------------+ 5 rows in set (0.00 sec)
4. 특정 행만 선택하는 쿼리 작성하기
이제 핵심 부분입니다. 점수가 50점 미만인 학생은 제외하고, 나머지 학생들만 조회하고 싶다면 서브쿼리와 NOT IN을 함께 사용하면 됩니다.
mysql> select *from DemoTable625 where StudentFirstName NOT IN( select StudentFirstName from DemoTable625 where StudentScore < 50 );
이 쿼리의 동작 방식을 살펴보면 다음과 같습니다.
- 내부 서브쿼리가 먼저 실행되어 점수가 50 미만인 학생(Chris, Bob, David)의 이름 목록을 반환합니다.
- 외부 쿼리는 그 목록에 포함되지 않은(NOT IN) 학생만 최종 결과로 출력합니다.
실행 결과는 다음과 같습니다.
+-----------+------------------+--------------+ | StudentId | StudentFirstName | StudentScore | +-----------+------------------+--------------+ | 1 | John | 98 | | 5 | Robert | 52 | +-----------+------------------+--------------+ 2 rows in set (0.00 sec)
마무리
이처럼 NOT IN 연산자와 서브쿼리를 조합하면 특정 조건에 해당하는 행을 손쉽게 제외하고 원하는 데이터만 조회할 수 있습니다. 참고로 데이터 양이 많은 대형 테이블에서는 성능상의 이유로 NOT EXISTS나 LEFT JOIN ... IS NULL 방식을 고려하는 것이 좋습니다.