SQL 문법 한 번에 정리하기

SELECT

select column_name from table_name;
  • ALIAS
    select t.column_name from table_name t;
    

ORDER BY

SELECT first, second
FROM table_name
ORDER BY first;

기본 값은 오름차순(ASC)

  • DESC 와 ASC 함께 쓰기
SELECT first_c, second_c
FROM table_name
ORDER BY
    first_c ASC,  second_c DESC;
  • 컬럼 순서에 따라 적용 가능
SELECT first_c, second_c
FROM table_name
ORDER BY
    1 ASC,  2 DESC;

DISTINCT

SELECT DISTINCT c_1
FROM table_name;
SELECT DISTINCT c_1, c_2
FROM table_name
ORDER BY c_1, c_2;

컬럼 두 개의 값이 모두 같은 행이 있을 경우 하나만 표시한다. 가독성을 위해 ORDER BY 를 사용한다.

SELECT
  DISTINCT ON (c_1) c_1, c_2
FROM table_name
ORDER BY c_1, c_2
;

괄호에 있는 c_1 컬럼 기준으로 중복이 제거된다. c_1의 중복된 행들 중 하나만 표시한다. 이때 표시되는 행은 c_2 의 정렬된 값 중 가장 우선 순위의 값을 표시한다.

WHERE

  • 연산자: =, >, <, <=, >=, <> (또는 !=), AND, OR
SELECT fst_name, last_name --3
FROM customer --1
WHERE fst_name = "Amy" --2
  AND last_name = "Rice"
;

LIMIT

특정 집합을 출력 시 출력하는 행의 수를 한정하는 역할을 한다. 부분 범위 처리 시 사용된다. PostgreSQL, MySQL 등에서 지원한다.

SELECT *
FROM T1
LIMIT 10 OFFSET 2
;

출력하는 행의 수를 10개로 지정한다. 행의 시작 위치는 0, 1 의 2개의 행을 제외한 3번째 행부터 시작한다.

ORDER BY 로 정렬을 하면 이 정렬된 결과 중에서 3번째 부터 10개의 값을 가져온다.

FETCH

출력하는 행의 수를 한정한다. 오라클에서 제공한다. LIMIT 절과 FETCH 절 중 선택해서 사용한다.

SELECT *
FROM T1
FETCH FIRST [N] ROW ONLY
;

N 개의 행을 가져온다.

N 을 입력하지 않고 ROW ONLY 만 입력하면 한 건만 출력한다.

SELECT *
FROM T1
OFFSET 5 ROWS
FETCH FIRST 10  ROW ONLY
;

6번째 행부터 10개의 행을 가져온다.

IN, NOT IN 연산자

특정 집합(컬럼 혹은 리스트)에서 특정 집합 혹은 리스트가 존재하는지 판단한다.

  • IN
SELECT *
FROM T1
WHERE C1 IN (V1, V2)
;

C1 이 V1 혹은 V2 값인 행을 출력한다.

C1 = V1 OR C1 = V2 와 같다.

IN 을 쓰는 이유는 가독성을 위함이며, DBMS 의 옵티마이저의 특성상 IN 이 OR 보다 성능이 좋다.

  • NOT IN
SELECT C1, C2
FROM T1
WHERE C1 NOT IN (V1, V2) -- 1
ORDER BY C2 DESC; --2
;

C1 이 V1 도 아니고 V2 도 아니어야 한다.

C1 <> V1 AND C1 <> V2 와 같다.

ORDER BY 는 WHERE 절에서 가져온 행에 대해서 진행된다.

  • 서브 쿼리
SELECT name
FROM  customer
WHERE customer_id IN (
  SELECT customer_id
  FROM rental
  WHERE
    CAST(return_date AS DATE) = '2019-05-27'
  )
;

서브 쿼리에서 return_date 가 2019-05-27 인 customer_id 를 먼저 출력한다.

메인 쿼리에서는 위의 해당되는 customer_id 의 name 을 출력한다.

  • DATE 표현 ` CAST(return_date AS DATE) = ‘2019-05-27’`

(NOT) BETWEEN

컬럼 값이 특정 범위 안에 들어가는 집합을 출력한다.

SELECT *
FROM T1
WHERE C1
  BETWEEN 1 AND 10
;

1 과 10을 포함하는 사이의 값을 출력한다.

  • NOT BETWEEN
SELECT *
FROM T1
WHERE C1
  NOT BETWEEN 1 AND 10
;

1 과 10을 포함하는 사이의 값을 제외한 값을 출력한다. (C1 < 1 AND C1 > 10)

  • 날짜
WHERE CAST(payment_date AS DATE)
BETWEEN `2017-02-07` AND '2017-02-15'
;

또는 TO_CHAR(payment_date, 'YYYY-MM-DD')

(NOT) LIKE

컬럼의 값이 특정 값과 유사한 패턴을 갖는 집한을 출력한다.

% 는 한 개 이상의 문자 매칭 _ 는 한 개의 문자의 매칭

WHERE name LIKE "Jen%"

Jen 으로 시작하는 문자열

WHERE name LIKE "_o_"

가운데에 o 가 들어가는 세 자리의 문자열

IS NULL

SELECT *
FROM T1
WHERE C1 IS NOT NULL
;

WHERE C1 = NULL 처럼 등호 연산자를 사용할 수 없다.