SELECT * FROM table | 모든 열 선택 |
SELECT col1, col2 FROM table | 특정 열 선택 |
SELECT DISTINCT col FROM table | 고유 값 선택 |
SELECT col AS alias FROM table | 열 별칭 |
SELECT * FROM table LIMIT 10 | 결과 제한 |
SELECT * FROM table OFFSET 5 | 행 건너뛰기 |
SELECT TOP 10 * FROM table | 상위 N개 행 (SQL Server) |
WHERE col = value | 같음 |
WHERE col <> value | 같지 않음 |
WHERE col > value | 보다 큼 |
WHERE col >= value | 크거나 같음 |
WHERE col < value | 보다 작음 |
WHERE col <= value | 작거나 같음 |
WHERE col BETWEEN a AND b | 범위 내 |
WHERE col IN (a, b, c) | 값 목록 내 |
WHERE col NOT IN (a, b, c) | 목록에 없음 |
WHERE col IS NULL | NULL임 |
WHERE col IS NOT NULL | NULL 아님 |
WHERE cond1 AND cond2 | 두 조건 모두 참 |
WHERE cond1 OR cond2 | 하나라도 참 |
WHERE NOT condition | 조건 부정 |
WHERE col LIKE 'a%' | a로 시작 |
WHERE col LIKE '%a' | a로 끝남 |
WHERE col LIKE '%word%' | word 포함 |
WHERE col LIKE '_a%' | 두 번째 문자가 a |
WHERE col LIKE '[abc]%' | a, b, c로 시작 |
WHERE col LIKE '[^abc]%' | a, b, c로 시작 안 함 |
WHERE col REGEXP 'pattern' | 정규식 (MySQL) |
ORDER BY col | 오름차순 정렬 (기본) |
ORDER BY col ASC | 오름차순 정렬 |
ORDER BY col DESC | 내림차순 정렬 |
ORDER BY col1, col2 | 여러 열로 정렬 |
ORDER BY col1 DESC, col2 ASC | 혼합 정렬 순서 |
ORDER BY FIELD(col, a, b, c) | 사용자 정의 정렬 (MySQL) |
GROUP BY col | 열로 그룹화 |
GROUP BY col1, col2 | 여러 열로 그룹화 |
HAVING COUNT(*) > 5 | 개수로 그룹 필터 |
HAVING SUM(col) > 100 | 합계로 그룹 필터 |
GROUP BY col WITH ROLLUP | 소계 포함 |
COUNT(*) | 모든 행 개수 |
COUNT(col) | NULL 아닌 값 개수 |
COUNT(DISTINCT col) | 고유 값 개수 |
SUM(col) | 값의 합계 |
AVG(col) | 값의 평균 |
MIN(col) | 최소값 |
MAX(col) | 최대값 |
GROUP_CONCAT(col) | 값 연결 (MySQL) |
STRING_AGG(col, ",") | 문자열 집계 (PostgreSQL) |
ROW_NUMBER() OVER (ORDER BY col) | 행 번호 |
RANK() OVER (ORDER BY col) | 순위 (간격 있음) |
DENSE_RANK() OVER (ORDER BY col) | 순위 (간격 없음) |
NTILE(4) OVER (ORDER BY col) | 4분위로 나누기 |
LAG(col, 1) OVER (ORDER BY date) | 이전 행 값 |
LEAD(col, 1) OVER (ORDER BY date) | 다음 행 값 |
FIRST_VALUE(col) OVER (PARTITION BY grp) | 파티션의 첫 값 |
LAST_VALUE(col) OVER (PARTITION BY grp) | 파티션의 마지막 값 |
SUM(col) OVER (PARTITION BY grp) | 파티션 내 합계 |
SUM(col) OVER (ORDER BY date ROWS UNBOUNDED PRECEDING) | 누적 합계 |
SELECT * FROM a INNER JOIN b ON a.id = b.a_id | 내부 조인 (일치 행) |
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id | 왼쪽 조인 (왼쪽 모두) |
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id | 오른쪽 조인 (오른쪽 모두) |
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id | 전체 외부 조인 (양쪽 모두) |
SELECT * FROM a CROSS JOIN b | 교차 조인 (카티션 곱) |
SELECT * FROM a, b WHERE a.id = b.a_id | 암시적 조인 (이전 문법) |
SELECT * FROM emp e1 JOIN emp e2 ON e1.mgr_id = e2.id | 셀프 조인 |
SELECT * FROM a WHERE id IN (SELECT a_id FROM b) | WHERE의 서브쿼리 |
SELECT *, (SELECT COUNT(*) FROM b) AS cnt FROM a | 스칼라 서브쿼리 |
SELECT * FROM (SELECT * FROM a WHERE x > 5) AS sub | 파생 테이블 |
WITH cte AS (SELECT * FROM a) SELECT * FROM cte | 공통 테이블 표현식 (CTE) |
WITH RECURSIVE cte AS (...) SELECT * FROM cte | 재귀 CTE |
SELECT * FROM a UNION SELECT * FROM b | 고유 행 결합 |
SELECT * FROM a UNION ALL SELECT * FROM b | 모든 행 결합 |
SELECT * FROM a INTERSECT SELECT * FROM b | 공통 행만 |
SELECT * FROM a EXCEPT SELECT * FROM b | a에만 있는 행 |
INSERT INTO table (col1, col2) VALUES (v1, v2) | 단일 행 삽입 |
INSERT INTO table VALUES (v1, v2, v3) | 모든 열 삽입 |
INSERT INTO table (cols) VALUES (v1), (v2), (v3) | 여러 행 삽입 |
INSERT INTO table (cols) SELECT cols FROM other | SELECT로 삽입 |
INSERT IGNORE INTO table (cols) VALUES (vals) | 중복 무시 (MySQL) |
INSERT INTO table (cols) VALUES (vals) ON DUPLICATE KEY UPDATE col = val | Upsert (MySQL) |
INSERT INTO table (cols) VALUES (vals) ON CONFLICT (col) DO UPDATE SET col = val | Upsert (PostgreSQL) |
UPDATE table SET col = value | 모든 행 업데이트 |
UPDATE table SET col = value WHERE condition | 특정 행 업데이트 |
UPDATE table SET col1 = v1, col2 = v2 WHERE cond | 여러 열 업데이트 |
UPDATE table SET col = col + 1 WHERE cond | 값 증가 |
UPDATE a SET a.col = b.val FROM a JOIN b ON a.id = b.a_id | 조인으로 업데이트 |
UPDATE table SET col = CASE WHEN cond THEN v1 ELSE v2 END | 조건부 업데이트 |
DELETE FROM table | 모든 행 삭제 |
DELETE FROM table WHERE condition | 특정 행 삭제 |
DELETE FROM a USING a JOIN b ON a.id = b.a_id | 조인으로 삭제 |
TRUNCATE TABLE table | 전체 삭제 (빠름, 로그 없음) |
DELETE TOP (100) FROM table | 제한된 행 삭제 (SQL Server) |
CREATE TABLE name (col1 TYPE, col2 TYPE) | 테이블 생성 |
CREATE TABLE name (id INT PRIMARY KEY) | 기본 키 포함 |
CREATE TABLE name (id INT AUTO_INCREMENT) | 자동 증가 (MySQL) |
CREATE TABLE name (id SERIAL) | 자동 증가 (PostgreSQL) |
CREATE TABLE name (col TYPE NOT NULL) | NOT NULL 제약 |
CREATE TABLE name (col TYPE DEFAULT value) | 기본값 |
CREATE TABLE name (col TYPE UNIQUE) | UNIQUE 제약 |
CREATE TABLE name (FOREIGN KEY (col) REFERENCES other(id)) | 외래 키 |
CREATE TABLE name (CHECK (col > 0)) | CHECK 제약 |
CREATE TABLE IF NOT EXISTS name (...) | 없으면 생성 |
CREATE TABLE new AS SELECT * FROM old | SELECT로 생성 |
ALTER TABLE t ADD col TYPE | 열 추가 |
ALTER TABLE t DROP COLUMN col | 열 삭제 |
ALTER TABLE t RENAME COLUMN old TO new | 열 이름 변경 |
ALTER TABLE t MODIFY col NEW_TYPE | 열 타입 변경 (MySQL) |
ALTER TABLE t ALTER COLUMN col TYPE NEW_TYPE | 열 타입 변경 (PostgreSQL) |
ALTER TABLE t ADD PRIMARY KEY (col) | 기본 키 추가 |
ALTER TABLE t ADD CONSTRAINT name UNIQUE (col) | UNIQUE 제약 추가 |
ALTER TABLE t DROP CONSTRAINT name | 제약 삭제 |
ALTER TABLE old RENAME TO new | 테이블 이름 변경 |
DROP TABLE table | 테이블 삭제 |
DROP TABLE IF EXISTS table | 있으면 삭제 |
DROP DATABASE db | 데이터베이스 삭제 |
CREATE DATABASE db | 데이터베이스 생성 |
CREATE SCHEMA schema | 스키마 생성 |
CREATE INDEX idx ON table (col) | 인덱스 생성 |
CREATE UNIQUE INDEX idx ON table (col) | 유니크 인덱스 생성 |
DROP INDEX idx | 인덱스 삭제 |
INT / INTEGER | 정수 (-20억 ~ 20억) |
BIGINT | 큰 정수 |
SMALLINT | 작은 정수 (-32K ~ 32K) |
TINYINT | 아주 작은 정수 (0 ~ 255) |
DECIMAL(p, s) / NUMERIC(p, s) | 정확한 소수 (정밀도, 스케일) |
FLOAT / REAL | 부동 소수점 |
DOUBLE | 배정밀도 |
BOOLEAN / BOOL | True/False |
CHAR(n) | 고정 길이 문자열 |
VARCHAR(n) | 가변 길이 문자열 |
TEXT | 긴 텍스트 |
DATE | 날짜 (YYYY-MM-DD) |
TIME | 시간 (HH:MM:SS) |
DATETIME / TIMESTAMP | 날짜와 시간 |
BLOB / BYTEA | 바이너리 데이터 |
JSON / JSONB | JSON 데이터 |
UUID | 범용 고유 식별자 |
CONCAT(s1, s2) | 문자열 연결 |
UPPER(str) / LOWER(str) | 대소문자 변환 |
LENGTH(str) / LEN(str) | 문자열 길이 |
TRIM(str) | 공백 제거 |
LTRIM(str) / RTRIM(str) | 왼쪽/오른쪽 공백 제거 |
SUBSTRING(str, start, len) | 부분 문자열 추출 |
REPLACE(str, old, new) | 부분 문자열 교체 |
LEFT(str, n) / RIGHT(str, n) | 왼쪽/오른쪽 문자 |
CHARINDEX(sub, str) | 위치 찾기 (SQL Server) |
POSITION(sub IN str) | 위치 찾기 (PostgreSQL) |
COALESCE(a, b, c) | 첫 번째 NULL 아닌 값 |
NULLIF(a, b) | a = b면 NULL 반환 |
NOW() / CURRENT_TIMESTAMP | 현재 날짜와 시간 |
CURRENT_DATE / CURDATE() | 현재 날짜 |
CURRENT_TIME / CURTIME() | 현재 시간 |
DATE_ADD(date, INTERVAL 1 DAY) | 날짜에 더하기 (MySQL) |
date + INTERVAL '1 day' | 날짜에 더하기 (PostgreSQL) |
DATEDIFF(d1, d2) | 일 수 차이 |
EXTRACT(YEAR FROM date) | 날짜 부분 추출 |
YEAR(date) / MONTH(date) / DAY(date) | 부분 추출 (MySQL) |
DATE_FORMAT(date, '%Y-%m-%d') | 날짜 포맷 (MySQL) |
TO_CHAR(date, 'YYYY-MM-DD') | 날짜 포맷 (PostgreSQL) |
CASE WHEN cond THEN val ELSE val END | Case 표현식 |
IF(cond, true_val, false_val) | If 함수 (MySQL) |
IIF(cond, true_val, false_val) | If 함수 (SQL Server) |
IFNULL(val, default) | NULL이면 기본값 (MySQL) |
ISNULL(val, default) | NULL이면 기본값 (SQL Server) |
NVL(val, default) | NULL이면 기본값 (Oracle) |
CAST(val AS type) | 타입 변환 |
CONVERT(type, val) | 타입 변환 (SQL Server) |
BEGIN / START TRANSACTION | 트랜잭션 시작 |
COMMIT | 변경사항 커밋 |
ROLLBACK | 변경사항 롤백 |
SAVEPOINT name | 세이브포인트 생성 |
ROLLBACK TO name | 세이브포인트로 롤백 |
SET TRANSACTION ISOLATION LEVEL ... | 격리 수준 설정 |
CREATE VIEW name AS SELECT ... | 뷰 생성 |
CREATE OR REPLACE VIEW name AS ... | 뷰 생성 또는 교체 |
DROP VIEW name | 뷰 삭제 |
CREATE PROCEDURE name() BEGIN ... END | 프로시저 생성 (MySQL) |
CREATE FUNCTION name() RETURNS type AS ... | 함수 생성 |
CALL procedure_name() | 프로시저 호출 |
EXEC procedure_name | 프로시저 실행 (SQL Server) |
GRANT SELECT ON table TO user | 권한 부여 |
GRANT ALL ON database.* TO user | 모든 권한 부여 |
REVOKE SELECT ON table FROM user | 권한 취소 |
CREATE USER 'user'@'host' IDENTIFIED BY 'pass' | 사용자 생성 (MySQL) |
CREATE USER user WITH PASSWORD pass | 사용자 생성 (PostgreSQL) |
DROP USER user | 사용자 삭제 |
-- 중복 찾기
SELECT col, COUNT(*) as cnt
FROM table GROUP BY col HAVING COUNT(*) > 1;
-- 윈도우 함수로 누적 합계
SELECT date, amount,
SUM(amount) OVER (ORDER BY date) as running_total
FROM transactions;
-- 피벗 테이블 (MySQL)
SELECT
category,
SUM(CASE WHEN year = 2023 THEN sales END) as '2023',
SUM(CASE WHEN year = 2024 THEN sales END) as '2024'
FROM data GROUP BY category;
-- 계층 구조를 위한 재귀 CTE
WITH RECURSIVE tree AS (
SELECT id, name, parent_id, 0 as level
FROM categories WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.name, c.parent_id, t.level + 1
FROM categories c JOIN tree t ON c.parent_id = t.id
)
SELECT * FROM tree;