본문 바로가기

공부일지 #15 | MySQL 폭풍 정리: 함수·연산자·CASE부터 GROUP BY까지

@studying:)2025. 8. 3. 13:19

학습 날짜: 2025.08.01


이날은 정말 폭풍처럼 진도가 나갔다. MySQL의 기본 함수부터 연산자, WHERE 절과 GROUP BY 절까지 학습하고, 중간에는 실습 문제까지 풀어보는 빡센 하루였다.
배운 내용이 많은 만큼, 직접 실습하며 코드에 주석으로 필기했던 부분을 그대로 코드 블럭에 정리해두었고, 함께 학습한 개념들도 간단히 요약하는 방식으로 정리해두었다.

 

날짜 함수

날짜 함수에는 연(year), 달(month), 일(day) 등을 더할 수 있는 DATE_ADD() 함수와 두 날짜의 차이를 계산하는 TIMESTAMPDIFF(), DATEDIFF() 함수가 있다.

-- DATEADD | MySQL: date_add(date, INTERVAL value unit)
select order_date, 
date_add(order_date, INTERVAL -1 year) as 함수적용결과1 ,
date_add(order_date, INTERVAL +2 day) as 함수적용결과2
from sales; 

-- DATEDIFF | MySQL: TIMESTAMPDIFF((연,월,일,시,분,초), 비교날짜, 기준날짜)
select order_date,
TIMESTAMPDIFF(Month, order_date, '2023-04-01') as 함수적용결과1,
TIMESTAMPDIFF(Day, order_date, '2023-04-01') as 함수적용결과2,
TIMESTAMPDIFF(Month, '2023-04-01', order_date) as 함수적용결과3,
TIMESTAMPDIFF(Day, '2023-04-01', order_date) as 함수적용결과4
from sales;

-- DATEDIFF(기준날짜, 비교날짜) -> 일만 지원 지원, 기준 - 비교
SELECT order_date,
       DATEDIFF('2023-04-01', order_date) as 함수적용결과1
FROM sales;

 

순위 함수

순위 함수는 3종류가 있다. 그 중 rank를 많이 사용한다고 한다.

  • RANK() : 동점은 같은 순위이고 다음 순위는 건너뜀. ex) 1등, 1등, 3등, 4등
  • DENSE_RANK(): 동점은 같은 순위이고 다음 순위는 바로 다음 숫자임. ex) 1등, 1등, 2등, 3등
  • ROW_NUMBER(): 정렬 순서대로 번호 부여, 동점 없음. ex) 1등, 2등, 3등, 4등
-- rank(), dense_rank(), row_number()
select student, score,
rank() over (order by score DESC) as rank등수,
dense_rank() over (order by score DESC) as dense_rank등수,
row_number() over (order by score DESC) as row_number등수
from student_math_score;

-- rank/dense_rank/row_number() OVER ([PARTITION BY 그룹별 컬럼] ORDER BY 순위 기준 컬럼)
-- DESC: 내림차순, ASC: 오름차순
select *,
rank() over (order by score DESC) as 전교등수,
rank() over (partition by class order by score DESC) as 반등수
from student_math_score;

 

CASE 문

파이썬의 if-else문과 같다. 처음 시작할 때는 CASE WHEN(조건문) THEN(반환값) 형태로 쓰고, 두 번째 조건부터는 WHEN(조건문) THEN(반환값)만 적는다.
모든 조건에 해당하지 않을 때는 ELSE를 사용한다.
마지막엔 꼭! END로 닫아준다.

select sales_amount,
Case when sales_amount < 0 then '환불거래'
	 when sales_amount > 0 then '정상거래' end as 적용결과
from sales;

 

WHERE 절

이 파이썬의 if문과 같다. CASE문과의 차이점은, WHERE 절은 파이썬의 if (조건문)까지만 해당된다고 생각하면 이해하기 쉽다.
즉, 조건을 만족하는 행만 걸러주는 역할을 하고, 값을 반환하지는 않는다.

select *
from customer2
where gender = 'M';

 

WHRER절과 함께 쓰는 연산자 종류

WHERE 절에서는 조건을 걸기 위해 비교, 논리, 부정 연산자를 사용한다.

 

