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

MySQL에서 두 열의 값이 서로 다른 행만 선택하는 방법

MySQL에서 두 열의 값이 다른 행 조회하기

MySQL에서 두 개의 열(column) 값을 비교하여 서로 다른 값을 가진 행만 선택하려면 != 연산자를 사용할 수 있습니다. 다만 NULL 값이 포함된 경우 단순 비교로는 처리되지 않기 때문에, IS NULL 조건을 함께 사용해야 완벽하게 처리할 수 있습니다.

기본 문법

SELECT * FROM yourTableName
WHERE yourColumnName1 != yourColumnName2
   OR (yourColumnName1 IS NULL AND yourColumnName2 IS NOT NULL)
   OR (yourColumnName2 IS NULL AND yourColumnName1 IS NOT NULL);

위 쿼리는 세 가지 조건을 OR로 연결합니다. 첫 번째 조건은 두 열의 값이 다른 경우를 찾고, 나머지 두 조건은 한쪽이 NULL이고 다른 한쪽은 값이 있는 경우도 '다른 값'으로 간주하여 포함시킵니다. SQL에서 NULL과의 비교는 항상 UNKNOWN을 반환하기 때문에 이러한 처리가 반드시 필요합니다.

예제 테이블 생성

실습을 위해 먼저 테이블을 생성해 보겠습니다.

mysql> create table selectTwoColumns
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> FirstNumber int,
    -> SecondNumber int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.87 sec)

샘플 데이터 삽입

INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 두 값이 같은 행과 NULL이 포함된 행도 함께 넣었습니다.

mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(10,20);
Query OK, 1 row affected (0.29 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(30,40);
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(20,20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(50,60);
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(50,50);
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(70,NULL);
Query OK, 1 row affected (0.14 sec)

전체 데이터 확인

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

mysql> select * from selectTwoColumns;

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

+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
|  1 |          10 |           20 |
|  2 |          30 |           40 |
|  3 |          20 |           20 |
|  4 |          50 |           60 |
|  5 |          50 |           50 |
|  6 |          70 |         NULL |
+----+-------------+--------------+
6 rows in set (0.00 sec)

두 열의 값이 다른 행 선택하기

이제 FirstNumber와 SecondNumber의 값이 서로 다른 행만 조회하는 쿼리를 실행해 보겠습니다.

mysql> select * from selectTwoColumns
    -> where FirstNumber != SecondNumber
    -> OR (FirstNumber IS NULL AND SecondNumber IS NOT NULL)
    -> OR (SecondNumber IS NULL AND FirstNumber IS NOT NULL);

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

+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
|  1 |          10 |           20 |
|  2 |          30 |           40 |
|  4 |          50 |           60 |
|  6 |          70 |         NULL |
+----+-------------+--------------+
4 rows in set (0.00 sec)

결과 분석

결과를 보면 Id가 1, 2, 4인 행은 두 값이 서로 달라서 정상적으로 조회되었고, Id가 3(20, 20)과 5(50, 50)인 행은 값이 같아서 제외되었습니다. 특히 주목할 점은 Id가 6인 행입니다. SecondNumber가 NULL이지만 IS NULL 조건 덕분에 '값이 다른 행'으로 인식되어 결과에 포함되었습니다.

만약 NULL이 포함된 행을 제외하고 싶다면 FirstNumber != SecondNumber 조건만 단독으로 사용하면 됩니다. 반대로 NULL도 하나의 값으로 취급하여 비교하려면 위와 같이 IS NULL 조건을 반드시 함께 작성해야 합니다. 상황에 맞게 조건을 조절하여 활용하시기 바랍니다.