SELECT [DISTINCT] 컬럼명/함수
FROM 테이블명
WHERE 조건
GROUP BY 그룹기준
HAVING 그룹조건
ORDER BY 정렬기준 [ASC|DESC]
LIMIT [시작,] 개수;
| 문법 | 예시 | 설명 |
|---|---|---|
| = | WHERE AGE = 30 | 같을 때 |
| <>, != | WHERE AGE <> 30 | 같지 않을 때 |
| BETWEEN | WHERE AGE BETWEEN 20 AND 29 | 범위 포함 |
| IN | WHERE JOB IN ('CLERK', 'SALESMAN') | 여러 값 중 포함 |
| LIKE | WHERE NAME LIKE 'A%' | ‘A’로 시작 |
| LIKE | WHERE NAME LIKE '%B' | ‘B’로 끝 |
| IS NULL / IS NOT NULL | WHERE COMM IS NULL | NULL 여부 |
| AND, OR | WHERE AGE > 20 AND SALARY < 5000 | 복합 조건 |
SELECT DEPT, AVG(SALARY) AS AVG_SAL
FROM EMPLOYEES
GROUP BY DEPT
HAVING AVG(SALARY) >= 5000;
✅ HAVING은 그룹 함수 결과로 조건 걸 때만 사용합니다.
| 함수 | 설명 | 예시 | 결과 |
|---|---|---|---|
| CONCAT(a, b) | 문자열 연결 | 'A', 'B' | 'AB' |
| SUBSTRING(str, pos, len) | 부분 문자열 | 'HELLO', 2, 3 | 'ELL' |
| LEFT(str, n) / RIGHT(str, n) | 왼쪽/오른쪽 문자 | 'HELLO', 2 | 'HE', 'LO' |
| LENGTH(str) | 바이트 길이 | 'ABC' | 3 |
| UPPER() / LOWER() | 대소문자 변환 | 'abc' | 'ABC' |
| REPLACE(str, from, to) | 문자열 치환 | 'A-B', '-', '' | 'AB' |
| YEAR(date), MONTH(date), DAY(date) | 연/월/일 추출 | WHERE YEAR(START_DATE) = 2024 |
DATE_FORMAT(변환할 날짜, 형식)
날짜 예시 : 2025년 9월 2일 화요일 오후 14시 30분 00초
| 포맷 문자 | 설명 | 예시 |
|---|---|---|
| %Y | 연 (4자리) | 2025 |
| %y | 연 (2자리) | 25 |
| %m | 월 (2자리) | 09 |
| %c | 월 (1자리) | 9 |
| %M | 월 (영문 전체) | January, August |
| %b | 월 (영문 약어) | Jan, Aug |
| %d | 일 (2자리) | 02 |
| %e | 일 (1자리) | 2 |
| %D | 일 (서수) | 2nd |
| %T | 시 (숫자만) | 14:30:00 |
| %r | 시 (숫자 + 오전/오후) | 14:30:00 PM |
| %H | 시 (24시간 형식) | 14 |
| %h | 시 (12시간 형식, 2자리) | 02 |
| %k | 시 (24시간 형식, 1자리) | 14 |
| %l | 시 (12시간 형식, 1자리) | 02 |
| %i | 분 (2자리) | 30 |
| %S, %s | 초 (2자리) | 00 |
| %W | 요일 (영문 전체) | Tuesday |
| %a | 요일 (영문 약어) | Tue |
| 유형 | 문법 | 설명 |
|---|---|---|
| INNER JOIN | A INNER JOIN B ON A.id = B.id | 공통된 행만 |
| LEFT JOIN | A LEFT JOIN B ON ... | A의 모든 행 + 일치하는 B |
| RIGHT JOIN | A RIGHT JOIN B ON ... | B의 모든 행 + 일치하는 A |
SELECT A.ID, A.NAME, B.CITY
FROM CUSTOMER A
JOIN ADDRESS B ON A.ADDRESS_ID = B.ID;
SELECT A.컬럼
FROM 테이블A AS A
LEFT JOIN 테이블B AS B
ON A.컬럼 = B.컬럼
WHERE B.컬럼 IS NULL;
inner join
SELECT A.컬럼
FROM 테이블A AS A
UNION
SELECT B.컬럼
FROM 테이블B AS B;
SELECT A.컬럼, B.컬럼
FROM 테이블A AS A, 테이블B AS B;
SELECT NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (
SELECT AVG(SALARY)
FROM EMPLOYEES
);
여러 개의 비교값 중에서 하나라도 만족하면 참
전체 비교값을 모두 만족해야 참
ex) 다른 테이블에 없는 데이터 찾기
SELECT 컬럼
FROM 테이블A AS A
WHERE NOT EXISTS (
SELECT 1
FROM 테이블B AS B
WHERE A.컬럼 = B.컬럼
);
테이블A의 데이터 중에서, 테이블B에 그 데이터가 존재하지 않으면 선택
SELECT NAME,
CASE
WHEN SCORE >= 90 THEN 'A'
WHEN SCORE >= 80 THEN 'B'
ELSE 'C'
END AS GRADE
FROM STUDENTS;
IF(조건, 참값, 거짓값)SELECT IF(SALARY > 5000, 'HIGH', 'LOW') AS SAL_LEVEL
FROM EMPLOYEES;
SELECT DISTINCT CITY FROM USERS;
SELECT IFNULL(COMM, 0) AS COMM_REPLACED
FROM EMPLOYEES;
| 함수 | 설명 | 예시 | 결과 |
|---|---|---|---|
| ROUND(x, d) | x를 소수점 d자리까지 남기고 반올림 | ROUND(123.456, 1) | 123.5 |
| TRUNCATE(x, d) | x를 소수점 d자리까지 남기고 버림 | TRUNCATE(123.456, 1) | 123.4 |
| CEIL(x * 10^d) / 10^d) | x를 소수점 d자리까지 남기고 올림 | CEIL(123.451 * 100) / 100 | 123.46 |
| FLOOR(x) | 내림 | FLOOR(3.9) | 3 |
| CEIL(x) | 올림 | CEIL(3.1) | 4 |
| MOD(x, y) | 나머지 | MOD(10, 3) | 1 |
SELECT ROUND(AVG(PRICE), 2), TRUNCATE(AVG(PRICE), 2)
FROM PRODUCTS
정렬 결과 11번째부터 상위 5개 출력
SELECT *
FROM PRODUCTS
ORDER BY PRICE DESC, NAME ASC
LIMIT 5 OFFSET 10; --