[sql] LIMIT, BETWEEN, IN, LIKE, ILIKE 정리

[sql] LIMIT, BETWEEN, IN, LIKE, ILIKE 정리

·

4 min read

📌 [SQL 기초] - LIMIT, BETWEEN, IN, LIKE, ILIKE

LIMIT – 조회 결과 개수 제한

SELECT * FROM payment
WHERE amount != 0.00
ORDER BY payment_date DESC
LIMIT 5;
  • payment 테이블에서 payment_date 열 기준 내림차순으로 최대 5개의 행만 조회

  • 실무에서 대량 데이터 조회 시 성능 최적화를 위해 사용

  • ORDER BY와 함께 사용하면 매우 유용함

  • 가장 마지막에 실행되는 명령어임(모든 조건들을 만족하고 난 후에 최종적으로 몇 개의 행을 표시하고 싶은지 묻는 것)

SELECT * FROM payment
LIMIT 1;
  • 위와 같이 실제 테이블이 어떻게 구성되어 있는지 빠르게 파악하는 방법도 있다.

BETWEEN – 특정 범위의 값 조회

SELECT * FROM employees WHERE salary BETWEEN 50000 AND 80000;
  • salary가 50,000에서 80,000 사이인 직원 조회

  • 시작 값과 끝 값 포함 (>= 50000 AND <= 80000 과 동일)

  • 날짜에도 적용 가능

      SELECT * FROM released_date WHERE game BETWEEN '2007-01-01' AND '2007-02-01';
    

    하지만 날짜(DATETIME) 데이터를 다룰 때는 주의할 점이 있다

      SELECT * FROM orders 
      WHERE order_date BETWEEN '2024-02-01' AND '2024-02-10';
    

    예를 들어, 이렇게 쓰면, order_date2024-02-01 00:00:00 이상이고, 2024-02-10 00:00:00 이하인 데이터를 찾게 된다.

    즉, 2024-02-10의 "하루 전체(예: 2024-02-10 23:59:59)"가 포함되지 않고, 2024-02-10 00:00:00까지만 포함된다.

    따라서 만약 2024-02-10 하루 전체를 포함하고 싶다면, BETWEEN 대신 아래처럼 < 연산자를 써야 한다.

       SELECT * FROM orders 
      WHERE order_date >= '2024-02-01' 
      AND order_date < '2024-02-11';
    

    이렇게 하면 2024-02-10 23:59:59까지 포함되고, 2024-02-11 00:00:00부터는 제외된다.

NOT BETWEEN – 특정 범위의 값 조회

SELECT * FROM employees WHERE salary NOT BETWEEN 10000 AND 50000;
  • salary가 10,000에서 50,000 사이가 아닌 직원 조회

  • 시작 값과 끝 값 포함 X (10,000, 50,000 포함 X)


IN – 특정 값 목록과 일치하는 데이터 조회

SELECT * FROM employees WHERE department IN ('Sales', 'Marketing');
  • department가 'Sales' 또는 'Marketing'인 직원 조회

  • 다중 조건을 간결하게 표현할 때 유용 (OR 대신 사용 가능)

SELECT color FROM table WHERE color IN ('red','blue','green')
  • color가 red, blue, green인 것을 호출

  • 모든 옵션(red,blue…) 사이에는 OR이 들어감

  • NOT 연산자와 결합하여 해당 값들을 제외한 행을 찾을 수도 있음


LIKE – 특정 패턴과 일치하는 “문자열” 조회

SELECT * FROM employees WHERE name LIKE 'J%';
SELECT * FROM film WHERE title LIKE 'Mission Impossible _'; -- _ 사용 예시
  • 이름이 'J'로 시작하는 직원 조회

    • LIKE는 대소문자 구분
  • 와일드카드 % 사용 (%는 0개 이상의 문자, _는 정확히 하나의 문자)

    • Version#A4, Version#B7 등의 포맷일 때,

        WHERE value LIKE 'Version#__' -- _을 2개 사용
      
    • Cheryl, Theresa, Sherri로 예시 (앞에는 한 글자, 중간에는 her, 뒤에는 아무거나 와도 괜찮은 경)

        WHERE name LIKE '_her%'
      
  • 사용 예시:

    • @gmail.com으로 끝나는 모든 이메일

    • 대문자 A로 시작하는 모든 이름


ILIKE – 대소문자 구분 없이 패턴 검색 (PostgreSQL)

SELECT * FROM employees WHERE name ILIKE 'j%';
SELECT * FROM customer WHERE first_name LIKE '%J' AND last_name LIKE 'S%'
SELECT * FROM customer WHERE first_name LIKE '%er%' -- 중간에 er 이 들어간 이름
SELECT * FROM customer WHERE first_name NOT LIKE '%er%'
  • 첫번째: 이름이 'J' 또는 'j'로 시작하는 직원 조회

  • LIKE와 동일하지만 대소문자 구분 없음 (PostgreSQL에서만 지원)


In English:

  • LIMIT restricts the number of rows returned in a query.

  • BETWEEN selects values within a given range, including the boundary values.

  • IN checks if a column's value matches any value in a specified list.

  • LIKE searches for a pattern in a column using wildcards (% and _).

  • ILIKE is similar to LIKE but ignores case (PostgreSQL only).


📝 오늘 배운 점:

  • LIMIT을 사용하면 대량 데이터 조회 시 성능을 최적화할 수 있다.

  • BETWEEN은 시작 값과 끝 값이 포함되므로 범위 설정 시 주의해야 한다.

  • IN을 활용하면 여러 개의 OR 조건을 간결하게 표현할 수 있다.

  • LIKE에서 %는 여러 문자와 매칭되고, _는 정확히 한 문자와 매칭된다.

  • PostgreSQL에서는 ILIKE을 사용하면 대소문자 구분 없이 문자열을 검색할 수 있다.

  • SQL을 잘 활용하면 원하는 데이터를 더 효율적으로 추출할 수 있다.


연습 문제

Challenge Task 1

  • 처음으로 결제한 10명의 고객에게 보상하고 싶은 상황.

  • 처음으로 결제를 생성한 고객 10명의 고객 ID는 무엇일까?

      SELECT customer_id FROM payment
      ORDER BY payment_date ASC
      LIMIT 10;
    

Challenge Task 2

  • 점심 시간에 볼 짧은 비디오를 빨리 대여해가고 싶은 고객이 방문한 상황

  • 상영 시간이 가장 짧은 영화 5편의 제목은?

      SELECT title,length FROM film
      ORDER BY length ASC
      LIMIT 5;
    
  • 주의할 점:

    • LIMIT을 5로 입력한다고 해서 상영 시간이 가장 짧은 영화가 5편뿐이라고 장담할 수 없다.

    • 그렇기 때문에 LIMIT을 늘려가면서 중복되는 값이 5개를 넘는지 살펴볼 필요가 있다.

Challenge Task 3

  • Task2의 고객이 50분 이하의 영화를 볼 수 있다면, 몇 가지의 선택권이 있을까?

      SELECT COUNT(title) FROM film
      WHERE length <= 50;
    

Challenge Task 4

  • 제목에 Truman이 들어간 영화는 총 몇 개일까?

       SELECT COUNT(*) FROM film
      WHERE title ILIKE '%truman%'; -- 양 옆에 %를 넣는 것을 잊지 말자