MariaDB 강좌 / WHERE로 조건 지정하기: 비교·AND·OR·IN·BETWEEN·LIKE
WHERE는 조건이 참인 행만 조회 결과에 남기는 절입니다. 비교 연산자와 AND·OR를 조합하고 IN·BETWEEN·LIKE로 값 목록·범위·문자 패턴을 표현하되, 괄호와 NULL의 의미를 함께 확인해야 의도한 상품만 선택할 수 있습니다.
조건이 참인 행을 고르는 기준 이해하기
행을 고르는 조건은 SELECT 열 목록과 역할이 다릅니다. SELECT product_name은 보여 줄 열을 정하고 WHERE price >= 8000은 읽은 행 중 어떤 행이 결과에 포함될지를 정합니다. 조건을 만족하지 않거나 결과가 NULL인 행은 WHERE를 통과하지 않습니다. 조건에 값이 없는 경우는 NULL을 올바르게 비교하기: IS NULL·COALESCE의 NULL 규칙을 적용하고, 선택된 행의 표시 순서와 개수는 ORDER BY·LIMIT로 정렬하고 조회 범위 제한하기에서 따로 정합니다.
| 표현 | 뜻 | 예 |
|---|---|---|
| =, <> | 같음·다름 | category = '문구' |
| >, >=, <, <= | 크기 비교 | price >= 8000 |
| AND | 양쪽 조건 모두 참 | 분류가 문구이면서 재고 있음 |
| OR | 조건 중 하나 이상 참 | 분류가 문구 또는 생활 |
| IN | 목록 중 일치 | category IN ('문구', '전자') |
| BETWEEN | 양 끝 포함 범위 | price BETWEEN 1500 AND 8000 |
| LIKE | 문자 패턴 일치 | product_name LIKE '%컵%' |
숫자 열에는 숫자로 비교하고 문자열 열에는 따옴표로 감싼 문자열을 비교합니다. 숫자와 문자열을 불필요하게 섞으면 암시적 형 변환으로 예상과 다른 결과나 경고를 만날 수 있습니다. 빈칸을 포함한 이름은 저장된 값 자체도 확인합니다.
조건 비교용 상품 데이터 준비하기
명령줄 클라이언트에서 course_user로 학습용 서버에 접속하고 shopcourse 데이터베이스를 준비합니다. 접속과 UTF-8 SQL 파일 실행 방법은 명령줄 클라이언트와 SQL 파일 실행 안내를 참고하세요. 아래 코드는 운영 서버가 아닌 연습 환경에서 실행합니다.
이 글은 products_15_lab이라는 독립된 실습 테이블을 사용합니다. 이전 강좌의 products 등 기존 테이블에는 손대지 않습니다. SELECT VERSION(), DATABASE();와 SHOW TABLES LIKE 'products_15_lab';로 서버·선택한 데이터베이스·이름 중복을 먼저 확인합니다. 같은 이름이 이미 있으면 정의와 데이터를 확인하고, 이 글에서 만든 연습 데이터인지 판단한 뒤 마지막 절의 반복 방법을 따르세요.
USE shopcourse; CREATE TABLE products_15_lab ( product_id INT NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, category VARCHAR(30) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, note VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (product_id), CONSTRAINT ck_p15_price CHECK (price >= 0), CONSTRAINT ck_p15_stock CHECK (stock >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO products_15_lab (product_id, product_name, category, price, stock, note) VALUES (1, '노트', '문구', 3500.00, 20, NULL), (2, '볼펜', '문구', 1500.00, 0, ''), (3, '머그컵', '생활', 8000.00, 12, '선물 포장'), (4, '스탠드', '생활', 25000.00, 5, NULL), (5, '파일', '문구', 1500.00, 50, ''), (6, '케이블', '전자', 8000.00, 0, '호환 확인');
분류가 문구인 상품은 1·2·5번, 생활은 3·4번, 전자는 6번입니다. 재고가 0인 상품은 2·6번입니다. 같은 초기 데이터에 조건 하나만 바꾸어 결과가 왜 달라졌는지 비교하겠습니다.
비교 연산과 AND·OR의 괄호 확인하기
SELECT product_id, product_name, price FROM products_15_lab WHERE price >= 8000 ORDER BY product_id;
8000원 이상은 번호 3·4·6번입니다. >=를 >로 바꾸면 정확히 8000원인 3·6번이 빠지고 4번만 남습니다. 다시 >=로 돌려 경계값이 포함되는지 확인하세요. 가격이 가장 큰 상품을 찾는 문제는 조건만으로 해결되지 않으며 정렬과 조회 개수도 따로 정해야 합니다.
SELECT product_id FROM products_15_lab WHERE (category = '문구' OR category = '생활') AND stock > 0 ORDER BY product_id; SELECT product_id FROM products_15_lab WHERE category = '문구' OR category = '생활' AND stock > 0 ORDER BY product_id;
첫 조회는 문구 또는 생활 중 재고가 있는 1·3·4·5번입니다. 둘째 조회는 AND가 OR보다 먼저 묶여 2번 볼펜까지 포함한 1·2·3·4·5번이 됩니다. 업무 의도는 첫 조회처럼 괄호로 드러내는 편이 안전합니다. MariaDB 연산자 우선순위에서 결합 기준을 확인할 수 있습니다.
IN과 BETWEEN으로 목록·경계값 표현하기
SELECT product_id FROM products_15_lab
WHERE category IN ('문구', '전자') ORDER BY product_id;
SELECT product_id FROM products_15_lab
WHERE price BETWEEN 1500 AND 8000 ORDER BY product_id;
IN 조회는 문구 또는 전자인 1·2·5·6번을 반환합니다. BETWEEN은 양 끝 가격 1500과 8000을 포함하므로 1·2·3·5·6번을 반환합니다. 이 가격 조건은 price >= 1500 AND price <= 8000으로도 쓸 수 있습니다.
날짜·시간 열에 BETWEEN을 적용할 때는 끝값의 시각을 놓치기 쉽습니다. 예를 들어 하루 전체를 찾을 때 자정만 끝값으로 쓰면 그 뒤 시각이 빠집니다. 이런 경우 시작 이상·다음 날 시작 미만의 반열린 범위를 검토합니다. 여기서는 의미가 명확한 숫자 가격 범위만 사용합니다.
LIKE의 퍼센트와 밑줄 구분하기
SELECT product_id, product_name FROM products_15_lab WHERE product_name LIKE '%컵%' ORDER BY product_id; SELECT product_id, product_name FROM products_15_lab WHERE product_name LIKE '__' ORDER BY product_id;
LIKE의 %는 0개 이상의 문자, _는 문자 하나를 나타냅니다. %컵%는 머그컵인 3번만, 밑줄 두 개는 이름이 두 글자인 노트·볼펜·파일인 1·2·5번을 반환합니다. 글자 수는 문자 집합의 문자 기준이며 UTF-8 바이트 수와 다릅니다.
SELECT '진행률 10%' LIKE '%!%%' ESCAPE '!' AS has_percent;
실제 퍼센트 기호를 찾는 예에서는 ESCAPE로 !를 정하고 !%를 문자 %로 해석하게 했습니다. has_percent는 1입니다. 고정된 예제 패턴을 사용자 입력 검색에 그대로 이어 붙이지 말고, 매개변수 처리와 와일드카드 입력 정책을 분리하세요. 대소문자·문자 비교에는 열의 정렬 규칙도 영향을 줍니다. LIKE 공식 설명에서 와일드카드와 ESCAPE를 확인할 수 있습니다.
결과가 없거나 너무 많을 때 확인하기
조건을 한꺼번에 늘리지 말고 기본키와 조건에 쓰는 열을 함께 출력해 어느 행이 빠지는지 확인합니다. OR 대신 AND를 잘못 썼는지, 경계 비교가 >인지 >=인지, 문자열에 불필요한 공백이 있는지도 살펴봅니다. 조회 조건을 UPDATE나 DELETE에 재사용할 때는 결과 행을 먼저 확인해야 합니다.
NULL 메모를 note = NULL로 찾을 수는 없습니다. NULL과 입력 조건 설명처럼 IS NULL을 사용하고, NOT IN 목록에 NULL이 섞이면 제외 판단도 달라질 수 있다는 점을 기억하세요. WHERE의 일부만 지워 결과를 늘리는 방식으로 문제를 넘기지 말고 의도한 행 번호를 기준으로 확인합니다.
다시 실습하려면 SELECT DATABASE();, SHOW CREATE TABLE products_15_lab;와 저장된 행을 확인합니다. 보관할 데이터가 없는 이 글의 연습 테이블이 확실할 때만 아래 문장으로 지운 뒤 준비 코드를 다시 실행합니다. DROP TABLE은 구조와 데이터를 함께 없애며 일반적인 ROLLBACK으로 취소되지 않습니다.
DROP TABLE shopcourse.products_15_lab;










