ToolStack
EN

SQL 기본 문법

SELECT부터 JOIN, 집계, 테이블 관리까지 핵심 문법 정리

데이터는 서버로 전송되지 않습니다 — 모든 처리는 브라우저 안에서만 서버 전송 0건

01

기본 조회 (SELECT)

  • SELECT * FROM users;

    테이블의 모든 열을 조회합니다 (실무에서는 필요한 열만 권장)

  • SELECT name, email FROM users;

    지정한 열만 조회합니다

  • SELECT * FROM users WHERE age >= 20;

    조건에 맞는 행만 조회합니다 (AND/OR/NOT 조합)

  • SELECT * FROM users ORDER BY created_at DESC;

    정렬해서 조회합니다 (ASC 오름차순 / DESC 내림차순)

  • SELECT * FROM users LIMIT 10;

    10건만 조회합니다 (MySQL·PostgreSQL, SQL Server는 TOP 10)

  • SELECT DISTINCT city FROM users;

    중복을 제거하고 조회합니다

  • SELECT name AS 이름 FROM users;

    열에 별칭을 붙입니다

02

조건·패턴

  • WHERE name LIKE '김%'

    김으로 시작하는 값을 찾습니다 ('%@gmail.com' 은 ~로 끝남)

  • WHERE status IN ('active', 'pending')

    나열한 값 중 하나와 일치하는 행을 찾습니다

  • WHERE price BETWEEN 1000 AND 5000

    범위(양 끝 포함)에 해당하는 행을 찾습니다

  • WHERE deleted_at IS NULL

    NULL 여부는 = 이 아닌 IS NULL / IS NOT NULL 로 비교합니다

  • SELECT COALESCE(nickname, name) FROM users;

    NULL이면 다음 값으로 대체합니다

  • CASE WHEN age >= 20 THEN '성인' ELSE '미성년' END

    조건에 따라 다른 값을 반환합니다

03

집계·그룹

  • SELECT COUNT(*) FROM orders;

    행 수를 셉니다 (COUNT(col) 은 NULL 제외)

  • SELECT SUM(amount), AVG(amount) FROM orders;

    합계·평균을 구합니다 (MIN/MAX 도 동일)

  • SELECT dept, COUNT(*) FROM emp GROUP BY dept;

    그룹별로 집계합니다

  • GROUP BY dept HAVING COUNT(*) > 5;

    집계 결과에 조건을 겁니다 (WHERE는 집계 전, HAVING은 집계 후)

  • SELECT ROUND(AVG(score), 1) FROM exams;

    평균을 소수 첫째 자리로 반올림합니다

04

조인 (JOIN)

  • SELECT * FROM a INNER JOIN b ON a.id = b.a_id;

    양쪽 모두 일치하는 행만 결합합니다

  • SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;

    왼쪽(a)은 전부 남기고 일치하는 b를 붙입니다 (없으면 NULL)

  • SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;

    오른쪽(b)을 전부 남기는 조인입니다

  • SELECT name FROM a UNION SELECT name FROM b;

    두 결과를 합칩니다 (UNION ALL 은 중복 유지·더 빠름)

  • WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id)

    서브쿼리에 행이 존재하는지로 필터링합니다

05

데이터 변경

※ UPDATE·DELETE 는 WHERE 없이 실행하면 전체 행에 적용됩니다. 실행 전 같은 조건으로 SELECT 해서 대상을 확인하세요.

  • INSERT INTO users (name, email) VALUES ('김철수', 'kim@a.com');

    행을 추가합니다

  • INSERT INTO users (name) VALUES ('a'), ('b'), ('c');

    여러 행을 한 번에 추가합니다

  • UPDATE users SET status = 'active' WHERE id = 3;

    조건에 맞는 행의 값을 수정합니다

  • DELETE FROM users WHERE id = 3;

    조건에 맞는 행을 삭제합니다

  • TRUNCATE TABLE logs;

    테이블의 모든 행을 빠르게 비웁니다 ※ 롤백 불가인 DB가 많음

06

테이블·인덱스

  • CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50) NOT NULL);

    테이블을 만듭니다

  • ALTER TABLE users ADD COLUMN age INT;

    열을 추가합니다

  • ALTER TABLE users DROP COLUMN age;

    열을 삭제합니다

  • DROP TABLE users;

    테이블을 구조까지 삭제합니다 ※ 주의

  • CREATE INDEX idx_users_email ON users(email);

    조회 성능을 위해 인덱스를 만듭니다

  • ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);

    외래 키 제약을 추가합니다

SQL 기본 문법, 실행 순서로 이해하세요

SQL은 FROM(어느 테이블에서) → WHERE(어떤 행을) → GROUP BY(어떻게 묶어) → HAVING(묶은 결과 중) → SELECT(무엇을) → ORDER BY(어떤 순서로) 순서로 처리됩니다. 작성 순서와 실행 순서가 다르다는 점만 이해해도 집계 쿼리의 에러 대부분이 설명됩니다.

이 페이지는 조회·조건·집계·조인·데이터 변경·테이블 관리 순서로 자주 쓰는 문법을 예시와 함께 정리했습니다. 조인은 INNER(교집합)와 LEFT(왼쪽 기준)를 확실히 구분하는 것이 출발점이고, 성능이 느린 조회는 WHERE·JOIN 열에 인덱스가 있는지부터 확인하세요.

※ UPDATE·DELETE 는 WHERE 없이 실행하면 전체 행에 적용됩니다. 먼저 같은 조건의 SELECT로 대상을 확인하는 습관을 권장합니다.

자주 묻는 질문

WHERE와 HAVING은 뭐가 다른가요?
WHERE는 그룹화(집계) 전에 행을 거르고, HAVING은 GROUP BY로 집계한 결과에 조건을 겁니다. COUNT나 SUM 결과로 필터링하려면 HAVING을 써야 합니다.
LEFT JOIN 결과에 NULL이 나오는 이유는?
LEFT JOIN은 왼쪽 테이블의 모든 행을 남기기 때문에, 오른쪽에 일치하는 행이 없으면 그 자리의 열이 NULL로 채워집니다. 일치하는 것만 보려면 INNER JOIN을 사용하세요.
DB마다 문법이 조금씩 다른가요?
핵심 문법(SELECT, JOIN, GROUP BY)은 표준이라 거의 같지만, LIMIT/TOP, 문자열 연결, 날짜 함수 등은 MySQL·PostgreSQL·SQL Server·Oracle별로 다릅니다. 이 페이지는 MySQL·PostgreSQL 기준으로 표기했습니다.

관련 툴