SELECT
SELECT * FROM users; SELECT name, email FROM users; SELECT DISTINCT city FROM users; SELECT name AS full_name FROM users;
WHERE
비교 연산자
= <> (!=)같음 / 다름
< > <= >=비교 연산자
AND OR NOT논리 연산자
IS NULL / IS NOT NULLNull 확인
패턴 일치
SELECT * FROM users WHERE name LIKE 'A%'; -- % = 임의 문자, _ = 단일 문자 SELECT * FROM users WHERE age IN (20, 25, 30); SELECT * FROM users WHERE age BETWEEN 18 AND 30;
JOIN
조인 유형
INNER JOIN두 테이블 모두에서 일치하는 행
LEFT JOIN왼쪽 모든 행 + 일치하는 오른쪽
RIGHT JOIN오른쪽 모든 행 + 일치하는 왼쪽
FULL OUTER JOIN두 테이블의 모든 행
CROSS JOIN두 테이블의 카르테시안 곱
조인 문법
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; SELECT u.name, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id;
INSERT / UPDATE / DELETE
삽입
INSERT INTO users (name, email) VALUES ('Alice', '[email protected]'); INSERT INTO users (name, email) VALUES ('Bob', '[email protected]'), ('Carol', '[email protected]');
수정
UPDATE users SET email = '[email protected]' WHERE id = 1;
삭제
DELETE FROM users WHERE id = 1; DELETE FROM users; -- 모든 행 삭제
CREATE TABLE
문법
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, age INTEGER DEFAULT 0, score REAL );
일반 데이터 타입
INTEGER정수
REAL부동소수점 숫자
TEXT문자열 / 텍스트 데이터
BLOB이진 데이터
BOOLEANTRUE / FALSE (0/1로 저장)
DATE / DATETIME날짜 및 타임스탬프 값
제약 조건
PRIMARY KEY고유 행 식별자
NOT NULL값 필수
UNIQUE중복 값 없음
DEFAULT val생략 시 기본값
CHECK (expr)커스텀 유효성 검사 규칙
FOREIGN KEY다른 테이블 참조
집계 함수
COUNT(*)행 수
COUNT(col)열의 NULL이 아닌 값 수
SUM(col)숫자 열의 합계
AVG(col)숫자 열의 평균
MIN(col)최솟값
MAX(col)최댓값
예시
SELECT COUNT(*) AS total, AVG(age) AS avg_age, MAX(score) AS top_score FROM users;
GROUP BY / HAVING
SELECT city, COUNT(*) AS num_users FROM users GROUP BY city; SELECT city, AVG(age) AS avg_age FROM users GROUP BY city HAVING AVG(age) > 25;

WHERE는 그룹화 전 행을 필터링하고, HAVING은 집계 후 그룹을 필터링

ORDER BY / LIMIT
SELECT * FROM users ORDER BY name ASC; SELECT * FROM users ORDER BY age DESC; SELECT * FROM users ORDER BY city, name LIMIT 10 OFFSET 20; -- 20개 건너뛰고 10개 가져오기
서브쿼리
WHERE 절에서
SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders WHERE total > 100 );
파생 테이블로
SELECT city, avg_age FROM ( SELECT city, AVG(age) AS avg_age FROM users GROUP BY city ) WHERE avg_age > 30;
인덱스
CREATE INDEX idx_name ON users(name); CREATE UNIQUE INDEX idx_email ON users(email); DROP INDEX idx_name;
인덱스 사용 시점
WHERE의 열필터링 속도 향상
JOIN ON의 열조인 조회 속도 향상
ORDER BY의 열정렬 속도 향상
고카디널리티 열고유값이 많을수록 효과적