[MySQL] 코테용 문법 정리

xyzw·2025년 10월 30일
0

database

목록 보기
11/11

SELECT

SELECT [DISTINCT] 컬럼명/함수
FROM 테이블명
WHERE 조건
GROUP BY 그룹기준
HAVING 그룹조건
ORDER BY 정렬기준 [ASC|DESC]
LIMIT [시작,] 개수;
  • 실행 순서
    FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

조건문

문법예시설명
=WHERE AGE = 30같을 때
<>, !=WHERE AGE <> 30같지 않을 때
BETWEENWHERE AGE BETWEEN 20 AND 29범위 포함
INWHERE JOB IN ('CLERK', 'SALESMAN')여러 값 중 포함
LIKEWHERE NAME LIKE 'A%'‘A’로 시작
LIKEWHERE NAME LIKE '%B'‘B’로 끝
IS NULL / IS NOT NULLWHERE COMM IS NULLNULL 여부
AND, ORWHERE AGE > 20 AND SALARY < 5000복합 조건

집계 함수

  • COUNT(*): 행 개수
  • SUM(컬럼): 합계
  • AVG(컬럼): 평균
  • MAX(컬럼): 최댓값
  • MIN(컬럼): 최솟값

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

JOIN

유형문법설명
INNER JOINA INNER JOIN B ON A.id = B.id공통된 행만
LEFT JOINA LEFT JOIN B ON ...A의 모든 행 + 일치하는 B
RIGHT JOINA 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;

곱집합 (Cartesian Product)

SELECT A.컬럼, B.컬럼
FROM 테이블A AS A, 테이블B AS B;

서브쿼리

SELECT NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (
  SELECT AVG(SALARY)
  FROM EMPLOYEES
);
  • IN, ANY, ALL, EXISTS 연산자와 함께 자주 등장

ANY

여러 개의 비교값 중에서 하나라도 만족하면 참

ALL

전체 비교값을 모두 만족해야 참

EXISTS

  • EXISTS: 서브쿼리의 결과가 존재하는 행 선택
  • NOT EXISTS: 서브쿼리의 결과가 존재하지 않는 행 선택

ex) 다른 테이블에 없는 데이터 찾기

SELECT 컬럼
FROM 테이블A AS A
WHERE NOT EXISTS (
    SELECT 1
    FROM 테이블B AS B
    WHERE A.컬럼 = B.컬럼
);

테이블A의 데이터 중에서, 테이블B에 그 데이터가 존재하지 않으면 선택

CASE문 / IF문

  • CASE문
SELECT NAME,
       CASE
         WHEN SCORE >= 90 THEN 'A'
         WHEN SCORE >= 80 THEN 'B'
         ELSE 'C'
       END AS GRADE
FROM STUDENTS;
  • IF문
    IF(조건, 참값, 거짓값)
SELECT IF(SALARY > 5000, 'HIGH', 'LOW') AS SAL_LEVEL
FROM EMPLOYEES;

DISTINCT & NULL 처리

  • 중복 제거: DISTINCT
SELECT DISTINCT CITY FROM USERS;
  • NULL을 0으로 대체
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) / 100123.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 

ORDER BY & LIMIT

정렬 결과 11번째부터 상위 5개 출력

SELECT *
FROM PRODUCTS
ORDER BY PRICE DESC, NAME ASC
LIMIT 5 OFFSET 10; -- 

0개의 댓글