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 / 데이터베이스 저장 위치 변경하는 방법

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

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

MariaDB 강좌 / 서버 설정·SQL 모드·시간대·로그 확인하기

MariaDB 강좌 / 서버 설정·SQL 모드·시간대·로그 확인하기

설정 파일·GLOBAL·SESSION의 차이를 기준으로 MariaDB 동작을 확인합니다. SQL 모드 오류와 TIMESTAMP·DATETIME 시간대 실습, 로그 조건 점검 및 변경 복구 절차를 제공합니다.

MariaDB 강좌 / 두 연결로 격리 수준·잠금·교착 상태 확인하기

MariaDB 강좌 / 두 연결로 격리 수준·잠금·교착 상태 확인하기

별도 연결 A·B의 실행 순서대로 격리 수준, 행 잠금 대기와 교착 상태를 비교합니다. 초기화·재조회·오류 후 정리와 연결별 설정 복원까지 전체 코드로 확인합니다.

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

NULL·빈 문자열·0을 구분하고 IS NULL·IS NOT NULL과 COALESCE의 역할을 실습합니다. 일반 비교에서 빠지는 NULL 행, NULL-safe 비교와 NOT IN 목록의 함정을 설명합니다.

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

사용자·호스트 조합을 확인하고 상품 한 테이블의 SELECT만 허용하는 계정을 만듭니다. 새 연결의 허용·거절 시험, 권한 회수와 기존 계정을 덮어쓰지 않는 정리 절차를 설명합니다.

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

SELECT의 열 선택과 AS 별칭, 행별 계산식, DISTINCT의 열 조합 기준을 실습합니다. 원본 데이터와 출력 결과를 구분하고 WHERE에서 별칭을 사용할 때의 주의점을 설명합니다.

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 강좌 / GROUP BY·HAVING으로 묶고 집계 결과 걸러내기

MariaDB 강좌 / GROUP BY·HAVING으로 묶고 집계 결과 걸러내기

GROUP BY로 분류별 상품 수·재고·금액을 계산하고 HAVING으로 그룹을 제한합니다. WHERE 적용 시점과 비집계 열·SQL 모드·NULL 그룹의 주의점을 비교 실습으로 설명합니다.

MariaDB 강좌 / Windows에 MariaDB 설치하고 서버 실행하기

MariaDB 강좌 / Windows에 MariaDB 설치하고 서버 실행하기

Windows MSI 설치에서 서버·클라이언트, 관리자 인증, 서비스와 포트를 설정합니다. SQL 실행을 확인하고 이후 강좌에서 사용할 학습용 계정을 준비하며 시작·접속 오류를 점검합니다.