시작 오늘 분석할 코드
usertbl에서 다양한 조건으로 원하는 행만 추려내는 SELECT 쿼리들이다. 단순 비교부터 범위 조건, 목록 포함, 패턴 매칭까지 WHERE절의 핵심 문법이 모두 담겨 있다.
SELECT * FROM usertbl; SELECT * FROM usertbl WHERE name = '김경호'; SELECT userID, name FROM usertbl WHERE birthYear >= 1970 AND height >= 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; SELECT name, addr FROM usertbl WHERE addr IN ('경남','전남','경북'); SELECT name, height FROM usertbl WHERE name LIKE '김%'; SELECT name, height FROM usertbl WHERE name LIKE '_종신';
용어 용어 정리
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 C는 A OR (B AND C)로 평가된다. 의도가 다르다면 괄호로 명시해야 한다.
3 BETWEEN — 범위 조건
height BETWEEN 180 AND 183은 height >= 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 LIMIT 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; 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; 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쿼리, 데이터조회, 웹개발, 티스토리
댓글