Database/MySQL

[MySQL] WHERE 문

IT수정 2024. 9. 9. 14:40

시스템의 부하를 줄이려면 필요한 데이터만 검색해야 한다. SELECT 문으로 필요한 열만 검색하는 방법은 알아냈지만, 행 전체가 다 검색되므로 아직 필요한 데이터만 검색했다고 볼 수 없다. WHERE 문을 이용해 원하는 조건에 맞는 행을 검색하는 방법을 알아보자. 다음은 WHERE 문의 기본 형식이다.

SELECT [열] FROM [테이블] WHERE [열] = [조건값]

 

비교 연산자 사용하기

-- 숫자형 비교연산자
SELECT * FROM userTBL WHERE ipo_year = 2024
SELECT * FROM userTBL WHERE ipo_year < 2024
SELECT * FROM userTBL WHERE ipo_year >= 2024

-- 문자열형 비교연산자
SELECT * FROM userTBL WHERE symbol = '문자열'
SELECT * FROM userTBL WHERE symbol < '문자열'
SELECT * FROM userTBL WHERE symbol >= '문자열'

-- 날짜형 비교연산자
SELECT * FROM userTBL WHERE last_crawel_date = '2024-01-01'
SELECT * FROM userTBL WHERE last_crawel_date < '2024-01-01'
SELECT * FROM userTBL WHERE last_crawel_date >= '2024-01-01'

 

비교 연산자 종류

연산자 설명
< 필터링 조건보다 작은 값
<= 필터링 조건보다 같거나 작은 값
= 필터링 조건과 같은 값
> 필터링 조건보다 큰 값
>= 필터링 조건보다 같거나 큰 값
<>, != 필터링 조건과 같지 않은 값
!< 필터링 조건보다 작지 않은 값
!> 필터링 조건보다 크지 않은 값

 

논리 연산자 사용하기

논리 연산자 종류

연산자 설명
ALL 모든 비교 집합이 참이면 참
AND 두 부울 표현식이 참이면 참
ANY 비교 집합 중 하나라도 참이면 참
BETWEEN 피연산자가 범위 내에 있으면 참
EXISTS 하위 쿼리에 행이 포함되면 참
IN 피연산자가 리스트 중 하나라도 포함되면 참
LIKE 피연산자가 패턴과 일치하면 참
NOT 부울 연산자를 반대로 실행(보수)
OR 하나의 부울식이 참이면 참
SOME 비교 집합 중 일부가 참이면 참

 

AND/OR

-- sector가 'Finance'이면서 industry가 'Major Banks'인 데이터 검색
SELECT * FROM userTBL WHERE sector = 'Finance' AND industry = 'Major Banks'

-- 2013년3월17일~2013년3월19일을 포함한 날짜 검색
SELECT * FROM userTBL
WHERE last_crawel_date >= '2021-03-17'
  AND last_crawel_date <= '2021-03-19'
  
-- Symbol이 'A' 또는 'B'인 데이터 검색
SELECT * FROM userTBL WHERE symbol = 'A' OR symbol = 'B'

 

IN/LIKE

-- IN을 사용해 OR 반복 사용을 대체한 데이터 검색
SELECT * FROM userTBL WHERE symbol IN ('A', 'B', 'C')

-- LIKE를 사용해 김으로 시작하는 문자열의 내용을 검색
SELECT * FROM userTBL WHERE name LIKE '김%';

-- 한글자와 매치하기 위해서 '_'를 사용
SELECT * FROM userTBL WHERE name LIKE '_종신';

 

BETWEEN

-- 2010~2011 범위에 해당하는 값을 검색
SELECT * FROM userTBL WHERE ipo_year BETWEEN 2010 AND 2011

-- 2013년3월17일~2013년3월19일을 포함한 날짜 검색
SELECT * FROM userTBL WHERE last_crawel_date BETWEEN '2013-03-17' AND '2013-03-19'

-- 날짜형에 정확한 값을 사용해서 검색
SELECT * FROM userTBL WHERE last_crawel_date = '2013-03-17 00:00:00.000'

-- Symbol 열의 A~B 범윗값을 검색
SELECT * FROM userTBL WHERE symbol BETWEEN 'A' AND 'B'

-- Symbol 열의 A~B 범윗값을 제외하고 검색
SELECT * FROM userTBL WHERE symbol NOT BETWEEN 'A' AND 'B'

 

ANY/ALL/SOME/서브쿼리(하위쿼리)

ANY는 서브쿼리의 여러 개의 결과 중 하나만 만족해도 되며, ALL은 서브쿼리의 여러 개의 결과를 모두 만족시켜야 한다. 참고로 SOME과 ANY는 동일한 의미로 사용.

-- 김경호보다 키가 크거나 같은 사람의 이름과 키를 출력
SELECT name, height FROM userTBL
WHERE height >= [ANY] (SELECT height FROM userTBL WHERE name = '김경호')

-- 지역이 '경남'인 사람보다 키가 크거나 같은 사람의 이름과 키를 출력
SELECT name, height FROM userTBL
WHERE height >= [ANY] (SELECT height FROM userTBL WHERE region = '경남')

SELECT name, height FROM userTBL
WHERE height IN (SELECT height FROM userTBL WHERE region = '경남')

-- '100', '200', '300' 중 하나라도 일치하는 id의 모든 행을 출력
SELECT * FROM userTBL
WHERE id = ANY ('100', '200', '300')

-- '100', '200', '300' 중 모두를 가지는 id의 모든 행을 출력
SELECT * FROM userTBL
WHERE id = ALL ('100', '200', '300')

 

NULL이 들어있는 데이터 확인

-- sector가 NULL인 데이터 검색
SELECT * FROM userTBL WHERE sector IS NULL

-- NULL이 아닌 데이터 검색
SELECT * FROM userTBL WHERE sector IS NOT NULL

'Database > MySQL' 카테고리의 다른 글

[MySQL] 테이블 생성과 데이터 조작  (0) 2024.09.10
[MySQL] 데이터 그룹화  (0) 2024.09.09
[MySQL] 와일드카드  (3) 2024.09.09
[MySQL] ORDER BY 문  (0) 2024.09.09
[MySQL] SELECT 문  (0) 2024.09.09