SQL

NOTE

SQL 기초 문법 정리. 필드 조회(SELECT), 조건식(WHERE), 정렬(ORDER BY), JOIN, 집합 연산(UNION), 서브쿼리, CRUD 구문.

NOTE

원문의 스마트 따옴표·연산자 오타(≤, NOT IS NULL, MINUSM INSESET 등)를 표준 SQL로 교정함(사실 확인 권장).

💻 예시

필드 조회 (SELECT)

-- 단일/여러 필드 조회
SELECT 필드이름 FROM 테이블;
SELECT 필드이름1, 필드이름2 FROM 테이블;
 
-- 모든 필드 조회
SELECT * FROM 테이블;
 
-- 중복 제거 조회
SELECT DISTINCT 필드이름 FROM 테이블;
 
-- 조건식 적용
SELECT * FROM 테이블 WHERE 필드이름 = 0;
 
-- 여러 조건식
SELECT *
FROM 테이블
WHERE 필드이름1 = 0
  AND 필드이름2 = 0
  OR  필드이름3 = 0;

조건식의 종류

IN/BETWEEN/LIKE는 각각 OR나 >= <= 조합, 부분 문자열 비교를 더 짧고 읽기 쉽게 표현하기 위한 것이다. 특히 IS NULL/IS NOT NULL이 따로 있는 이유는 SQL에서 NULL은 “값이 없음”을 뜻해 =로 비교할 수 없기 때문이다(필드 = NULL은 항상 결과가 없음으로 평가된다).

WHERE 필드이름 BETWEEN 0 AND 100;
WHERE 필드이름 NOT BETWEEN 0 AND 100;
 
WHERE 필드이름 IN (0, 10, 100);
WHERE 필드이름 NOT IN (0, 10, 100);
 
WHERE 필드이름 IS NULL;
WHERE 필드이름 IS NOT NULL;
 
WHERE 필드이름 LIKE '홍__';      -- '_' : 한 글자 매칭
WHERE 필드이름 NOT LIKE '홍__';
WHERE 필드이름 LIKE '홍%';       -- '%' : 0글자 이상 매칭
WHERE 필드이름 NOT LIKE '홍%';

정렬 (ORDER BY)

DB는 저장된 순서를 보장하지 않으므로, 화면에 특정 순서(최신순, 이름순 등)로 보여줘야 한다면 반드시 ORDER BY를 명시해야 한다.

-- 특정 필드 기준 정렬
SELECT 필드이름 FROM 테이블 ORDER BY 필드이름;
 
-- 정렬 기준이 여러 개
SELECT 필드이름
FROM 테이블
ORDER BY 필드이름1, 필드이름2 DESC, 필드이름3 ASC;

JOIN

여러 테이블에 나뉘어 저장된 데이터를 한 번의 조회로 합쳐 보기 위해 쓴다. 내부 조인은 양쪽에 모두 값이 있는 행만 반환하고, 외부 조인은 한쪽 테이블에 대응 값이 없어도(NULL로 채워서) 결과에 포함시킨다 — 예를 들어 “주문이 없는 회원도 함께 보고 싶다”면 외부 조인이 필요하다.

-- 내부 조인
SELECT 테이블1.필드이름
FROM 테이블1, 테이블2
WHERE 테이블1.필드이름 = 테이블2.필드이름;
 
-- 별칭으로 간소화
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름;
 
-- 외부 조인 (Oracle (+) 문법)
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름(+);

NOTE

위 예시는 원문 그대로 암시적 조인(FROM A, B) 형태다. 실무에서는 JOIN ... ON 명시적 조인 사용을 권장한다.

집합 연산 (UNION)

두 쿼리 결과를 위아래로 합칠 때 쓴다. UNION은 중복을 제거하고 UNION ALL은 제거하지 않는데, 중복 제거는 내부적으로 정렬/비교 비용이 들기 때문에 중복이 없다는 걸 알고 있거나 굳이 제거할 필요가 없다면 UNION ALL이 더 빠르다.

SELECT 필드이름 FROM 테이블1
UNION            -- 또는 UNION ALL, MINUS, INTERSECT
SELECT 필드이름 FROM 테이블2;

서브쿼리

조회 조건 자체가 다른 조회 결과에 의존할 때(예: “평균보다 높은 값만 조회”) JOIN으로 표현하기 어렵거나 가독성이 떨어지는 경우에 쓴다. 서브쿼리 결과가 여러 행일 수 있으면 = 대신 IN/ANY/ALL/EXISTS를 써야 한다 — =는 값이 정확히 하나일 때만 쓸 수 있기 때문이다.

-- 서브쿼리 결과가 하나
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름 <= (
    SELECT 필드이름2
    FROM 테이블
    WHERE 조건문
);
 
-- 서브쿼리(중첩) 결과가 여러 개 (IN 외에 ANY, ALL, EXISTS 사용 가능)
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름2 IN (
    SELECT 필드이름2
    FROM 테이블
    WHERE 조건문
);

CRUD

UPDATE/DELETE는 WHERE 절을 빠뜨리면 테이블 전체가 대상이 되어버리므로(전체 행 수정/삭제), 조건절을 반드시 먼저 확인하는 습관이 중요하다.

-- CREATE
INSERT INTO 테이블 (필드이름1, 필드이름2)
VALUES (값1, 값2);
 
-- UPDATE
UPDATE 테이블
SET 필드이름1 = 값1, 필드이름2 = 값2
WHERE 조건문;
 
-- DELETE
DELETE FROM 테이블
WHERE 조건문;