본문 바로가기
  • Fearless
프로그래밍언어/SQL

[SQL] (4) 고급 데이터 필터링

by Albatross 2022. 7. 11.
반응형

AND OR 등 논리연산자를 활용하여 WHERE 조건문을 강화한다.

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE date BETWEEN 20220301 AND 20220331 AND price < 360 LIMIT 10;

AND를 활용하여 3월 한달간 price < 360인 데이터를 호출한다.

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE date BETWEEN 20220301 AND 20220331 OR price < 360 LIMIT 10;

OR을 활용하면 3월 데이터이거나, price < 360인 데이터가 반환된다. 

이 경우 2월 당시 price < 360이었기 때문에 해당 데이터가 반환되었다.

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE date = 20220302 OR date =  20220331 AND price < 360 LIMIT 10;

내가 원했던 것은 03/02, 03/31 데이터 중 price < 360인 자료다.

그러나 AND가 20220331이면서 price < 360인 것으로 먼저 처리되었기 때문에 price 조건문과 무관한 20220302 자료가 모두 호출되었다. 이는 AND가 OR보다 먼저 처리되기 때문에 발생하는 문제다. 

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE (date = 20220302 OR date =  20220331) AND price < 360 LIMIT 10;

따라서 괄호를 사용하여 연산자 순서를 지정해주자. 

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE date in (20220302, 20220303, 20220331, 20220402) LIMIT 10;

조건이 많아질 때는 IN 연산자가 OR보다 깔끔하고 가독성이 높다. 

IN 연산자가 OR보다 목록을 처리함에 있어 속도가 빠르다. 

 

SELECT DISTINCT date, time, price FROM future.kospi200 WHERE date NOT IN (20220302, 20220303, 20220331, 20220402) LIMIT 10;

>이면 <=를 사용하면 되고 =이면 !=를 사용하면 되지만, 조건문이 길어질수록 NOT의 활용도가 높아진다.

반응형

'프로그래밍언어 > SQL' 카테고리의 다른 글

[SQL] (5) 와일드카드 문자  (0) 2022.07.12
[SQL] (3) 데이터 필터링  (0) 2022.07.10
[SQL] (2) 데이터 정렬하기  (0) 2022.07.08
[SQL] (1) 데이터 가져오기  (0) 2022.07.07