Windows · SQLite 3.45.3. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 4개 단락
상품 이름에 특정 단어가 들어 있는 행과 설명이 없는 행은 어떻게 찾을까요? SQLite에서는 LIKE로 문자열의 패턴을 검색하고, IS NULL로 값이 없는 행을 확인할 수 있습니다.
문자열 패턴과 NULL
LIKE 뒤에는 작은따옴표로 감싼 검색 패턴을 씁니다. 패턴의 %는 길이가 0 이상인 문자열을 뜻하므로, '%컵%'은 앞뒤에 다른 문자가 있든 없든 컵이 포함된 이름과 일치합니다. _는 정확히 한 문자와 일치합니다.
NULL은 값이 없거나 알려지지 않았음을 나타냅니다. 길이가 0인 문자열 ''도 문자열 값이므로 NULL과 다릅니다. 값이 없는 행은 IS NULL, 값이 있는 행은 IS NOT NULL로 고릅니다.
예제: 이름과 설명 검색하기
환경은 SQLite입니다. 아래 입력에는 상품 이름과 설명 네 쌍이 있습니다. 첫 번째 조회는 이름에 컵이 포함된 상품을, 두 번째 조회는 설명이 NULL인 상품을 찾습니다.
WITH products(name, description) AS (
VALUES
('머그컵', '도자기'),
('컵', NULL),
('유리컵', ''),
('접시', NULL)
)
SELECT name
FROM products
WHERE name LIKE '%컵%'
ORDER BY name;
WITH products(name, description) AS (
VALUES
('머그컵', '도자기'),
('컵', NULL),
('유리컵', ''),
('접시', NULL)
)
SELECT name
FROM products
WHERE description IS NULL
ORDER BY name;

WITH는 뒤따르는 하나의 조회에서 사용할 임시 결과에 products라는 이름과 열 이름을 붙입니다. VALUES는 괄호 안의 값들을 행으로 제공합니다. 두 조회가 각각 독립적으로 같은 입력을 쓰도록 WITH를 두 번 작성했습니다. 실제 테이블을 만들거나 파일에 데이터를 저장하지 않습니다.
예상 결과는 다음과 같습니다. 표시 형식은 SQLite 실행 환경에 따라 다를 수 있습니다.
첫 번째 조회:
name
머그컵
유리컵
컵
두 번째 조회:
name
접시
컵
첫 조회에서 %는 문자가 전혀 없는 경우도 포함하므로 이름이 정확히 컵인 행도 선택됩니다. 두 번째 조회에서는 컵과 접시의 설명이 NULL입니다. 유리컵의 설명은 빈 문자열이므로 선택되지 않습니다. ORDER BY name은 각 결과를 이름순으로 정렬합니다.
흔한 실수와 경계 조건
description = NULL은 값이 없는 행을 찾는 조건으로 사용할 수 없습니다. NULL과 =로 비교한 결과는 참이 아닌 NULL이어서 WHERE가 해당 행을 선택하지 않습니다. description IS NULL을 사용하세요.
반대로 description IS NOT NULL은 설명이 도자기인 행뿐 아니라 빈 문자열인 유리컵도 선택합니다. 빈 문자열까지 별도로 찾으려면 description = '' 조건을 사용할 수 있습니다.
LIKE '컵'은 앞뒤에 다른 문자가 없는 이름과 일치합니다. 포함 여부를 찾으려면 양쪽에 %를 붙입니다. 한편 %와 _는 패턴 안에서 특별한 뜻을 가지므로 문자 그대로 검색할 때는 ESCAPE를 사용해야 합니다. SQLite의 기본 LIKE는 ASCII 영문 대소문자를 구분하지 않지만, ASCII 밖의 문자는 기본적으로 같은 방식의 대소문자 변환을 적용하지 않습니다.
연습과 해설
위 예제의 두 번째 조회에서 IS NULL을 IS NOT NULL로 바꿔 보세요. 어떤 상품 이름이 나올까요?
예상 결과는 머그컵, 유리컵입니다. 도자기와 빈 문자열은 모두 NULL이 아닌 값이기 때문입니다. 두 행을 이름순으로 정렬하면 다음과 같습니다.
name
머그컵
유리컵
CHECK THE SOURCE
참고한 공식 문서
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.