SQL 치트시트
마지막 업데이트
데이터 조회 (SELECT)
SQL의 핵심: 하나 이상의 테이블에서 행을 읽습니다.
| 작업 | 문법 |
|---|---|
| 모든 컬럼 선택 | SELECT * FROM users; |
| 특정 컬럼 선택 | SELECT id, name FROM users; |
| 컬럼 이름 변경 (별칭) | SELECT name AS full_name FROM users; |
| 중복 제거 값 | SELECT DISTINCT country FROM users; |
| 행 개수 제한 | SELECT * FROM users LIMIT 10; |
| 건너뛴 후 제한 (페이징) | SELECT * FROM users LIMIT 10 OFFSET 20; |
| 행 개수 세기 | SELECT COUNT(*) FROM users; |
행 필터링 (WHERE)
쿼리가 반환하는 행을 좁힙니다.
| 작업 | 문법 |
|---|---|
| 같음 / 비교 | WHERE age >= 18 |
| 여러 조건 | WHERE age >= 18 AND country = 'US' |
| 둘 중 하나의 조건 | WHERE role = 'admin' OR role = 'owner' |
| 집합에 포함 | WHERE country IN ('US', 'CA', 'MX') |
| 범위 사이 | WHERE price BETWEEN 10 AND 50 |
| 패턴 일치 | WHERE email LIKE '%@gmail.com' |
| null 여부 / null 아님 | WHERE deleted_at IS NULL |
| 부정 | WHERE status NOT IN ('archived') |
정렬 및 그룹화
| 작업 | 문법 |
|---|---|
| 오름차순 정렬 (기본값) | ORDER BY created_at |
| 내림차순 정렬 | ORDER BY created_at DESC |
| 여러 컬럼으로 정렬 | ORDER BY country, name DESC |
| 행 그룹화 | SELECT country, COUNT(*) FROM users GROUP BY country; |
| 그룹 필터링 | GROUP BY country HAVING COUNT(*) > 100 |
조인
일치하는 컬럼을 기준으로 두 테이블의 행을 결합합니다.
| 조인 유형 | 반환 결과 | 문법 |
|---|---|---|
| INNER JOIN | 양쪽 테이블에서 일치하는 행만 | FROM orders o INNER JOIN users u ON o.user_id = u.id |
| LEFT JOIN | 왼쪽의 모든 행 + 일치 항목 (없으면 null) | FROM users u LEFT JOIN orders o ON o.user_id = u.id |
| RIGHT JOIN | 오른쪽의 모든 행 + 일치 항목 | FROM orders o RIGHT JOIN users u ON o.user_id = u.id |
| FULL OUTER JOIN | 양쪽의 모든 행 | FROM a FULL OUTER JOIN b ON a.id = b.a_id |
| CROSS JOIN | 모든 조합 (카티전 곱) | FROM sizes CROSS JOIN colors |
| 셀프 조인 | 테이블을 자기 자신과 조인 | FROM employees e JOIN employees m ON e.manager_id = m.id |
집계 함수
여러 행의 그룹에 걸쳐 단일 값을 계산합니다.
| 함수 | 기능 |
|---|---|
COUNT(*) | 행의 개수 |
COUNT(col) | null이 아닌 값의 개수 |
SUM(col) | 숫자 컬럼의 합계 |
AVG(col) | 평균값 |
MIN(col) / MAX(col) | 최솟값 / 최댓값 |
STRING_AGG(col, ',') | 값 연결 (Postgres; MySQL에서는 GROUP_CONCAT) |
윈도우 함수
행 집합 전체에 걸쳐 계산하되 하나로 합치지 않습니다.
| 함수 | 문법 |
|---|---|
| 행 번호 | ROW_NUMBER() OVER (ORDER BY score DESC) |
| 순위 (공백 포함) | RANK() OVER (PARTITION BY country ORDER BY score DESC) |
| 조밀 순위 | DENSE_RANK() OVER (ORDER BY score DESC) |
| 누적 합계 | SUM(amount) OVER (ORDER BY created_at) |
| 이전 / 다음 행 | LAG(score) OVER (ORDER BY date), LEAD(score) OVER (...) |
데이터 변경 (INSERT, UPDATE, DELETE)
| 작업 | 문법 |
|---|---|
| 행 삽입 | INSERT INTO users (name, email) VALUES ('Ada', 'ada@x.com'); |
| 여러 행 삽입 | INSERT INTO users (name) VALUES ('Ada'), ('Alan'); |
| 행 갱신 | UPDATE users SET active = true WHERE id = 1; |
| 행 삭제 | DELETE FROM users WHERE active = false; |
| 업서트 (Postgres/SQLite) | INSERT ... ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name; |
테이블 정의 (DDL)
| 작업 | 문법 |
|---|---|
| 테이블 생성 | CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL); |
| 컬럼 추가 | ALTER TABLE users ADD COLUMN age INTEGER; |
| 컬럼 삭제 | ALTER TABLE users DROP COLUMN age; |
| 테이블 삭제 | DROP TABLE users; |
| 인덱스 생성 | CREATE INDEX idx_users_email ON users (email); |
| 외래 키 | FOREIGN KEY (user_id) REFERENCES users (id) |
자주 쓰는 모든 SQL 문, 절, 조인을 한 페이지에 담았습니다. 이 SQL 치트시트는 관계형 데이터를 조회하고 변경하기 위한 빠른 참조 자료입니다 - SELECT 절, 네 가지 JOIN 유형, 집계, 그리고 테이블을 생성하고 갱신할 때 쓰는 DDL과 DML을 다룹니다.
여기 나오는 문법은 표준 ANSI SQL이며, 별도 표기가 없는 한 PostgreSQL, MySQL, SQLite, SQL Server에서 동작합니다. 필요한 것을 복사하거나, SQL 플레이그라운드에서 모든 쿼리를 바로 실행해 보세요 - 데이터베이스를 설치할 필요가 없습니다.
SQL 치트시트 자주 묻는 질문
이 SQL 치트시트는 무료인가요?
네. 이 SQL 치트시트는 완전히 무료이며 회원 가입이 필요 없습니다. 즐겨찾기에 추가해 두고 절, 조인, 함수를 찾아봐야 할 때마다 다시 방문하세요.
MySQL, PostgreSQL, SQLite에서 동작하나요?
SELECT, WHERE, JOIN, GROUP BY, DDL 문법은 표준 ANSI SQL이며 MySQL, PostgreSQL, SQLite, SQL Server에서 동일하게 동작합니다. 일부 고급 기능은 방언(dialect)에 따라 다른데 - 업서트와 문자열 집계가 대표적입니다 - 해당 행에 차이를 표기해 두었습니다.INNER JOIN과 LEFT JOIN의 차이는 무엇인가요?
INNER JOIN은 양쪽 테이블에 모두 일치하는 행만 반환합니다. LEFT JOIN은 왼쪽(첫 번째) 테이블의 모든 행을 반환하며, 일치하는 항목이 없을 때 오른쪽 테이블의 컬럼은 NULL로 채웁니다 - 일부 사용자가 주문이 없더라도 모든 사용자를 가져오고 싶을 때 유용합니다.이 SQL 명령어들을 온라인에서 연습할 수 있나요?
SELECT부터 조인과 윈도우 함수까지 단계별로 안내합니다.이 치트시트는 초보자에게 적합한가요?
네. 가장 흔한 작업(조회와 필터링)부터 고급 작업(윈도우 함수)까지 순서대로 정리되어 있어, 첫날부터 상단 섹션을 사용하고 점차 나머지로 넓혀갈 수 있습니다.