AD JB Toolbox 01

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;
같은 카테고리의 다른 글
MariaDB / Query / LEFT JOIN, RIGHT JOIN, INNER JOIN

MariaDB / Query / LEFT JOIN, RIGHT JOIN, INNER JOIN

SQL의 JOIN은 여러 테이블을 한 번에 나타낼 때 사용합니다. 대표적인 JOIN 방식은 LEFT JOIN, RIGHT JOIN, INNER JOIN이 있습니다. 다음은 세 가지 JOIN의 차이를 알아보기 위한 간단한 예제 테이블입니다.

MariaDB 강좌 / 날짜 계산하기: 기간·날짜 차이·표시 형식

MariaDB 강좌 / 날짜 계산하기: 기간·날짜 차이·표시 형식

기간 더하기, 날짜 차이와 시간 차이, 표시 형식을 고정 날짜로 비교합니다. 월말 조정과 함수별 인수 순서, 하루·한 달을 빠짐없이 조회하는 경계 조건을 설명합니다.

MariaDB 강좌 / 서브쿼리·EXISTS·NOT EXISTS로 조건 표현하기

MariaDB 강좌 / 서브쿼리·EXISTS·NOT EXISTS로 조건 표현하기

평균값 서브쿼리와 EXISTS·NOT EXISTS를 상품·고객·주문으로 실습합니다. 한 값의 반환 조건, 상관 키 누락, paid 주문 부재의 정의와 NOT IN의 NULL 함정을 설명합니다.

MariaDB 강좌 / NULL·기본값·NOT NULL·CHECK로 입력 조건 정하기

MariaDB 강좌 / NULL·기본값·NOT NULL·CHECK로 입력 조건 정하기

NULL·빈 문자열·0·입력 생략을 구분하고 DEFAULT·NOT NULL·CHECK의 역할을 실습합니다. nullable 열의 CHECK 예외, 실패 입력, 제약 이름과 설정 복원 방법을 설명합니다.

MariaDB / 샘플 데이터베이스 employees 설치하는 방법

MariaDB / 샘플 데이터베이스 employees 설치하는 방법

데이터베이스를 다루는 공부를 할 때 데이터가 들어있는 데이터베이스가 있으면 좋습니다. 데이터베이스를 직접 만드는 방법도 있지만, 공개된 샘플 데이터베이스를 이용하면 편합니다. 예를 들어 SQL Server라면 AdventureWorks라는 샘플 데이터베이스를 마이크로소프트에서 제공합니다. MariaDB라면 employees를 사용하면 됩니다.

MariaDB / 데이터베이스 저장 위치 변경하는 방법

MariaDB / 데이터베이스 저장 위치 변경하는 방법

MariaDB의 버전이 12.1이라고 할 때, 윈도우용 MariaDB의 기본 설치 위치는 C:\Program Files\MariaDB 12.1, 데이터베이스 저장 위치는 C:\Program Files\MariaDB 12.1\data입니다. 데이터베이스 저장 위치를 다음으로 변경해보겠습니다. D:\Database\MariaDB\data

MariaDB 강좌 / MariaDB란? 데이터베이스·SQL·MySQL과의 관계

MariaDB 강좌 / MariaDB란? 데이터베이스·SQL·MySQL과의 관계

MariaDB 서버·클라이언트와 데이터베이스·테이블·행·열의 관계를 상품 예제로 이해합니다. SQL의 역할, MySQL과의 관계, 이후 강좌에서 사용할 실습 환경을 구분합니다.

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

DATE·DATETIME·TIMESTAMP의 저장 의미와 시간대 처리를 비교합니다. 동일 입력의 한국 시간·UTC 조회 결과, 버전별 TIMESTAMP 범위, 날짜 오류와 설정 복원을 실습합니다.

MariaDB 강좌 / VIEW로 자주 쓰는 조회를 정의하기

MariaDB 강좌 / VIEW로 자주 쓰는 조회를 정의하기

CREATE VIEW로 결제 주문 합계를 정의하고 원본 변경·취소가 조회 결과에 반영되는지 확인합니다. CTE와의 차이, INVOKER·DEFINER 권한, 집계 뷰의 수정 제한과 정리 순서를 설명합니다.

MariaDB / 연산자 / 논리 연산자

MariaDB / 연산자 / 논리 연산자

MariaDB의 논리 연산자에 대하여 알아보겠습니다. 예제로 사용하는 테이블은 아래의 데이터를 가진 T_2이라는 테이블입니다. 각 열의 데이터 형식은 다음과 같습니다. C_1 : 정수 C_2 : 문자 +----+------+------+ | ID | C_1 | C_2 | +----+------+------+ | 1 | 1 | A | | 2 | ...