Day 04. 조건에 맞는 데이터 가져오기
1. 조건에 맞는 데이터 가져오기
우리가 하게 될 대부분의 데이터 요청은
“10번 이상 구매한 VIP-고객 리스트 뽑아주세요”
“매출 5천만원 이상의 상품 리스트 뽑아주세요” 와 같이 조건이 붙는다.
따라서, 이번 day에서 우리는 조건에 맞는 데이터를 가져오는 방법을 배우겠습니다.
가져올 데이터의 조건을 지정해주는 키워드
WHERE
- WHERE의 특징 WHERE 조건식 형식으로 사용합니다.
- 조건식이 True(참)이 되는 로우만 선택합니다.
WHERE 문법
SELECT [컬럼이름]
FROM [테이블이름]
WHERE 조건식;
조건식
- 조건식을 작성하는데에는 다양한 방식이 있다.
- 보통 ‘연산자’를 사용하여 조건식을 작성.
- 원하는 데이터의 조건이 True (참)이 되게끔 조건식을 만든다.
- MySQL에서는 True(참)값을 1로 표현. False(거짓)값은 0으로 표현. (= 엑셀과동일)
연산자 종류
- 비교연산자
=, >, <등 - 논리연산자
NOT, AND, OR등 - 기타주요연산자
BETWEEN, IN 등
2. 비교연산자
값을 비교하는 기호, 비교 연산자
‘=’ 사용예제
요청: 피카츄의 number를 찾아주세요.
SELECT number
FROM mypokemon --테이블사용(USE) 명시했다고가정
WHERE name = ‘pikachu’;


‘>’ 사용예제
요청: 속도가 50보다 큰 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE speed > 50;


‘!=’ 사용예제
요청: 전기 타입이 아닌 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE type != ‘electric’;


3. 논리연산자
조건식에 논리조건을 적용하는 기호, 논리연산자
'AND' 사용 예제
요청: 속도가 100 이하인 전기 타입 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE speed <= 100 AND type = ‘electric’;


'OR' 사용 예제
요청: 벌레 타입이거나 노말타입인 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE type = ‘bug’ OR type = ‘normal’;


'NOT' 사용 예제
요청: 속도가 100 이하 이고 벌레타입이 아닌 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE speed <= 100 AND NOT(type = ‘bug’); # type != 'bug'와 동일


4. 기타 주요 연산자
BETWEEN
특정 범위 내의 데이터를 선택할때 사용하는 연산자
특징
- [컬럼이름] BETWEEN A AND B형식으로 사용.
- 해당 컬럼값이 A와 B사이에 포함되는 값을 가진 로우만 선택. (A <=컬럼값<= B)
- [컬럼이름] BETWEEN A AND B쿼리는 A <= [컬럼이름] AND [컬럼이름] <= B와 동일.
BETWEEN 문법
SELECT [컬럼이름]
FROM[테이블이름]
WHERE [컬럼이름] BETWEEN [조건1] AND [조건2];
BETWEEN 사용 예제
요청: 속도가 50과 100 사이인 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE speed BETWEEN 50 AND 100; #speed >= 50 AND speed <= 100와동일


IN
목록 내 포함되는 데이터를 선택할때 사용하는 연산자
- 특징[컬럼이름] IN (A, B, …, C)형식으로 사용.
- 해당 컬럼의 값이‘( )’ 내의 값에 포함되는 값을 가진 로우만 선택.
- [컬럼이름] IN (A, B)쿼리는 [컬럼이름] = A OR [컬럼이름] = B와 동일.
- 목록에 넣을 값이 여러개일 때, OR 연산자보다 표현 및 이해가 쉽다.
IN 문법
SELECT [컬럼이름]
FROM[테이블이름]
WHERE [컬럼이름] IN ([조건1], [조건2], …);
IN 사용 예제
요청: 벌레 타입이거나 노말 타입인 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE type IN (‘bug’, ‘normal’);
5. 문자형 데이터 다루기
LIKE
특정 문자열이 포함된 데이터를 선택하는 연산자
특징
- [컬럼이름] LIKE [검색할문자열] 형식으로 사용.
- 해당 컬럼값이[검색할문자열]을 포함하고 있는 로우만 선택.
- [검색할문자열] 내에 와일드카드를 사용하여 검색조건을 구체적으로 표현 할 수있다.
와일드 카드
몇개의 문자일까요?
% : 0개이상의문자 = 알수없음
“_” : 1개
“__” : 2개
“_%” : 1개이상의문자 = 알수없음
LIKE 문법
SELECT [컬럼이름]
FROM[테이블이름]
WHERE [컬럼이름] LIKE [검색할문자열];
LIKE 사용 예제
요청: 이름이 ‘chu’로 끝나는 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE name LIKE ‘%chu’;


요청: 이름에 ‘a’가 포함되는 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE name LIKE ‘%a%’;


