본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL SELECT · WHERE 조건 조회 완전 정리

by 왕진 2026. 7. 14.
반응형

 

 

Web Development · MySQL

MySQL SELECT · WHERE —
조건 조회 완전 정리

WHERE / AND / OR / BETWEEN / IN / LIKE — 원하는 행만 골라내는 필터 문법
시작 오늘 분석할 코드

usertbl에서 다양한 조건으로 원하는 행만 추려내는 SELECT 쿼리들이다. 단순 비교부터 범위 조건, 목록 포함, 패턴 매칭까지 WHERE절의 핵심 문법이 모두 담겨 있다.

SELECT * FROM usertbl; -- usertbl 전체를 다 보여달라 SELECT * FROM usertbl WHERE name = '김경호'; -- name 컬럼에서 '김경호'인 행만 전체 컬럼으로 조회 SELECT userID, name FROM usertbl WHERE birthYear >= 1970 AND height >= 182; -- 1970년 이후 출생 AND 키 182 이상인 사람 SELECT userID, name FROM usertbl WHERE birthYear >= 1970 OR height >= 182; SELECT name, height FROM usertbl WHERE height >= 180 AND height <= 183; SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183; -- BETWEEN: 180 이상 183 이하 (경계값 포함) SELECT name, addr FROM usertbl WHERE addr IN ('경남','전남','경북'); -- IN: 목록 중 하나에 해당하면 포함 SELECT name, height FROM usertbl WHERE name LIKE '김%'; -- 김씨로 시작하는 모든 행 SELECT name, height FROM usertbl WHERE name LIKE '_종신'; -- _ 는 글자 1개 와일드카드 → ?종신
용어 용어 정리
WHERE조건절 — 이 조건을 만족하는 행만 결과에 포함
AND두 조건 모두 참인 행만 선택
OR두 조건 중 하나라도 참인 행 선택
BETWEEN A AND BA 이상 B 이하 범위 (경계값 포함)
IN (목록)목록 안에 있는 값 중 하나와 일치
LIKE패턴 매칭 — % (0개 이상), _ (정확히 1개)
%0개 이상의 임의 문자 — '김%' = 김으로 시작
_정확히 1개의 임의 문자 — '_종신' = X종신

1 WHERE — 행을 걸러내는 필터

SELECT * FROM usertbl WHERE name = '김경호'의 구조를 보면 : SELECT는 "무엇을", FROM은 "어디서", WHERE는 "어떤 조건의 행만"이라는 필터다. WHERE 없이 SELECT하면 전체 행이 나온다. WHERE로 조건을 걸면 그 조건을 만족하는 행만 결과에 포함된다.

SELECT * -- 모든 컬럼 FROM usertbl -- usertbl 테이블에서 WHERE name = '김경호'; -- name이 '김경호'인 행만

2 AND / OR — 조건 결합

조건 두 개 이상을 결합할 때 AND와 OR를 쓴다. AND는 모두 만족해야 하고, OR는 하나만 만족해도 된다.

연산자 의미 예시 결과
A AND B A도 참 AND B도 참 1970년 이후 출생이면서 키 182 이상인 사람
A OR B A가 참 OR B가 참 1970년 이후 출생이거나 키 182 이상인 사람
※ AND가 OR보다 우선순위가 높다. A OR B AND CA OR (B AND C)로 평가된다. 의도가 다르다면 괄호로 명시해야 한다.

3 BETWEEN — 범위 조건

height BETWEEN 180 AND 183height >= 180 AND height <= 183과 완전히 동일하다. 단, BETWEEN은 경계값(180, 183)을 포함한다는 점을 기억해야 한다.

-- 동일한 결과 WHERE height >= 180 AND height <= 183 WHERE height BETWEEN 180 AND 183 -- 더 읽기 쉬움

 

반응형

 

4 IN — 목록 포함 조건

addr IN ('경남','전남','경북')은 addr가 세 값 중 하나와 일치하는 행을 선택한다. OR를 여러 번 쓰는 것과 동일하지만 코드가 훨씬 간결해진다.

-- OR로 쓴 것 WHERE addr='경남' OR addr='전남' OR addr='경북' -- IN으로 줄인 것 (같은 결과) WHERE addr IN ('경남','전남','경북')

