Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 테이블에서 특정 조건에 맞는 일부 행만 선택하여 조회하는 방법

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 EXISTSLEFT JOIN ... IS NULL 방식을 고려하는 것이 좋습니다.