6. NULL 데이터 다루기
NULL
데이터 값이 존재하지 않는 표현
0 이나 공백이 아닌 알 수 없는 값을 의미
INSERT INTO mypokemon (name, type)
VALUES (‘kkobugi’, ‘’);
SELECT *
FROM mypokemon;
IS NULL
데이터가 NULL인지 아닌지를 확인하는 연산자
특징
- [컬럼이름] IS NULL형식으로 사용.
- 해당컬럼이 NULL이 있는 로우만 선택.
- NULL이 아닌 데이터를 검색하고 싶다면 IS NOT NULL을 사용.
- [컬럼이름] = NULL 또는 [컬럼이름] != NULL 과 같은 표현은 사용하지 않는다.
SELECT [컬럼이름]
FROM[테이블이름]
WHERE [컬럼이름] IS NULL;
IS NULL 사용 예제
요청: number가 null인 포켓몬의 이름을 찾아주세요.
SELECT name
FROM mypokemon
WHERE number IS NULL; # number = NULL 은 사용불가합니다
IS NOT NULL 사용예제
요청: type이 null이 아닌 포켓몬을 찾아주세요.
SELECT name
FROM mypokemon
WHERE type IS NOT NULL;


7. [실습] 주어진 조건에 맞는 데이터를 가져와보자 (WHERE)
[ 포켓몬 데이터 입력 쿼리]
DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon (
number int,
name varchar(20),
type varchar(20),
height float,
weight float,
attack float,
defense float,
speed float
);
INSERT INTO mypokemon (number, name, type, height, weight, attack, defense, speed)
VALUES (10, 'caterpie', 'bug', 0.3, 2.9, 30, 35, 45),
(25, 'pikachu', 'electric', 0.4, 6, 55, 40, 90),
(26, 'raichu', 'electric', 0.8, 30, 90, 55, 110),
(133, 'eevee', 'normal', 0.3, 6.5, 55, 50, 55),
(152, 'chikoirita', 'grass', 0.9, 6.4, 49, 65, 45);
MISSION (1)
이브이의 타입을 가져와 주세요.
SELECT type
FROM mypokemon
WHERE name = "eevee";
MISSION (2)
캐터피의 공격력과 방어력을 가져와 주세요.
SELECT attack, defense
FROM mypokemon
WHERE name = "caterpie" ;
MISSION (3)
몸무게가 6kg보다 큰 포켓몬들의 모든 데이터를 가져와 주세요.
SELECT *
FROM mypokemon
WHERE weight > 6 ;
MISSION (4)
키가 0.5m보다 크고, 몸무게가 6kg 보다 크거나 같은 포켓몬들의 이름을 가져와주세요.
SELECT name
FROM mypokemon
WHERE height > 0.5 AND weight >= 6 ;
MISSION (5)
포켓몬테이블에서 공격력이50 미만이거나, 방어력이 50미만인 포켓몬들의 이름을
‘weak_pokemon’이라는 별명으로 가져와주세요.
SELECT name AS weak_pokemon
FROM mypokemon
WHERE attack < 50 OR defense < 50;
MISSION (6)
노말타입이 아닌 포켓몬들의 데이터를 전부 가져와주세요.
SELECT *
FROM mypokemon
WHERE type != "nomal";
# 만약 not 을 사용한다면?
SELECT *
FROM mypokemon
WHERE NOT(type = "nomal");
결과는 동일!
MISSION (7)
타입이(normal, fire, water, grass)중에 하나인 포켓몬들의 이름과 타입을 가져와주세요.
SELECT name, type
FROM mypokemon
WHERE type IN ("normal", 'fire', 'water', 'grass');
SELECT name, type
FROM mypokemon
WHERE type = "normal" OR type ='fire' OR type = 'water' OR type ='grass';
MISSION (8)
공격력이 40과 60 사이인 포켓몬들의 이름과 공격력을 가져와주세요.
SELECT name, attack
FROM mypokemon
WHERE attack BETWEEN 40 AND 60 ;
MISSION (9)
이름에 ‘e’ 가 포함되는 포켓몬들의 이름을 가져와주세요.
SELECT name
FROM mypokemon
WHERE name LIKE '%e%';
MISSION (10)
이름에 ‘i’가 포함되고, 속도가 50 이하인 포켓몬데이터를 전부 가져와주세요.
SELECT *
FROM mypokemon
WHERE name LIKE '%i%' AND speed <= 50 ;
MISSION (11)
이름이 ‘chu’로 끝나는 포켓몬들의 이름, 키, 몸무게를 가져와 주세요.
SELECT name, height, weight
FROM mypokemon
WHERE name like "%chu";
MISSION (13)
공격력과 방어력의 차이가 10 이상인 포켓몬들의 이름, 공격력, 방어력을가져와주세요.
SELECT name, attack, defense
FROM mypokemon
WHERE attack - defense >= 10 OR defense - attack >= 10;
MISSION (14)
능력치의 합이 150이상인 포켓몬의 이름과 능력치의 합을 가져와주세요.
이때, 능력치의 합은‘total’ 이라는 별명으로 가져와주세요.
조건1. 능력치의합은공격력, 방어력, 속도의합을의미합니다.
SELECT name, attack + defense + speed AS total
FROM mypokemon
WHERE attack + defense + speed >= 150 ;
'Structured Query Language > MY_SQL_basic' 카테고리의 다른 글
SQL_Basic_06_Day 07. 규칙 만들기 (0) | 2022.08.07 |
---|---|
SQL_Basic_05_Day 06. 데이터 그룹화 하기 (0) | 2022.08.07 |
SQL_Basic_04_Day 05. 원하는 데이터 만들기 (0) | 2022.08.07 |
SQL_Basic 02_Day 03. 데이터 가져오기 (0) | 2022.08.07 |
SQL_Basic 01_Day 01, 02. 데이터 베이스 다루기 (0) | 2022.08.07 |