본문 바로가기
SQL

SQL 4일차 - 조건에 맞는 데이터 가져오기

by 푸리세상 2024. 3. 29.
728x90

1. 가져올 데이터의 조건을 지정해주는 키워드 : WHERE

   - WHERE [조건식] 형식

   - True가 되는 row만 가져옴

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE 조건식;

 


2. 연산자 종류

 1) 비교 연산자 : =(같다), >(크다), <(작다), !=(같지 않다), >=(크거나 작다), <=(작거나 같다)

 

    예제1> 피카츄의 number를 찾기

SELECT number
FROM mypokemon
WHERE name = "pikachu";

 

 

    예제2> 속도가 50보다 큰 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE speed > 50;

 

    예제3> 전기 타입이 아닌 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE type != "electric";

 

 

 2) 논리 연산자 : NOT(~가 아니면 True), AND(둘다 True라면 True), OR(둘중 하나만 True라면 True)

 

    예제1> 속도가 100 이하인 전기타입 포켓몬의 이름을 찾기

SELECT name
FROM mypokemon
WHERE speed <= 100
AND type = "electric";

 

 

    예제2> 벌레 타입이거나 노말 타입인 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE type = "bug" or type = "normal";

 

 

    예제3> 속도가 100 이하이고 벌레 타입이 아닌 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE speed <= 100 and NOT type = "bug";

 

 

 3) 기타 주요 연산자 : BETWEEN(특정 범위 내의 데이터를 선택), IN(목록 내 포함되는 데이터를 선택할 때 사용)

   - BETWEEN : [컬럼 이름] BETWEEN A AND B 형식(A와 B사이에 포함되는 값을 가진 row만 선택)

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름] BETWEEN [조건1] AND [조건2];

 

 

    예제1> 속도 50과 100 사이인 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE speed BETWEEN 50 AND 100;

 

 

 

 - IN : [컬럼 이름] IN (A,B,...G) 형식(해당 컬럼의 값이 () 내의 값에 포함되는 값을 가진 row만 선택)

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름] IN ([조건1],[조건2],...[조건4]);

 

 

 

   예제1>  벌레 타입이거나 노말 타입인 포켓몬의 이름 찾기

SELECT name
FROM mypokemon
WHERE type IN ("bug", "normal");

 


3. 문자 데이터 다루기

  1) LIKE

     - [컬럼 이름] LIKE [검색할 문자열] 형식

     - 해당 컬럼 값이 [검색할 문자열]을 포함하고 있는 row만 선택

     - [검색할 문자열] 내에 와일드카드를 사용하여 검색 조건을 구체적으로 표현 가능(%, _)

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름] LIKE [겸색할 문자열];

 

 

  예제1> 이름이 chu로 끝나는 포켓몬의 이름을 찾기

SELECT name
FROM mypokemon
WHERE name LIKE "%chu";

 

 

    예제2> 이름에 a가 포함되는 포켓몬의 이름을 찾기

SELECT name
FROM mypokemon
WHERE name LIKE "%a%";

 

 


4. NULL 데이터 다루기

 - NULL : 데이터 값이 존재하지 않는다는 뜻(0이나 공백이 아닌 알수 없는 값을 의미)

 

예제1> 공백과 NULL 비교

--type값을 공백으로 입력
INSERT INTO mypokemon(name, type)
VALUES("kkobugi", "");

입력하지 않은 값들은 NULL 보여지고 공백으로 입력한것은 공백으로 보여짐

 

 

 1) IS NULL : 데이터가 NULL인지 아닌지 확인하는 연산자

    - [컬럼 이름] IS NULL 형식

    - 해당 커럼이 NULL이 있는 row만 선택

    - NULL이 아닌 데이터를 검색하고 싶으면 IS NOT NULL을 사용

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름] IS NULL;

 

 

    예제1> number가 null인 포켓몬의 이름을 찾기

SELECT name
FROM mypokemon
WHERE number IS NULL;

 

 

 

    예제2> type이 null이 아닌 포켓몬을 찾기

