<> 또는 !=로 쓰는 not equal 연산자는 두 값이 다를 때 참이에요. WHERE 절에 넣으면 특정 값과 일치하는 행을 제외할 수 있어요. 예제는 PostgreSQL, MySQL, SQLite, SQL Server에서 동작해요.
not equal 사용법
두 값 사이에 <> 또는 !=를 넣으세요. 둘은 완전히 같은 의미예요. <>는 SQL 표준 표기이고, !=는 대부분의 프로그래밍 언어에서 쓰는 표기예요.
value1 <> value2
value1 != value2
SELECT 5 <> 3;
-- Output: true
SELECT 'apple' != 'apple';
-- Output: false
SELECT NULL <> 3;
-- Output: NULL
-- MySQL and SQLite show true and false as 1 and 0. SQL Server can't
-- select a comparison like this: use it in a WHERE clause there.
쿼리에서 not equal은 WHERE 절에 들어가며, 값이 다른 모든 행을 남겨요:
-- Input: tickets
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 2 | Typo on pricing page | closed
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed';
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
티켓 4는 상태가 'closed'가 아닌데도 결과에 없어요. 이게 아래의 첫 번째 규칙이에요.
알아 둘 규칙
-
not equal은 NULL과 절대 일치하지 않아요. NULL을 무엇과 비교하든 결과는 참이 아니라 NULL(알 수 없음)이라서
WHERE절이 그 행을 버려요. 값이 없는 행도 남기려면OR column IS NULL을 추가하세요:
-- Input: the tickets table above
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed' OR status IS NULL;
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
-
NOT IN목록에 NULL이 하나라도 있으면 모든 행이 사라져요.status NOT IN ('closed', 'pending')은status <> 'closed' AND status <> 'pending'의 축약형이라, 목록에 NULL이 하나만 있어도 조건 전체가 알 수 없음이 돼요. NULL을 허용하는 컬럼에 대한 서브쿼리로 목록을 만들 때 주의하세요:
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status NOT IN ('closed', 'pending');
-- Output:
-- id | status
-- ---+-------
-- 1 | open
SELECT id, status FROM tickets WHERE status NOT IN ('closed', NULL);
-- Output:
-- id | status
-- ---+-------
-- (0 rows)
-
MySQL과 SQL Server는 기본적으로 대소문자를 구분하지 않아요. 그래서 이 둘에서는
'Apple' <> 'apple'이 거짓이에요. -
가능하면 원하는 값을 직접 지정하세요.
status <> 'closed'는 나중에 누군가 추가하는 상태까지 일치하고, 보통 테이블 대부분과 일치하기 때문에 데이터베이스가 인덱스의 도움을 거의 받지 못해요. “open 또는 pending”을 뜻한다면status IN ('open', 'pending')으로 그대로 표현하세요.
대체 문법
NOT (status = 'closed')는 status <> 'closed'를 다르게 쓰는 방법이고, NULL도 똑같이 건너뛰어요.
NULL 때문에 당황하지 않고 비교하려면 IS DISTINCT FROM을 쓰세요. NULL을 하나의 값으로 취급하는 NULL 안전 not equal이에요(SQL Server는 2022, SQLite는 3.39에서 추가됐어요):
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status IS DISTINCT FROM 'closed';
-- Output:
-- id | status
-- ---+--------
-- 1 | open
-- 3 | pending
-- 4 | NULL
-- MySQL has no IS DISTINCT FROM. Use its NULL-safe <=> instead:
SELECT id, status FROM tickets WHERE NOT (status <=> 'closed');
not equal은 언제 써야 할까요?
쿼리에서 특정 값을 가진 행을 건너뛰어야 할 때 not equal을 쓰세요. 대부분의 용도는 다음 다섯 가지 중 하나에 해당해요.
특정 상태나 카테고리 제외하기
취소된 주문, 무효 처리된 인보이스, 취급하지 않는 카테고리 등: <>는 그 값을 가진 행을 빼고 나머지는 모두 남겨요.
특정 레코드 하나 건너뛰기
id를 비교해 행이나 그룹 하나를 제외하세요. 관련 글 목록에서 지금 읽고 있는 글, 다른 멤버 목록에서 로그인한 사용자, 회사 보고서에서 특정 부서 하나 같은 경우예요. 숫자에는 따옴표가 필요 없어요.
다른 조건과 함께 결과 좁히기
<>를 AND, OR와 조합하면 값을 제외하면서 다른 컬럼으로도 필터링할 수 있어요. 예를 들어 취소되지 않았고 일정 금액을 넘는 주문처럼요. 같은 컬럼의 여러 값을 제외하려면 NOT IN을 쓰세요.
두 컬럼 값이 다른 행 찾기
not equal은 두 컬럼 사이에서도 동작해요. 이전 값과 새 값, 실사한 수량과 기록된 수치, 배송 주소와 청구 주소를 비교해 보세요.
값이 없는 행 남기기
<>는 NULL을 건너뛰므로, 값이 없는 행을 결과에 포함할지 정해야 해요. 남기려면 OR column IS NULL을 추가하거나 위의 NULL 안전 문법을 쓰세요.
not equal 실전 예제
유효한 인보이스만 합산하기
무효 처리된 인보이스는 매출에 포함하면 안 돼요:
-- Input: invoices
-- invoice_id | customer | status | amount
-- -----------+------------+--------+--------
-- 1001 | Acme Corp | paid | 1200.00
-- 1002 | Birch & Co | void | 450.00
-- 1003 | Acme Corp | open | 300.00
-- 1004 | Cobalt Ltd | paid | 875.50
SELECT SUM(amount) AS invoiced
FROM invoices
WHERE status <> 'void';
-- Output: 2375.50
지금 읽는 글을 뺀 관련 글 목록
독자가 2번 글을 보고 있어요. 같은 주제의 다른 글을 보여 주세요:
-- Input: articles
-- id | title | topic
-- ---+----------------------+-------
-- 1 | Indexing basics | SQL
-- 2 | Your first JOIN | SQL
-- 3 | Docker for beginners | DevOps
-- 4 | Window functions | SQL
SELECT id, title
FROM articles
WHERE topic = 'SQL'
AND id <> 2;
-- Output:
-- id | title
-- ---+-----------------
-- 1 | Indexing basics
-- 4 | Window functions
판매 가능한 상품만 보여 주기
단종된 상품, 가격이 없는 상품, 품절된 상품을 제외하세요:
-- Input: products
-- product_name | category | price | stock_quantity
-- ---------------+--------------+-------+---------------
-- Desk Organizer | Office | 18.50 | 40
-- Fax Machine | Discontinued | 89.00 | 3
-- Gift Wrap | Seasonal | 0.00 | 120
-- Trail Backpack | Outdoors | 64.00 | 0
-- Water Bottle | Outdoors | 12.99 | 75
SELECT product_name, category, price
FROM products
WHERE category <> 'Discontinued'
AND price > 0
AND stock_quantity <> 0;
-- Output:
-- product_name | category | price
-- ---------------+----------+------
-- Desk Organizer | Office | 18.50
-- Water Bottle | Outdoors | 12.99
실제로 바뀐 필드 찾기
감사 로그는 아무것도 바뀌지 않은 저장까지 모든 저장을 기록해요. 두 컬럼을 비교해 실제 변경만 남기세요:
-- Input: audit_log
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 2 | city | Austin | Austin
-- 3 | plan | free | pro
SELECT log_id, field_name, old_value, new_value
FROM audit_log
WHERE old_value <> new_value;
-- Output:
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 3 | plan | free | pro
두 컬럼 중 하나라도 NULL일 수 있다면 IS DISTINCT FROM(MySQL에서는 NOT (old_value <=> new_value))을 쓰세요. 그렇지 않으면 처음 설정된 값이 변경으로 잡히지 않아요.
아직 참석 의사를 밝히지 않은 모두에게 알림 보내기
답장하지 않은 게스트는 rsvp가 NULL이고, 이들이 알림을 가장 필요로 해요:
-- Input: invitations
-- guest | email | rsvp
-- ------------+------------------+------
-- Ines Moreau | ines@example.com | yes
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
SELECT guest, email, rsvp
FROM invitations
WHERE rsvp <> 'yes' OR rsvp IS NULL;
-- Output:
-- guest | email | rsvp
-- ----------+------------------+------
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
not equal 더 알아보기
이 블로그의 글:
- SQL COALESCE 가이드: 비교하기 전에 NULL을 값으로 바꾸기
-
SQL LIKE 가이드: 패턴과 일치하는 텍스트를 제외하는
NOT LIKE - SQL CASE 문 가이드: 비교로 값 선택하기
- SQL의 Having과 Where 비교: 행을 그룹화할 때 필터를 어디에 둘지
- PostgreSQL에서 두 값 비교하기: 다른 비교 연산자들
공식 문서:
Beekeeper Studio는 무료 오픈 소스 데이터베이스 GUI예요
지금까지 써 본 SQL 쿼리 & 에디터 도구 중 최고예요. 데이터베이스 관리에 필요한 모든 게 다 있어요. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio는 빠르고 직관적이며 사용하기 쉬워요. 다양한 데이터베이스를 지원하고 Windows, Mac, Linux에서 모두 잘 작동해요.
Beekeeper Studio 사용자 후기
"Beekeeper Studio가 예전 SQL 작업 방식을 완전히 대체했어요. 빠르고 직관적이라 데이터베이스 작업이 다시 즐거워졌어요."
"여러 데이터베이스 GUI를 써 봤지만, Beekeeper는 기능과 단순함 사이의 균형이 완벽해요. 그냥 잘 돼요."