SQL 기본 문법
SELECT부터 JOIN, 집계, 테이블 관리까지 핵심 문법 정리
데이터는 서버로 전송되지 않습니다 — 모든 처리는 브라우저 안에서만 서버 전송 0건
기본 조회 (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;열에 별칭을 붙입니다
조건·패턴
-
WHERE name LIKE '김%'김으로 시작하는 값을 찾습니다 ('%@gmail.com' 은 ~로 끝남)
-
WHERE status IN ('active', 'pending')나열한 값 중 하나와 일치하는 행을 찾습니다
-
WHERE price BETWEEN 1000 AND 5000범위(양 끝 포함)에 해당하는 행을 찾습니다
-
WHERE deleted_at IS NULLNULL 여부는 = 이 아닌 IS NULL / IS NOT NULL 로 비교합니다
-
SELECT COALESCE(nickname, name) FROM users;NULL이면 다음 값으로 대체합니다
-
CASE WHEN age >= 20 THEN '성인' ELSE '미성년' END조건에 따라 다른 값을 반환합니다
집계·그룹
-
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;평균을 소수 첫째 자리로 반올림합니다
조인 (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)서브쿼리에 행이 존재하는지로 필터링합니다
데이터 변경
※ 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가 많음
테이블·인덱스
-
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 기준으로 표기했습니다.