Day 07. 규칙 만들기
1. 조건 만들기
조건만들기
“구매 금액 10억 이상 고객은 VVIP로 1억 이상이면 VIP로 고객 등급 뽑아주세요”
“상품 매출이 1억 이상이면 o로 미만이면 x로 데이터 뽑아주세요”
조건을 만들때 사용하는 함수
IF
IF 특징
- IF(조건식, 참일때 값, 거짓일때 값) 형식으로 사용.
- 주로 SELECT절에 사용하는 함수로, 결과값을 새로운컬럼으로 반환.
IF 사용예제
SELECT name, IF(attack >= 60, ‘strong’, ‘weak’) AS attack_class
FROM pokemon.mypokemon;
IFNULL
데이터가 NULL인지 아닌지를 확인해 NULL이라면 새로운 값을 반환하는 함수
※ IS NULL : 데이터가 NULL인지 아닌지를 확인하는 연산자
IFNULL 특징
- IFNULL([컬럼이름], NULL일때 값) 형식으로 사용.
- 해당 컬럼의 값이 NULL인 로우에서 NULL일때 값을 반환.
- 주로 SELECT절에 사용하는 함수로, 결과 값을 새로운 컬럼으로 반환.
IFNULL 사용예제
SELECT name, IFNULL(name, ‘unknown’) AS full_name
FROM pokemon.mypokemon;
2. 여러 조건 한번에 만들기
조건을 하나 만들때 사용하는 문법 IF
조건을 여러개 만들때 사용하는 문법 CASE
CASE
CASE 특징
- 주로 SELECT절에 사용하는 함수로, 결과값을 새로운 컬럼으로 반환한다
- ELSE 문장을 생략시 NULL 값을 반환한다.
형식 1
CASE
WHEN 조건식1 THEN결과값1
WHEN 조건식2 THEN결과값2
ELSE 결과값3
END
형식2
CASE [컬럼이름]
WHEN 조건값1 THEN결과값1
WHEN 조건값2 THEN결과값2
ELSE 결과값3
END
CASE 사용예제(1)
ELECT name,
CASE
WHENattack >= 100 THEN ‘very strong’
WHENattack >= 60 THEN ‘strong’
ELSE ‘weak’
END AS attack_class
FROM pokemon.mypokemon;
CASE 사용예제(2)
SELECT name, type
CASE type
WHEN ‘bug’ THEN ‘grass’
WHEN ‘electric’ THEN ‘water’
WHEN ‘grass’ THEN ‘bug’
END AS rival_type
FROM pokemon.mypokemon;
3. 함수 만들기
함수 만들기 쿼리 문법
CREATE FUNCTION [함수이름] ( [입력값이름] [데이터타입], …)
RETURNS [결과값데이터타입]
BEGIN
DECLARE [임시값이름] [데이터타입];
SET [임시값이름] = [입력값이름];
쿼리;
RETURN결과값
END
함수 지우기 쿼리 문법
DROP FUNCTION [함수이름];
함수 만들기 예시
공격력과 방어력의 합을 가져오는함수
CREATE FUNCTION getAbility(attack INT, defense INT)
RETURNS INT
BEGIN
DECLARE a INT;
DECLARE b INT;
DECLARE ability INT;
SET a = attack;
SET b = defense;
SELECT a + b INTO ability;
RETURN ability;
END
4. [실습] 함수를 만들고 사용해보자
[포켓몬 데이터 입력 쿼리]
DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon (
number int,
name varchar(20),
type varchar(10),
attack int,
defense int
);
INSERT INTO mypokemon (number, name, type, attack, defense)
VALUES (10, 'caterpie', 'bug', 30, 35),
(25, 'pikachu', 'electric', 55, 40),
(26, 'raichu', 'electric', 90, 55),
(125, 'electabuzz', 'electric', 83, 57),
(133, 'eevee', 'normal', 55, 50),
(137, 'porygon', 'normal', 60, 70),
(152, 'chikoirita', 'grass', 49, 65),
(153, 'bayleef', 'grass', 62, 80),
(172, 'pichu', 'electric', 40, 15),
(470, 'leafeon', 'grass', 110, 130);
MISSION
공격력과 방어력의 합이 120보다크면 ‘very strong’, 90보다 크면 ‘strong’,
모두 해당되지 않으면 ‘not strong’를 반환하는 함수 ‘isStrong’을 만들고 사용해주세요.
조건1: attack과 defense를 입력값으로 사용하세요.
조건2: 결과값 데이터타입은 VARCHAR(20)로 해주세요.
SET GLOBAL log_bin_trust_function_creators = 1;
DELIMITER //
CREATE FUNCTION isStrong(attack INT, defense INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE a INT;
DECLARE b INT;
DECLARE isstrong 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 isstrong ;
RETURN isStrong ;
END ;
//
DELIMITER ;
SELECT name, isStrong(attack, defense) AS isStrong
FROM mypokemon;
5. [실습] 조건문을 만들어 보자
※모든 문제 결과값은 결과 테이블을 보고 이해할 수 있게, 포켓몬이름 또는 타입 중 하나의 값을 반드시 포함해주세요.
MISSION (1)
포켓몬의 번호가 150보다 작으면 값을 ‘old’로 반환하고, 번호가 150보다 크거나 같으면 값을 ‘new’로 반환해서 ‘age’라는별명으로 가져와주세요.
SELECT number, IF( number < 150,'old', 'new' ) As age
FROM mypokemon;
MISSION (2)
포켓몬의 공격력과 방어력의 합이 100보다 작으면 값을‘weak’로 반환하고, 100보다 크거나 같으면 값을‘strong’로반환해서 ‘ability’라는 별명으로 가져와주세요.
SELECT name , IF( attack + defense < 100 ,'weak', 'strong' ) As ability
FROM mypokemon;
MISSION (3)
포켓몬의 타입별 공격력의 평균이60 이상이면 값을True(1)로 반환하고, 60보다 작으면False(0)를
반환해 ‘is_strong_type’이라는 별명으로 가져와주세요.
SELECT type, CASE
WHEN AVG(attack) >= 60 THEN TRUE
WHEN AVG(attack) < 60 THEN FALSE
END
AS is_strong_type
FROM mypokemon
GROUP BY type;
SELECT type, IF(AVG(attack) >= 60 ,TRUE,FALSE) AS is_strong_type
FROM mypokemon
GROUP BY type;
MISSION (4)
포켓몬의 공격력이 100보다 크고, 방어력도 100보다 크면 값을True(1)로 반환하고, 둘 중 하나라도
100보다 작으면 False(0)를 반환해 ‘ace’라는 별명으로 가져와주세요.
SELECT name, CASE
WHEN attack > 100 AND defense > 100 THEN TRUE
WHEN attack > 100 OR defense < 100 THEN FALSE
END
AS ace
FROM mypokemon;
MISSION (5)
포켓몬의 번호가 100보다 작으면 값을 ‘<100’을 반환하고, 200보다 작으면 값을‘<200’을 반환하고,
500보다 작으면 값을‘<500’을 반환하는 규칙을만들고, 각 포켓몬별 규칙 적용값 을‘number_bin’이라는
별명으로 가져와주세요.
SELECT name, CASE
WHEN number < 100 THEN '<100 '
WHEN number < 200 THEN '<200'
WHEN number < 500 THEN '<500 '
END
AS number_bin
FROM mypokemon;
MISSION (6)
아래 표에 따른 값을 반환하는 규칙을 만들고, 각 포켓몬별 규칙 적용값을 ‘age_attack’ 이라는 별명으로
가져와주세요.
SELECT name, CASE
WHEN number>=150 AND attack>=50 THEN 'new_strong '
WHEN number<150 AND attack>=50 THEN 'old_strong'
WHEN number>=150 AND attack<50 THEN 'new_weak '
WHEN number<150 AND attack<50 THEN 'old_weak '
END
AS age_attack
FROM mypokemon;
MISSION (7)
타입별 포켓몬수가 1개면 ‘solo’, 3개 미만이면 ‘minor’ , 3개이상이면 ‘major’를 반환하고,
‘count_by_type’이라는 별명으로 가져와주세요.
SELECT type ,CASE
WHEN COUNT(type) = 1 THEN 'solo'
WHEN COUNT(type) < 3 THEN 'minor'
WHEN COUNT(type) >= 3 THEN 'major'
END
AS count_by_type
FROM mypokemon
GROUP BY type;
'Structured Query Language > MY_SQL_basic' 카테고리의 다른 글
SQL_Basic_08_Day 09. 여러 테이블 한번에 다루기 (0) | 2022.08.09 |
---|---|
SQL_Basic_07_Day 08. 테이블 합치기 (0) | 2022.08.09 |
SQL_Basic_05_Day 06. 데이터 그룹화 하기 (0) | 2022.08.07 |
SQL_Basic_04_Day 05. 원하는 데이터 만들기 (0) | 2022.08.07 |
SQL_Basic_03_Day 04. 조건에 맞는 데이터 가져오기 (0) | 2022.08.07 |