본문 바로가기

SQL

[패스트캠퍼스] SQL 강의 : 조건에 맞는 데이터 가져오기(WHERE)

조건에 맞는 데이터 가져오기 WHERE

 

  • WHERE [조건식] 형식 사용한다.
  • 보통 '연산자'를 사용하여 조건식을 작성한다.
  • 원하는 데이터의 조건식이 True(참)이 되는 조건식을 만든다. 
  • My SQL 에서는 True 값을 1로 표현하고 False 값은 0으로 표현한다. (엑셀과 동일)

 

예제파일

 

값을 비교하는 기호, 비교연산자

 

  • =, !=(같지 않다), >, >=, <, <=

1.  electric이 아닌 타입의 이름을 찾아주세요

SELECT name FROM mypokemon

WHERE type != 'electric';

 

논리연산자

 

연산자 활용 의미
AND A AND B A, B 모드 참이면 참
OR A OR B A, B 둘중 하나만 참이면 참
NOT NOT A A가 아니면 참

 

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');

 

SELECT name FROM mypokemon

WHERE speed <=100 AND type !='bug';

 

기타 주요 연산자

 

* BETWEEN

  • 특정 범위 내의 데이터를 사용할 때 사용하는 연산자
  • [컬럼이름] BETWEEN A AND B 형식 사용 → 해당 컬럼 값이 A와 B사이에 포함되는 값을 가진 로우만 선택(A<= 컬럼 값 <=B)
  • [컬럼이름] BETWEEN A AND B 쿼리는 A <= [컬럼이름] AND [컬럼이름] <=B와 동일하다

 

1. BETWEEN 기본 문법

SELECT [컬럼이름] FROM [테이블이름]

WHERE [컬럼이름] BETWEEN [조건1] AND [조건2];

 

2. 속도가 50과 100사이인 포켓몬의 이름을 찾아주세요

SELECT name FROM mypokemon

WHERE speed BETWEEN 50 AND 100;

 

* IN

  •  목록 내 포함되는 데이터를 선택할 때 사용하는 연산자
  • [컬럼이름] IN (A, B,...,C) 형식 사용
  • 해당 컬럼의 값이 괄호 내의 값에 포함되는 값의 로우만 선택한다
  • [컬럼이름] IN (A, B) 쿼리는 [컬럼이름] A OR [컬럼이름] B와 동일하다
  • 목록에 넣을 값이 여러 개일 때, OR 연산자보다 표현 및 이해가 쉽다

 

1. IN 기본 문법

SELECT [컬럼이름] FROM [테이블이름]

WHERE [컬럼이름] IN ([조건1], [조건2]....);

 

2. 벌레 타입이거나 노말 타입인 포켓몬의 이름을 찾아주세요.

SELECT name FROM mypokemon

WHERE type IN('bug','normal');

 

문자 데이터 다루기 LIKE

 

  • 특정 문자열이 포함 된 데이터를 선택하는 연산자
  • [컬럼이름] LIKE [검색할 문자열] 형식을 사용한다
  • 검색할 문자열이 있는 로우를 선택한다
  • [검색할 문자열] 내에 와일드카드를 사용하여 검색 조건을 구체화 할 수 있다

 

*와일드카드

와일드카드 의미
% 0개 이상의 문자
_ 1개의 문자

ex) 몇 개의 문자열일까?

  • "%" : 0개 이상의 문자, 몇 개인지 알 수 없음
  • "_" : 1개
  • "_ _" 2개
  • "_ %"1개 이상, 알 수 없음
  •  

ex) % 사용 예제

  • "%e" : e로 끝나는 문자열 → e, ee, eee, apple, pineapple
  • "e%" : e로 시작하는 문자열 → e, ee, eee, eric, eevee
  • "%e%" e가 포함된 문자열 → e, ee, eevee, apple, pineapple, aespa

ex) _사용 예제

  • "-e" : e 로 끝나고 e 앞에 1개의 문자가 있는 문자열 → ae, ee, ce
  • "%_e" : e로 끝나고 e 앞에 1개 이상의 문자가 있는 문자열 → ee, eevee, apple, pineapple
  • "%_e_%" : e를 포함하고 e 앞 뒤로 각각 1개 이상의 문자가 있는 문자열 → eevee, aespa

 

* LIKE 

1. LIKE 기본문법

SELECT [컬럼이름] FROM [테이블이름] 

WHERE [컬럼이름] LIKE [검색할 문자열];

 

2. 'chu' 로 끝나는 포켓몬의 이름을 찾아주세요

SELECT name FROM mypokemon

WHERE name LIKE '%chu';

 

3. 이름에 'a'가 포함되지만 a로 끝나지 않는 포켓몬의 이름을 찾아주세요.

SELECT name FROM mypokemon

WHERE name LIKE '%a_%';

 

NULL 데이터 다루기

 

  • 데이터 값이 존재하지 않는다는 표현
  • 0이나 공백이 아닌 알 수 없는 값을 의미

 

*IS NULL

데이터가 NULL 인지 아닌지 확인하는 연산자

[컬럼이름] IS NULL 형식으로 사용

해당 컬럼에 NULL 값이 있는 로우만 선택

NULL이 아닌 데이터를 검색하고 싶다면 [컬럼이름] IS NOT NULL 사용 

 

1. IS NULL 문법

SELECT [컬럼이름] FROM [테이블이름]

WHERE [컬럼이름] IS NULL;

 

2. number가 null인 포켓몬의 이름을 찾아주세요

SELECT name FROM mypokemon

WHERE number IS NULL;

 

3. type이 null이 아닌 포켓몬을 찾아주세요

SELECT name FROM mypokemon

WHERE type IS NOT NULL;

 


실전연습


실전연습 포켓몬 정보 표

 

* 위의 표를 만드는 쿼리

 

DROP DATABASE IF EXISTS pokemon; #만약 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);

 

<미션 완성하기>


/*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.5m보다 크고, 몸무게가 6kg보다 크거나 같은 포켓몬들의 이름을 가져와 주세요.*/
SELECT name FROM mypokemon
WHERE height >0.5 AND weight >=6;

/*5. 포켓몬 테이블에서 공경력이 50미만이거나 방어력이 50미만인 포켓몬 이름을
week_pokemon 이라는 별명으로 가져와 주세요*/
SELECT name AS week_pokemon FROM mypokemon
WHERE attack <50 OR defense <50;

/*6.노멀타입이 아닌 포켓몬의 데이터 전부 가져오기*/
SELECT * FROM mypokemon
WHERE type != "normal";

SELECT * FROM mypokemon
WHERE NOT (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;

SELECT name, attack FROM mypokemon
WHERE attack >=40 AND attack <= 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;

/*14. 능력치의 합이 150 이상인 포켓몬의 이름과 능력치의 합을 가져오기.
이때 능력치의 합은 total 이라는 별명으로 가져온다.
조건1. 능력치의 합은 공격력, 방어력, 속도의 합을 의미한다. */
SELECT name, attack + defense + speed AS total FROM mypokemon
WHERE attack + defense + speed >=150;