본문 바로가기

[패스트캠퍼스] 데이터분석부트캠프/SQL

[3주차] SQL: 조건식, 함수 만들기

1. IF

: IF(조건, 참일 때 값, 거짓일 때 값)

: 조건이 하나일 때

: 주로 SELECT절에서 사용

 

2. CASE

: CASE

       WHEN 조건식1 THEN 결과값1

       WHEN 조건식2 THEN 결과값2

       ELSE 결과값3

  END [AS ALIAS]

 

: CASE 컬럼이름

       WHEN 조건값1 THEN 결과값1

       WHEN 조건값2 THEN 결과값2

       ELSE 결과값3

  END [AS ALIAS]

 

 

# 1 150보다 작으면 old, 크거나 같으면 new
SELECT name, 
	IF(number < 150, 'old', 'new') AS age
FROM mypokemon;

# 2 공격력 방어력 합이 100보다 작으면 weak, 크거나 같으면 strong
SELECT name, 
	IF(attack + defense < 100, 'weak', 'strong') AS ability
FROM mypokemon;

# 3 타입별 공격력의 평균이 60이상이면 True(1), 아니면 False(0)
SELECT name, 
	IF(AVG(attack) >= 60, 1, 0) AS is_strong_type
FROM mypokemon
GROUP BY type;

# 4 공격력이 100보다 크고 방어력도 100보다 크면 1, 둘 중 하나라도 100보다 작으면 0
SELECT name,
	IF(attack > 100 AND defense > 100, 1, 0) AS ace
FROM mypokemon;

# 5 번호가 100보다 작으면 <100, 200보다 작으면 <200, 500보다 작으면 <500
SELECT name,
	CASE
		WHEN number < 100 THEN '<100'
        WHEN number < 200 THEN '<200'
    	WHEN number < 500 THEN '<500'
	END AS nember_bin
FROM mypokemon;

# 6 number가 150보다 크면 new, 아니면 old / attack이 50보다 크면 strong, 아니면 weak -> 4개로 분류
SELECT name,
	CASE 
		WHEN (number >= 150) AND (attack >= 50) THEN 'new_strong'
        WHEN (number >= 150) AND (attack < 50) THEN 'new_weak'
        WHEN (number < 150) AND (attack >= 50) THEN 'old_strong'
        ELSE 'old_weak'
	END AS age_attack
FROM mypokemon;

# 7 타입 별 포켓몬 수가 1개면 solo, 3개 미만이면 minor, 3개 이상이면 major
SELECT name, 
	CASE 
		WHEN COUNT(1) = 1 THEN 'solo'
        WHEN COUNT(1) < 3 THEN 'minor'
        ELSE 'major'
	END AS count_by_type
FROM mypokemon
GROUP BY type;

 

 

 

 

3. 함수 만들기

** MySQL Workbench에서는 함수 생성 쿼리 실행 전에 함수 생성 권한 주는 쿼리 실행해줘야 함!

** 앞 뒤로 DELIMITER//, // DELIMITER ; 꼭 써주기, 끝에 DELIMITER와 ; 사이는 꼭 띄워주기

SET GLOBAL log_bin_trust_function_creators = 1; # 사용자 계정에 function create 권한 부여

 

함수 생성 문법

DELIMITER// # 함수의 시작 지정

CREATE FUNCTION 함수이름(입력값이름, 데이터타입, ...)
	RETURNS 결과값데이터타입
BEGIN 
	DECLARE 임시값이름 데이터타입
    SET 임시값이름 = 입력값이름
    쿼리;
    RETURN 결과값
END

//
DELIMITER ; # 함수의 끝 지정, 세미콜론이랑 꼭 한 칸 띄워줘야함!!!!!

ex)

DELIMITER //
CREATE FUNCTION isStrong (attack INT, defense INT)
	RETURNS VARCHAR(20)
BEGIN
	DECLARE a INT;
    DECLARE b INT;
    DECLARE total VARCHAR(20);
    SET a = attack;
    SET b = defense;
    SELECT 
		CASE
			WHEN a + b > 120 THEN 'very strong'
            WHEN a + b > 90 THEN 'strong'
            ELSE 'not strong'
            END INTO total;
	RETURN total;
END
//
DELIMITER ; # 함수의 끝 지정, 세미콜론이랑 꼭 한 칸 띄워줘야함!!!!! 


		
# 함수 확인용 쿼리    
SELECT name, isStrong(attack, defense) AS isStrong
FROM mypokemon;