SQL 쿼리 함수 정복하자 !

eeeeu·2026년 1월 19일

데이타베이스

목록 보기
12/12

요즘 쿼리 문제를 한 개씩 풀면서 문법의 중요성을 깨닫고 있다 !
생각보다 많고 생각보다 헷갈리고,,
맨날 GPT 믿고있다가는 기본적인 것도 모르는 바보가 될 것 같아서 큰일이다.(벌써 진행 중인 것 같기도,,)

이게,,암튼 서론이였고요,,
그래서 제가 꼭 꼭 알고 있으면 좋은 쿼리 함수 요약본 적어왔습니다🫡

잠깐만요 문법 순서는 꼭 압시다.

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
  • BUT 실행 순서FROM → WHERE → GROUP BY → HAVING → SELECT → (DISTINCT) → ORDER BY → LIMIT
  • HAVING, SELECT 절에는 집계함수 사용 가능하지만 WHERE 절에 집계 함수 못 쓴다.
  • 집계함수와 일반 컬럼을 동시에 쓰기 위해서는 Group by / 서브쿼리 / 윈도우 함수 중 한개는 필요하다.
  • mysql에서 as는 띄어쓰기 혹은 “” 로 대체가능하다.
    • 테이블, 컬럼 별칭 모두 다 !!

CASE 사용법

-- 사용 예시
SELECT email
    , age
    , CASE WHEN age >= 40 THEN40대’
			WHEN age >= 30 THEN30대’
			WHEN age >= 20 THEN20대’
			ELSE NULL END AS age_group
FROM users

IF 사용법

-- 사용 예시 : 트레이너의 고향(hometown)이 서울(Seoul)인 경우 '수도권', 아니면 '타지역'으로 구분하여
-- hometown_status라는 별칭으로 출력하세요.
SELECT hometown
	, IF(hometown = 'Seoul', '수도권', '타지역') AS hometown_status
FROM trainer
;

null 처리함수

IFNULL(A,B) A가 NULL이면 B 반환, 그렇지 않으면 A 반환
NULLIF(A,B) A와 B가 같으면 NULL 반환, 다르면 A 반환
COALESCE(A, B) NULL을 특정 값으로 대체하거나, 가장 먼저 NULL이 아닌 값 반환

SELECT name, IFNULL(age, 0) AS age
FROM users;

형변환

CAST( 특정 컬럼 AS …타입)
타입설명
CHAR문자열 데이터로 변환
DECIMAL(A, B)수치형 데이터로 변환 (A : 총 자릿수, B : 고정 소수점 숫자)
SIGNED음수, 0, 양수를 모두 포함하는 정수로 변환
UNSIGNED0과 양수만 포함하는 정수로 변환
DATE날짜 형식으로 변환
DATETIME날짜와 시간 형식으로 변환
-- 사용 예시
SELECT CAST('2024-12-01' AS DATE); -> 2024-12-01
SELECT CAST(123 AS CHAR);  -> '123'

문자열 함수

함수설명
CONCAT(A,B,…)여러 문자열을 하나로 연결
SUBSTRING(데이터,시작위치,길이)데이터에서 지정된 위치부터 특정 길이만큼 문자열을 추출
LENGTH()문자열의 길이 반환
UPPER()대문자로 변환
LOWER()소문자로 변환
TRIM()데이터의 앞뒤 공백 제거
LTRIM()데이터의 왼쪽 공백 제거
RTRIM데이터의 오른쪽 공백 제거
LEFT(A,B)A에서 왼쪽 특정 문자열 B개 선택
RIGHT(A,B)A에서 오른쪽 특정 문자열 B개 선택
REPLACE(데이터,A,B)데이터에서 A를 B로 대체
-- 사용 예시
SELECT LEFT('HelloWorld', 3); --> 'Hel'

수학 함수

함수설명
ABS()절댓값
ROUND(A,B)A를 소수점 아래 B자리까지 반올림
TRUNCATE(A,B)A를 소수점 아래 B까지 남기고 그이후를 버림
CEIL()특정 숫자보다 큰 숫자 중 최소 정수
FLOOR()특정 숫자보다 작은 숫자 중 최대 정수
MOD(A,B)A를 B로 나눈 나머지/(산술 연산자) : 나누기
POWER(A,B)A의 B승
SQRT()제곱근

