작성 순서 : S-F-W-G-H-O
SELECT (→ DISTINCT) → FROM (→ JOIN) → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
실행 순서 : F-W-G-H-S-O
FROM (→ JOIN) → WHERE → GROUP BY → HAVING → SELECT (→ DISTINCT) → ORDER BY → LIMIT
erDiagram
STUDENTS {
INT id PK
VARCHAR name
INT age
VARCHAR major
}
COURSES {
INT id PK
VARCHAR title
INT credits
}
ENROLLMENTS {
INT student_id FK
INT course_id FK
VARCHAR grade
}
STUDENTS ||--o{ ENROLLMENTS: enrolls
COURSES ||--o{ ENROLLMENTS: "is taken by"
SELECT 컬럼명 FROM 스키마;
-- 전체 컬럼 조회
SELECT *
FROM STUDENTS;
-- 특정 컬럼 조회
SELECT name, age
FROM STUDENTS ㅁㄴ ;
SELECT DISTINCT 컬럼명
FROM 스키마
LIMIT 페이징개수
-- 중복 없이 전공 목록만
SELECT DISTINCT major
FROM STUDENTS;
-- 상위 3명만
SELECT *
FROM STUDENTS
LIMIT 3;
SELECT *
FROM STUDENTS
WHERE age >= 20
AND age < 30;
SELECT *
FROM STUDENTS
WHERE major = 'AI'
OR major = 'Math';
SELECT *
FROM STUDENTS
WHERE name LIKE '김%';
SELECT *
FROM STUDENTS
WHERE major IN ('AI','CS','Math');
SELECT *
FROM STUDENTS
WHERE age BETWEEN 22 AND 25;
SELECT *
FROM STUDENTS
WHERE major IS NULL;
-- 나이 내림차순
SELECT *
FROM STUDENTS
ORDER BY age DESC;
-- 전공 오름차순, 나이는 내림차순
SELECT *
FROM STUDENTS
ORDER BY major ASC, age DESC;
-- 전체 학생 수
SELECT COUNT(*) AS total_students
FROM STUDENTS;
-- 전공별 학생 수, 평균 나이
SELECT major,
COUNT(*) AS cnt,
AVG(age) AS avg_age,
MIN(age) AS min_age,
MAX(age) AS max_age
FROM STUDENTS
GROUP BY major;
그룹화(GROUP BY) + 조건(HAVING)
-- 그룹화 후 조건 (전공별 2명 이상만)
SELECT major, COUNT(*) AS cnt
FROM STUDENTS
GROUP BY major
HAVING COUNT(*) >= 2;
SELECT name,
age,
CASE
WHEN age < 20 THEN '청년'
WHEN age < 30 THEN '청장년'
ELSE '중장년'
END AS age_group
FROM STUDENTS;

-- 수강 정보와 학생 정보 결합
SELECT S.name, C.title, E.grade
FROM ENROLLMENTS E
INNER JOIN STUDENTS S
ON E.student_id = S.id
INNER JOIN COURSES C
ON E.course_id = C.id;
-- 학생 정보는 모두, 수강 정보는 있을 때만
SELECT S.name, C.title
FROM STUDENTS S
LEFT JOIN ENROLLMENTS E
ON S.id = E.student_id
LEFT JOIN COURSES C
ON E.course_id = C.id;
-- 두 개의 SELECT 결과를 합치되, 중복 제거
SELECT name, major FROM STUDENTS WHERE age < 22
UNION
SELECT name, major FROM STUDENTS WHERE age > 24;
-- 중복도 모두 보고 싶으면 UNION ALL
SELECT name, major FROM STUDENTS WHERE age < 22
UNION ALL
SELECT name, major FROM STUDENTS WHERE age > 24;
-- 문자열 자르기
SELECT SUBSTR(name,1,2) AS name_prefix
FROM STUDENTS;
-- 소수점 반올림
SELECT ROUND(AVG(age), 1) AS avg_age_1decimal
FROM STUDENTS;
-- 날짜 더하기 (MySQL 예)
SELECT DATE_ADD('2025-06-10', INTERVAL 7 DAY) AS next_week;