5 LIKE — 패턴 매칭

문자열을 정확히 모르거나, 특정 패턴으로 시작/끝나는 행을 찾을 때 쓴다.

패턴 의미 일치 예시
'김%' 김으로 시작하는 모든 문자열 김경호, 김범수, 김OO…
'%경%' 경을 포함하는 모든 문자열 김경호, 조용필의경기…
'_종신' 1글자 + 종신 윤종신
'__경호' 2글자 + 경호 김경호(3글자 이름)
※ LIKE는 인덱스를 타지 않는 경우가 많아 대용량 데이터에서 성능 문제가 생길 수 있다. 앞에 %가 붙는 패턴('%김')은 특히 느리다.

6 ORDER BY + LIMIT — 정렬과 개수 제한
결과를 정렬하고 상위 N개만 가져오기

WHERE로 행을 걸러낸 뒤 ORDER BY로 정렬하고 LIMIT으로 개수를 제한할 수 있다. 게시판의 "최신 글 5개", 쇼핑몰의 "인기 상품 TOP3" 같은 기능에 사용된다.

SELECT name, height FROM usertbl ORDER BY height DESC -- 키 큰 순서로 정렬 (DESC=내림차순) LIMIT 3; -- 상위 3명만 SELECT name, birthYear FROM usertbl ORDER BY birthYear ASC; -- 나이 많은 순 (출생년도 오름차순)
키워드 의미 기본값
ORDER BY 컬럼 ASC 오름차순 정렬 (작은→큰) ASC는 생략 가능 (기본)
ORDER BY 컬럼 DESC 내림차순 정렬 (큰→작은) 최신/최고값 먼저 볼 때
LIMIT n 결과 최대 n개만 반환 생략 시 전체 반환

7 NOT 조건 — 제외 패턴
포함 조건의 반대 — NOT IN / NOT LIKE / NOT BETWEEN

특정 조건을 제외하고 싶을 때 NOT을 붙인다. IN, LIKE, BETWEEN 모두 NOT과 함께 쓸 수 있다.

SELECT name, addr FROM usertbl WHERE addr NOT IN ('서울','경남'); -- 서울, 경남 제외 SELECT name, height FROM usertbl WHERE height NOT BETWEEN 170 AND 180; -- 170~180 범위 제외 SELECT name, height FROM usertbl WHERE name NOT LIKE '김%'; -- 김씨 제외
NOT은 조건을 뒤집는다. NOT IN = 목록에 없는 것, NOT BETWEEN = 범위 밖, NOT LIKE = 패턴에 안 맞는 것. NULL 제외는 WHERE 컬럼 IS NOT NULL.

8 SELECT 완전한 문법 순서
SELECT 절 실행 순서 — 작성 순서 ≠ 실행 순서

SQL은 작성하는 순서와 실행하는 순서가 다르다. WHERE가 먼저 실행되어 행을 걸러내고, 그다음 SELECT로 컬럼을 고르고, ORDER BY로 정렬한다.

실행 순서 역할
1 FROM 데이터를 가져올 테이블 지정
2 WHERE 조건에 맞는 행만 필터링
3 SELECT 보여줄 컬럼 선택
4 ORDER BY 결과 정렬
5 LIMIT 개수 제한
작성 순서: SELECT → FROM → WHERE → ORDER BY → LIMIT. 실행 순서: FROM → WHERE → SELECT → ORDER BY → LIMIT. 차이를 알아야 WHERE에서 SELECT의 별칭(alias)을 못 쓰는 이유를 이해할 수 있다.

9 AS — 컬럼 별칭으로 출력 이름 바꾸기

SELECT 결과에 표시되는 컬럼명을 바꾸고 싶을 때 AS 별칭을 사용한다. 컬럼명이 길거나 계산식일 때 특히 유용하다.

SELECT name, height AS '키(cm)' FROM usertbl; -- 결과 컬럼명이 'height' 대신 '키(cm)'으로 출력됨 SELECT price * amount AS '총액' FROM buytbl; -- 계산 결과 컬럼명을 '총액'으로 지정
WHERE 절에서는 AS 별칭을 사용할 수 없다. SQL 실행 순서상 WHERE가 SELECT보다 먼저 실행되기 때문이다. ORDER BY에서는 별칭 사용 가능.