SELECT name
FROM mypokemon
WHERE type IS NOT NULL;

 


5. 실습문제 풀기

문제풀기용 DATA

 

 1) 이브이의 타입을 가져오기

SELECT type
FROM mypokemon
WHERE name = "eevee";

 

 

 

 

 2) 캐터피의 공격력과 방어력을 가져오기

SELECT attack, defense
FROM mypokemon
WHERE name = "caterpie";

 

 

 

 

 3) 몸무게가 6kg보다 큰 포켓몬들의 모든 데이터 가져오기

SELECT *
FROM mypokemon
WHERE weight > 6;

 

 

 

  4) 키가 0.5보다 크고,몸무게가 6kg보다 크거나 같은 포켓몬들의 이름 가져오기

SELECT name
FROM mypokemon
WHERE height >0.5 AND weight >= 6;

 

 

 

  5) pokemon 테이블에서 공격력이 50 미만이거나, 방어력이 50 미만인 포켓몬들의 이름을 weak_pokemon이라는 별명으로 가져오기

SELECT name AS weak_pokemon
FROM mypokemon
WHERE attack < 50 OR attack < 50;

 

 

 

  6) 노말 타입이 아닌 포켓몬들의 데이터를 전부 가져오기

SELECT *
FROM mypokemon
WHERE type != "normal";

 

 

 

  7) 타입이 normal, fire, water, grass 중에 하나인 포켓몬들의 이름과 타입을 가져오기

SELECT name, type
FROM mypokemon
WHERE type IN ("normal", "fire", "water", "grass");

 

 

 

  8) 공격력이 40과 60 사이인 포켓몬들의 이름과 공격력을 가져오기

SELECT name, attack
FROM mypokemon
WHERE attack BETWEEN 40 AND 60;

 

 

 

  9) 이름에 e가 포함되는 포켓몬들의 이름을 가져오기

SELECT name
FROM mypokemon
WHERE name LIKE "%e%";

 

 

 

 10) 이름에 i가 포함되고 속도가 50 이하인 포켓몬 데이터 전부 가져오기

SELECT *
FROM mypokemon
WHERE name LIKE "%i%" AND speed < 50;

 

 

 

  11) 이름이 chu로 끝나는 포켓몬들의 이름, 키, 몸무게를 가져오기

SELECT name, height, weight
FROM mypokemon
WHERE name LIKE "%chu";

 

 

 

  12) 이름이 e로 끝나고 방어력이 50미만인 포켓몬들의 이름, 방어력을 가져오기

SELECT name, defense
FROM mypokemon
WHERE name LIKE "%e" AND defense < 50;

 

 

 

   13) 공격력과 방어력의 차이가 10 이상인 포켓몬들의 이름, 공격력, 방어력을 가져오기

SELECT name, attack, defense
FROM mypokemon
WHERE attack - defense >= 10 OR defense - attack >= 10;
-- 절대값 조건을 사용해야하는데 OR 조건을 사용해서 반대 경우도 만들어주기

 

 

 

 

   14) 능력치의 합이 150 이상인 포켓몬의 이름과 능력치의 합을 가져오기

         (능력치의 합은 total이라는 별명으로 가져오고, 능력치의 합은 공격력, 방어력, 속도이다.)

SELECT name, attack + defense + speed AS total
FROM mypokemon
WHERE attack + defense + speed >= 150;

 


-> 조건에 맞는 데이터를 가져오는 쿼리에 대해 배웠는데 실제 연습을 통해 쿼리문을 작성해보니 기본기를 잘 다져야 응용도 하면서 풀 수 있다는것을 느꼈고 이번 실습문제를 풀면서 13번과 14번 문제를 풀면서 오타도 있다보니 계속 결과값이 안나와서 오타는 꼭 조심해야하고 아래 error 뜨는 부분을 자세히 볼 필요가 있다고 생각합니다ㅠㅠ이걸 제대로 안봐서 오타가난지 모르고 쿼리문을 제대로 적었지만 틀렸더라구요!!

 

728x90