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

MySQL에서 AND와 OR 연산자로 여러 행의 레코드를 조회하는 방법

MySQL에서는 ANDOR 연산자를 조합하여 복잡한 조건을 처리하고, 여러 개의 행(row)을 한 번에 조회할 수 있습니다. 이번 글에서는 실제 예제를 통해 두 연산자를 함께 사용하는 방법을 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다. 학생 정보를 저장하는 테이블로, 학생 이름과 수학 점수, MySQL 점수, 그리고 상태(활성/비활성) 컬럼을 포함합니다.

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName varchar(40),
    StudentMathMarks int,
    StudentMySQLMarks int,
    status ENUM('ACTIVE','INACTIVE')
);
Query OK, 0 rows affected (0.47 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용하여 테스트용 레코드를 추가합니다.

mysql> insert into DemoTable(StudentName,StudentMathMarks,StudentMySQLMarks,status) values('Chris',45,67,'active');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentName,StudentMathMarks,StudentMySQLMarks,status) values('Bob',89,78,'inactive');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentName,StudentMathMarks,StudentMySQLMarks,status) values('David',56,68,'active');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentName,StudentMathMarks,StudentMySQLMarks,status) values('Robert',68,75,'active');
Query OK, 1 row affected (0.18 sec)

3. 전체 데이터 확인하기

SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------+-------------+------------------+-------------------+----------+
| StudentId | StudentName | StudentMathMarks | StudentMySQLMarks | status   |
+-----------+-------------+------------------+-------------------+----------+
|         1 | Chris       |               45 |                67 | ACTIVE   |
|         2 | Bob         |               89 |                78 | INACTIVE |
|         3 | David       |               56 |                68 | ACTIVE   |
|         4 | Robert      |               68 |                75 | ACTIVE   |
+-----------+-------------+------------------+-------------------+----------+
4 rows in set (0.00 sec)

4. AND와 OR 연산자를 함께 사용한 쿼리

이제 ANDOR 연산자를 조합하여 특정 조건에 맞는 여러 행을 반환하는 쿼리를 작성해 보겠습니다. 아래 쿼리는 상태가 'active'인 학생 중에서, 수학 점수가 68점 또는 MySQL 점수가 67점인 레코드만 조회합니다.

mysql> select *from DemoTable
    where status='active'
and (StudentMathMarks=68 or StudentMySQLMarks=67);

실행 결과는 다음과 같습니다.

+-----------+-------------+------------------+-------------------+--------+
| StudentId | StudentName | StudentMathMarks | StudentMySQLMarks | status |
+-----------+-------------+------------------+-------------------+--------+
|         1 | Chris       |               45 |                67 | ACTIVE |
|         4 | Robert      |               68 |                75 | ACTIVE |
+-----------+-------------+------------------+-------------------+--------+
2 rows in set (0.00 sec)

쿼리 동작 원리 이해하기

결과를 자세히 살펴보면 다음과 같은 로직으로 필터링된 것을 알 수 있습니다.

  • Chris(ID 1): 상태가 'ACTIVE'이고, MySQL 점수가 67이므로 조건을 충족합니다.
  • Bob(ID 2): 상태가 'INACTIVE'이므로 첫 번째 조건부터 실패하여 제외됩니다.
  • David(ID 3): 상태는 'ACTIVE'지만, 수학 점수도 68이 아니고 MySQL 점수도 67이 아니므로 제외됩니다.
  • Robert(ID 4): 상태가 'ACTIVE'이고, 수학 점수가 68이므로 조건을 충족합니다.

여기서 핵심은 괄호 ()의 역할입니다. 괄호를 사용하면 OR 조건이 먼저 평가되어 하나의 그룹으로 묶이고, 그 결과가 AND 조건(status='active')과 결합됩니다. 만약 괄호를 생략하면 연산자 우선순위에 따라 의도와 다른 결과가 나올 수 있으므로, 복합 조건 작성 시에는 반드시 괄호로 우선순위를 명확히 지정하는 것이 좋습니다.