💡WHERE절
[WITH <Sub Query>]
SELECT column_list
FROM table_name
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC|DESC]]
- SELECT 컬럼리스트: 3. 컬럼 지정 (보고 싶은 컬럼만 가져오기) > Projection
- FROM 테이블: 1. 테이블 지정
- WHERE 조건: 2. 조건 지정 (보고 싶은 행만 가져오기) > Selection
WHERE은 조건을 가지고 있는 절이다.
SELECT절에는 실행순서가 정해져 있는데, 이때 실행순서는 코딩 순서가 아니라 FROM(1) > WHERE(2) > SELECT(3) 순서이다.
WHERE절은 레코드(행)을 검색하여 원하는 행만 추출하는 역할을 한다.
SELECT문에 대한 정보는 위의 글을 참고하도록 하자.
WEHRE절의 사용
SELECT
*
FROM TBLCOUNTRY
WHERE continent = 'AS'; -- Asia
WHERE절의 조건은 하나의 행씩 검증한다는 특징이 있다.
WHERE절은 각 행에 접근하면서 continent에는 있는 값이 조건을 만족할 경우 통과시킨다.
WHERE 사용 예시
SELECT * FROM TBLCOUNTRY
WHERE capital = '카이로';
SELECT * FROM TBLCOUNTRY
WHERE population = 4405;
SELECT * FROM TBLCOUNTRY
WHERE continent = 'AS' OR continent = 'EU';
SELECT * FROM TBLCOUNTRY
WHERE area >= 20 AND population <= 10000;
WHERE절의 컬럼
SELECT * FROM TBLINSA
WHERE 1 = 1;
WHERE절은 조건절에 반드시 컬럼이 포함될 필요는 없다.
true/false를 판단할 수만 있으면 조건절로서 가능하기 때문에 이와 같은 작업이 가능하다.
WHERE절의 성능 문제
서울 or 인천 and 과장 or 부장 and 급여(2500000 ~ 3000000)
SELECT * FROM TBLINSA
WHERE CITY IN ('서울', '인천') AND JIKWI IN ('과장', '부장')
AND BASICPAY BETWEEN 2500000 AND 3000000;
만약 beween, in 연산자를 사용하지 않는다면 이는 성능 문제 때문이다.
between, in 연산자는 데이터가 압도적으로 많은 상황에서 비교 연산자보다 느린 편이다.
데이터가 10만 건 이하에는 사용해도 된다. 그러나 데이터가 그 이상인 업무에서는 부하가 걸릴 수 있으므로 비교 연산자를 권장한다.
성능이 중요하긴 하지만, 가독성 또한 중요하기 때문에 평소에 사용하는 것은 문제가 되진 않는다.
💡WHERE절의 연산자
between
컬럼명 between 최솟값 and 최댓값
between 연산자는 where절에서 범위 조건으로 가독성을 높이기 위해 사용한다.
기본 급여가 100만 원 이상 120만 원 이하인 사람
-- 가변적
SELECT * FROM TBLINSA WHERE BASICPAY >= 1000000 AND BASICPAY <= 1200000;
SELECT * FROM TBLINSA WHERE 1200000 >= BASICPAY AND BASICPAY >= 1000000; -- 가독성 낮음
-- 고정적
SELECT * FROM TBLINSA WHERE BASICPAY BETWEEN 1000000 AND 1200000;
위 3개의 코드는 모두 똑같은 결과를 출력한다.
그런데 비교 연산자를 사용한 2개 코드는 가변적인 것과 달리 between 연산자를 사용한 코드는 변형되는 형태가 없고 무조건 고정적이다.
이처럼 between 연산자의 고정적인 특성 때문에 코드의 가독성이 높아진다는 장점이 있다.
in
컬럼명 in (값, 값, 값)
in 연산자는 열거형 조건으로, between 연산자와 같이 가독성 향상을 목적으로 사용한다.
부서가 개발부 또는 총무부인 사람
SELECT * FROM TBLINSA
WHERE BUSEO = '개발부' OR BUSEO = '총무부';
SELECT * FROM TBLINSA
WHERE BUSEO IN ('개발부', '총무부');
like
컬럼명 like '패턴 문자열'
like 연산자는 문자열의 패턴을 비교할 때 사용하며, 정규 표현식의 간단한 버전이라고 생각하면 된다.
like 절은 검색 등에 있어서 사용 빈도가 굉장히 높다.
패턴 문자열의 구성요소
- _: 임의의 문자 1개(.)
- %: 임의의 문자 N개 0 ~ 무한대(.*)
'김OO' 찾기
SELECT * FROM TBLINSA WHERE NAME LIKE '김__';
'O길O' 찾기
'OO수' 찾기
S로 시작하는 사람
SELECT * FROM EMPLOYEES WHERE FIRST_NAME LIKE 'S%';
%는 출현 횟수가 와일드카드이므로 글자수에 제한이 없다.
'길'이 포함된 사람
SELECT * FROM TBLINSA WHERE NAME LIKE '%길%';
주민번호로 여자만 찾기
SELECT * FROM TBLINSA WHERE SSN LIKE '______-2______';
SELECT * FROM TBLINSA WHERE SSN LIKE '%-2%';
주민번호로 남자만 찾기
SELECT * FROM TBLINSA WHERE SSN LIKE '______-1______';
SELECT * FROM TBLINSA WHERE SSN LIKE '%-1%';
null 조건
컬럼명 is null
RDBMS에서의 null은 컬럼값(셀)이 비어있는 상태를 가리킨다.
RDBMS에서는 null 상수를 제공한다.
대부분의 언어에서 null은 연산의 대상이 될 수 없다.
SELECT * FROM TBLCOUNTRY WHERE POPULATION = null;
따라서 WHERE절에 null만 쓰이면 무조건 100% 조건을 만족하지 못한다.
null을 비교하기 위해서는 is null을 사용한다.
인구수가 미기재된 나라
SELECT * FROM TBLCOUNTRY WHERE POPULATION is null;
인구수가 기재된 나라
SELECT * FROM TBLCOUNTRY WHERE NOT POPULATION is null; -- 비선호
SELECT * FROM TBLCOUNTRY WHERE POPULATION is NOT null; -- 선호
비어있지 않은 데이터를 찾을 때에는 is NOT null을 사용한다.
실행하지 않은 할 일과 실행 완료한 할 일
-- 아직 실행하지 않은 할 일
SELECT * FROM TBLTODO WHERE COMPLETEDATE IS NULL;
-- 실행 완료한 할 일
SELECT * FROM TBLTODO WHERE COMPLETEDATE IS NOT NULL;
비교 연산자
숫자형
SELECT * FROM TBLINSA WHERE BASICPAY >= 1000000 AND BASICPAY <= 1200000;
SELECT * FROM TBLINSA WHERE BASICPAY BETWEEN 1020000 AND 1100000;
문자형 (문자코드)
SELECT * FROM TBLINSA WHERE name > '이순신'; -- name.compareTo("이순신")
SELECT * FROM EMPLOYEES WHERE FIRST_NAME >= 'J' AND FIRST_NAME <= 'L';
SELECT * FROM EMPLOYEES WHERE FIRST_NAME BETWEEN 'J' AND 'L';
날짜/시간형
데이터베이스 > NLS에서 형식을 수정하여 내가 원하는 날짜/시간 표현이 출력되도록 할 수 있다.
SELECT * FROM TBLINSA WHERE IBSADATE >= '2000-01-01';
SELECT * FROM TBLINSA
WHERE IBSADATE >= '2000-01-01' AND IBSADATE <= '2000-12-31';
SELECT * FROM TBLINSA
WHERE IBSADATE between '2000-01-01' AND '2000-12-31';
날짜/시간형에도 대입 연산자와 beween 연산자를 사용하여 비교할 수 있으며, 날짜 상수로 인식하여 직접적인 비교가 가능하다.