데이터로그😎

조건문 본문

SQL/MySQL

조건문

지연v'_'v 2023. 9. 5. 21:09

IF문

IF(조건, 참 expr, 거짓 expr) → where에 의해 걸러짐

# 도시 인구가 100만이 넘으면 'Big City'. 안 넘으면 'Small City'
SELECT name, Population, 
IF (Population >= 1000000,'Big City','Small City')
FROM city;


# 도시의 인구가 100만이 넘으면 'Big City', 50만이 넘으면 'Medium City', 안넘으면 'Small City'
SELECT name, Population,
	IF (Population >=1000000,'Big City', 
        IF(Population >=500000, 'Medium City','Small City'))
FROM city;

 

NULL

*IFNULL(컬럼, null인 경우 채울 값)

# NULL: 데이터가 없음을 의미
SELECT *
FROM country
WHERE IndepYear IS NULL;

SELECT *
FROM country
WHERE IndepYear IS NOT NULL;

# NULL값을 처리 -> NULL 값 대신에 다른 값으로 채우겠다.
# IFNULL (컬럼명, 채울값)
SELECT IndepYear, IFNULL(IndepYear, 0), Name
FROM country;

 

 

처음 '나라 별로 인구가 10억 이상, 1억이상, 1억 이하인 컬럼을 추가하여 표현해라' 라는 문제를 보았을 때는 위에 했던 것 처럼 IF문을 쓰고 group by 를 하면 되겠지 라고 생각했다. 그러나 이게 왠걸. 되지 않는다. 오류가 뜬다!

조건문 + 집계까지 하고 싶다면 CASE WHEN 을 써야 한다.

 

<틀린 예시>

# 나라 별로 인구가 10억 이상, 1억 이상, 1억 이하인 컬럼을 추가하여 표현
SELECT name, population, 
		if (population >=1000000000, '10억 이상', if(population>=100000000, '1억 이상', '1억 이하')) as amount
FROM country
GROUP BY amount;

 

CASE

CASE WHEN THEN END

-- CASE  
--     WHEN (조건1) THEN 출력1,
--      WHEN (조건2) THEN 출력2,
-- END


# 나라 별로 인구가 10억 이상, 1억 이상, 1억 이하인 컬럼을 추가하여 표현
SELECT name, Population, 
CASE WHEN Population >= 1000000000 THEN '10억 이상'
    	WHEN Population >= 100000000 THEN '1억 이상'
            WHEN Population < 100000000 THEN '1억 미만'
	END AS 'Result'
FROM country;


# groupby
SELECT  AVG(Population) as avg_pop,
CASE WHEN Population >= 1000000000 THEN '10억 이상'
     	WHEN Population >= 100000000 THEN '1억 이상'
            WHEN Population < 100000000 THEN '1억 미만'
		END AS 'Result'
FROM country
GROUP BY result;


# DATE_FORMAT (날짜 데이터, 포맷팅)
# 날짜: (년-월-일 시:분:초)
use sakila;

SELECT amount, DATE_FORMAT(payment_date, '%Y-%m') as 'monthly'
FROM payment;


SELECT SUM(amount), DATE_FORMAT(payment_date, '%Y-%m') as 'monthly'
FROM payment
GROUP BY monthly;

FYI) https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html  데이트 포맷 함수

 

MySQL :: MySQL 5.7 Reference Manual :: 12.7 Date and Time Functions

12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

dev.mysql.com

 

 

그룹바이와 셀렉트의 관계

SELECT  AVG(Population) as avg_pop,
CASE WHEN Population >= 1000000000 THEN '10억 이상'
     	WHEN Population >= 100000000 THEN '1억 이상'
            WHEN Population < 100000000 THEN '1억 미만'
		END AS 'Result'
FROM country
GROUP BY result;

그룹바이를 하는 기준 : 절대적

그룹바이 절은 굉장히 단순해야 한다. 추가적으로 정도 가져오려면 조인, 셀프조인 이런걸 해야한다.

카테고리가 될 수 없는 컬럼은 절대 그룹바이에 들어가면 안된다 (그룹 지어질 수 없는 컬럼).

'SQL > MySQL' 카테고리의 다른 글

서브 쿼리  (0) 2023.09.06
ERD 표기법  (0) 2023.09.06
python - mysql 연결  (0) 2023.09.06
JOIN  (1) 2023.09.05
Basic Query  (0) 2023.09.05