10 자주 하는 실수
실수 증상 해결
문자열 값에 따옴표 생략 컬럼명으로 인식되어 오류 문자열은 반드시 '값' (작은따옴표)
BETWEEN 방향 반대로 결과 없음 BETWEEN 작은값 AND 큰값 순서 지킬 것
IN 목록에 콤마 없음 문법 오류 IN ('a','b','c') — 각 값 콤마 구분
AND/OR 우선순위 혼동 의도와 다른 행 선택 복잡한 조건은 괄호로 명시
= 로 NULL 비교 결과 항상 없음 NULL 비교는 IS NULL / IS NOT NULL

핵심 한 줄 요약

WHERE조건에 맞는 행만 거르는 필터
AND / ORAND = 모두 만족 / OR = 하나만 만족 (AND 우선순위 높음)
BETWEEN A AND BA 이상 B 이하 (경계 포함) — AND 두 번 쓰는 것과 동일
IN (목록)OR 여러 개를 깔끔하게 줄인 것 — NOT IN으로 제외 가능
LIKE '김%'% = 0개 이상, _ = 정확히 1글자 와일드카드
ORDER BY 컬럼 DESC내림차순 정렬 — ASC(기본)는 오름차순
LIMIT n결과 최대 n개 — ORDER BY와 함께 TOP-N 패턴에 사용
IS NULL / IS NOT NULLNULL 비교는 = 이 아닌 IS NULL 사용
NOT IN / NOT LIKE조건의 반대 — 제외 조건에 사용
SELECT 실행 순서FROM → WHERE → SELECT → ORDER BY → LIMIT (작성 순서와 다름)
* vs 컬럼명 지정* = 전체 컬럼, 실무에서는 필요한 컬럼만 명시 권장
AS 별칭SELECT name AS '이름' — 출력 컬럼명 변경, WHERE에서는 별칭 사용 불가
AND 우선순위 주의A OR B AND C = A OR (B AND C) — 의도와 다르면 괄호로 명시
LIKE 성능앞에 % 붙이면 인덱스 못 탐 — '김%'은 OK, '%김'은 느림
WHERE → 실행 순서FROM → WHERE(필터) → SELECT(컬럼) → ORDER BY → LIMIT
SELECT * 주의개발 시엔 편하지만 불필요한 컬럼까지 읽어 성능 저하 가능
DISTINCTSELECT DISTINCT addr → 중복 제거된 addr 목록 (배운 내용 심화)
비교 연산자 정리= / != / > / >= / < / <= — 문자열도 동일하게 적용
NOT IN / NOT BETWEENNOT IN(목록)=목록 외, NOT BETWEEN A AND B=범위 밖 행 선택
NULL 조건WHERE col = NULL → 항상 결과 없음. WHERE col IS NULL 사용
DISTINCTSELECT DISTINCT addr → addr의 중복 제거된 고유값 목록
SELECT 기본 구조SELECT 컬럼 FROM 테이블 WHERE 조건 ORDER BY 컬럼 LIMIT 수
BETWEEN 경계 포함BETWEEN 180 AND 183 → 180, 181, 182, 183 모두 포함 (>=, <= 동일)
IN vs OR 성능IN이 가독성 좋음, 같은 컬럼의 OR 여러 개를 묶을 때 사용
WHERE절 문자열WHERE name = '김경호' — 반드시 작은따옴표. 큰따옴표는 MySQL에서 컬럼으로 해석
ORDER BY 여러 컬럼ORDER BY addr ASC, name DESC → addr 오름차순, 같으면 name 내림차순

Tags

#MySQL #SELECT #WHERE #AND #OR #BETWEEN #IN #LIKE #조건조회 #와일드카드 #SQL쿼리 #데이터조회 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, SELECT, WHERE, AND, OR, BETWEEN, IN, LIKE, 조건조회, 와일드카드, SQL쿼리, 데이터조회, 웹개발, 티스토리
반응형

댓글