날짜/시간 함수

함수설명
YEAR/MONTH/DAY/DAYOFWEEK날짜에서 연도,월,일,요일 부분을 추출
HOUR/MINUTE/SECOND시간에서 시,분,초 부분을 추출
DATEDIFF두 날짜간의 일 수 차이를 계산
DATE_ADD날짜에서 지정된 기간을 더하기
DATE_SUB날짜에서 지정된 기간을 빼기
TIMEDIFF두 시간의 차이를 계산
DATE_FORMAT날짜를 지정된 형식의 문자열로 변환
STR_TO_DATE문자열을 지정된 형식의 날짜로 변환

집계함수

함수설명
COUNT()개수
SUM()합계
AVG()평균
MAX()최댓값
MIN()최솟값

윈도우 함수

테이블의 각 행에 대해 지정된 범위 내에서 집계,순위,누적 계산 등의 분석 작업 수행하는 함수
코딩테스트에 자주 나오므로 이해를 넘어서 꼭 사용하자 !

  • PARTITION BY : 그룹화할 컬럼 명시
  • ORDER BY : 그룹화된 데이터 내에서 정렬할 기준 컬럼 명시
-- 사용 예시
SELECT 컬럼
      , 윈도우 함수 OVER (PARTITION BY 컬럼 ORDER BY 컬럼) AS 별칭
FROM 테이블

윈도우 함수 종류

  • ROW_NUMBER : 각 행에 고유한 순번을 부여
  • RANK : 순위를 매기고 순위가 동일하면 동일 순위 부여하고 다음 순위는 건너뜀
  • DENSERANK : 순위를 매기고 순위가 동일하면 동일 순위 부여하고 순위 간의 간격이 없도록 설정
  • PERCENTRANK : 각 행의 순위를 백분율 형식으로 반환하여 0과 1 사이의 값으로 표시
  • NTILE : 지정된 수의 구간으로 나누고, 각 그룹에 대한 번호 반환
  • LAG/LEAD : 현재 행의 이전/다음 N번째 행의 값을 가져옴
  • SUM/AVG/COUNT : 그룹 내 합계/평균/개수 계산
  • MAX/MIN : 그룹 내 최댓값/최솟값 반환

연산자

집합 연산자

  • UNION (DISTINCT) : 중복 제거 후 행 레벨로 합치기
  • UNION ALL : 중복 제거하지 않고 행 레벨로 합치기

논리 연산자

AND가 OR 보다 우선 순위가 높다. 가독성을 위해 먼저 실행되는 조건을 괄호로 묶어서 표시하자

  • AND
  • OR
  • NOT

특수 연산자

BETWEEN A AND B  : A 이상 B 이하
IN (A,B,C) : A 또는 B 또는 C
LIKE
NOT LIKE
-- 사용예시
select *
from battle
where CAST(battle_date AS DATE) > '20241015';

select *
from battle
where CAST(battle_date AS DATE) > '2024-10-15';

select *
from battle
where CAST(battle_date AS DATE) > date('2024-10-15');

battle_date 이 text 타입으로 'YYYY-MM-DD' 이런식으로 저장되어 있으면 아래처럼만 비교가능
select *
from battle
where battle_date > '2024-10-15';

헷갈리는 부분

  • having 에 max() 조건절 사용시 유의할점

    /*
    Enter your query here.
    */
    
    1select salary*months, count(*)
    from employee
    group by salary*months
    order by salary*months desc
    limit 1
    
    2SELECT salary*months, COUNT(*)
    FROM employee
    GROUP BY salary*months
    HAVING salary*months = (
        SELECT MAX(salary*months) FROM employee
    );
    
    3select salary*months, count(*)
    from employee
    group by salary*months
    order by salary*months desc
    having max(salary*months)
    

    3번은 “가장 큰 salary*months 그룹 1개만 가져오기”에 해당하지 않는다.

profile
라따뚜이 인생이란

0개의 댓글