비교 연산자

비교 연산자는 말 그대로 비교하기 위해 사용한다.

대표적으로는 우리가 자주 쓰는 =(같다), <> 또는 !=(같지 않다), >(초과), <(미만), >=(이상), <=(이하), BETWEEN A AND B(A이상 B이하) 가 있다.
그 외에도 값을 조건에 따라 비교하는 IN, LIKE, IS NULL도 WHERE 절에서 함께 사용된다.

-- =, <>, !=, >, <= ...
select * from sales where sales_amount = 40000;

select *
	from sales
    where product_name = '신발';
    
select *
	from sales
    where order_date >= '2023-02-10'; -- 날짜도 가능
    
select *
	from sales
    where sales_amount between 30000 and 40000; -- 수치형(연속형) 데이터에서만 사용
   
-- IN: 일치하는 내용이 있는가
select *
	from sales
    where product_name in ('신발', '카디건'); 
    
-- LIKE: 키워드를 포함하는가
select *
	from distribution_center
	where address like '서울시%'; 

select *
	from distribution_center
	where address like '%이천시%'; -- % == * 같은 기능

-- IS NULL
select *
	from distribution_center
    where facility_equipment IS NULL;

 

논리 연산자

조건을 결합할 때는 논리 연산자 AND, OR을 사용한다. 

2개 이상의 논리 연산자를 함께 사용할 경우, 우선순위에 주의해야 한다.
SQL에서는 AND가 OR보다 우선순위가 높기 때문에, 의도한 조건이 제대로 적용되지 않을 수 있다.
이를 방지하려면 괄호를 사용해 명확하게 조건을 묶는 것이 좋다.

select *
from distribution_center
where permission_date > '2022-05-01' and permission_date < '2022-07-31';
    
select *
from distribution_center
where address like '경기도 용인시%'
	or address like '서울시%';
    
select *
from distribution_center
where facility_equipment = '지게차'
    or facility_equipment = '화물자동차'; -- = facility_equipment in ('지게차', '화물자동차')
    
select *
from distribution_center
where address like '경기도 용인시%'
or address like '서울시%' 
and status = '영업중'; -- A or (B and C)가 됨, and 가 더 높은 우선순위를 갖기 때문.

select *
from distribution_center
where (address like '경기도 용인시%'
or address like '서울시%' )
and status = '영업중'; -- (A or B) and C

 

부정 연산자

지정된 목록에 포함되지 않는 값을 찾고 싶을 때 사용한다.

select * 
from distribution_center
where center_no Not in (1,2);

 

GROUP BY절

그룹별로 통계량을 보기 위해 사용한다. 

통계량을 구하기 위해 집계 함수와 함께 써야 의미가 있다.

select sale_date, product_name, sum(quantity) as 수량, sum(price) as 금액
from sales2
group by sale_date, product_name; -- 2개 이상의 컬럼도 지정 가능.

 

집계 함수

통계량을 구하는 함수로 COUNT(개수), SUM(합계), AVG(평균), MAX(최대값), MIN(최소값) 등이 있다.

select 
count(customer_id) as 함수적용결과1,
count(distinct customer_id) as 함수적용결과2, -- distinct: 중복제거
count(first_order_date) as 함수적용결과3, -- not null 값의 행 개수
count(*) as 함수적용결과4 -- 모든 행 개수
from customer_ch5;

select city, sum(sales_amount) as 매출
from sales_ch5
group by city;

select customer_id, sum(sales_amount) as 매출
from sales_ch5
group by customer_id;

 

HAVING 절

GROUP BY와 함께 사용되며, 그룹화된 결과를 필터링할 때 사용된다.
R의 %>% filter()와 비슷하게, 요약된 데이터에 조건을 거는 용도로 보면 이해가 쉽다.

 

WHERE 절과 마찬가지로 조건을 걸어 데이터를 거르지만, WHERE은 그룹화 전에 개별 행을 필터링하고,
HAVING은 그룹화 후 집계된 결과를 필터링한다는 점에서 차이가 있다.

select customer_id, 
	sum(sales_amount) as 매출
from sales_ch5
group by customer_id
having sum(sales_amount) > 20000;

 

studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차