WHERE절
SELECT [ALL|DISTINCT] {COLUM_name [[AS] COLUM_alias],}+ | *}
FORM TABLE_LIST
[WHERE 투플_조건식]
WHERE절을 사용하면 투플 조건식을 이용하여, 테이블에서 조건에 맞는 투플만을 선택할 수 있다. 여기서 투플_조건식이란 비교연산자, SQL연산자, 논리연산자를 의미한다.
기본예제)
SELECT PLAYER_ID, PLAYER_NAME, BACK_NO, TEAM_ID
FROM PLAYER
WHERE TEAM_ID = 'K06';

WHERE절을 사용해서 TEAM_ID가 'K06'인것만 출력할 수 있다.
1. 연산자의 종류
연산자의 종류는 비교연산자, SQL 연산자, 논리 연산자가 있다. 3가지 연산자의 우선순위는 비교 연산자와 SQL연산자가 논리 연산자 보다 우선된다.
1) 비교연산자
>, >=, <, <= , <>(not euqal)
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (HEIGHT >= 170 OR WEIGHT < 100) AND
POSITION = 'DF' AND
(TEAM_ID = 'K10' OR TEAM_ID = 'K08');

not equal : <> , != , ^=, NOT
MySQL에서는 위의 4가지 모두 사용가능하지만 표준으로 사용되고 있는 연산자는 '<>' 이기 때문에 not equal은 '<>' 으로 익혀두는 것이 좋다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION <> 'DF';

2) SQL 연산자
- BETWEEN a AND b, NOT BETWEEN a AND b
- IN (list), NOT IN (list)
- LIKE str, NOT LIKE str
- IS NULL, IS NOT NULL
- BETWEEN a AND b, NOT BETWEEN a AND b
BETWEEN a AND b는 a부터 b까지를 의미하고 NOT BETWEEN a AND b는 a부터 b까지를 제외한 모두를 의미한다.
➀ BETWEEN a AND b
WHERE HEIGHT BETWEEN 170 AND 180는 의미상 아래와 같다.
- WHERE HEIGHT >= 170 AND HEIGHT <= 180
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180 ;

➁ NOT BETWEEN a AND b
WHERE HEIGHT NOT BETWEEN 170 AND 180 는 의미상 아래와 같다.
- WHERE HEIGHT < 170 AND HEIGHT > 180
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE HEIGHT NOT BETWEEN 170 AND 180 ;

- IN (list), NOT IN (list)
➀ WHERE TEAM_ID IN ('Ko2', 'K07')은 의미상 WHERE TEAM_ID = 'K02' OR TEAM_ID = 'K07';과 같다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE TEAM_ID IN ('Ko2', 'K07');

➁ IN 연산자를 사용하면 속성의 조합을 tuple로 묶어서 사용할 수 있다.
WHERE (TEAM_ID, POSITION) IN (('K07', 'MF'), ('K08', 'DF'))은 의미상 아래 두가지와 동일하다.
- WHERE (TEAM_ID, POSITION) IN ('K07', 'MF') OR (TEAM-ID, POSITION) IN ('K08', 'DF')
- WHERE (TEAM_ID = 'K07' AND POSITION = 'MF')OR (TEMA_ID = 'K08' AND POSITION = 'DF')
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE (TEAM_ID, POSITION) IN (('K07', 'MF'), ('K08', 'DF'));

➂ NOT IN을 사용하면 Tuple내의 값들을 제외한 다른 값들만 출력해준다.
WHERE TEAM_ID IN ('K07', 'K05') AND POSITION NOT IN ('DF', 'FW')은 의미상 아래와 같다.
- WHERE (TEAM_ID = 'K07' OR TEAM_ID = 'K05') AND (POSITION <> 'DF' AND POSITION <> 'FW')
➞ (POSITION <> 'DF' AND POSITION <> 'FW') 여기서 OR이 아님을 주의 !!
OR을 사용하면 포지션이 'DF'가 아니거나 'FW'가 아닌 값을 출력하게 된다. POSITION NOT IN ('DF', 'FW')의 의미는 포지션이 'DF'와 'FW'가 아닌것을 찾는 AND의 개념이다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE TEAM_ID IN ('K07', 'K05') AND POSITION NOT IN ('DF', 'FW');

- LIKE str, NOT LIKE str
[NOT] LIKE는 문자열 데이터에 대한 패턴매치를 실행한다. 즉, 같은 문자열이 있는지를 찾아내는 연산자이다.
여기서 %, _를 사용하는데 두 연산의 차이점은 아래와 같다.
- % : 0개 문자 이상의 임의의 문자열
- _ : 1개의 단일 문자
둘의 차이점은 예제를 통해 살펴보자
➀ %을 사용
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';

➁ _ 을 사용
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE PLAYER_NAME LIKE '장_';

_을 사용하면 무조건 1개의 단일 문자만 즉, 한 글자만 '장'다음에 올 수 있는데 그런 문자가 없으므로 출력값이 비어있다.
➂ 혼합 사용
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE PLAYER_NAME LIKE '장_%';

➃LIKE 만 사용
값과 정확히 일치하는 값을 찾는다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE PLAYER_NAME LIKE '장형석';

➄ NOT LIKE
선수이름이 '장'으로 시작하지 않고 포지션 명이 'F'로 끝나지 않는 선수들만 출력한다. '%F%' 이렇게 하면 포지션 명에 'F'가 포함하는 모든 선수들을 제외시킨다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE PLAYER_NAME NOT LIKE '장%' AND POSITION NOT LIKE '%F';

- IS NULL, IS NOT NULL
SQL에서는 값이 존재하지 않을 때 NULL을 사용한다. NULL에는 실제로는 빈공간이 아닌 아스키코드 0이 저장되어 있다.
만약 NULL값과 연산 비교를 한다면 다음과 같은 값을 항상 반환한다.
- NULL값과 산술 연산 ➞ NULL을 린턴
- ex) 3 * NULL ➜ NULL
- NULL 값과 비교 연산 ➞ FALSE를 리턴
- ex) 5 < NULL ➜ FALSE
그렇기 때문에 SQL에서 NULL값 여부를 확인하고 싶을 때는 IS NULL, IS NOT NULL 연산자를 사용해야한다.
ex) BACK_NO가 NULL인 것을 출력
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE BACK_NO IS NULL ;

ex) BACK_NO가 NULL이 아닌 것을 출력
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키, TEAM_ID 팀아이디
FROM PLAYER
WHERE BACK_NO IS NOT NULL ;

3) 논리 연산자
AND, OR, NOT
논리연산자는 (), NOT, AND, OR 순서대로 먼저 처리할 수 있다. 다른 연산자와 비교했을 때 논리 연산자는 우선순위가 항상 제일 낮다. 하지만 ()를 사용하여 적절히 우선순위를 조절할 수 있다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (HEIGHT >= 170 OR WEIGHT < 100) AND
POSITION = 'DF' AND
(TEAM_ID = 'K10' OR TEAM_ID = 'K08');
이렇게 괄호를 사용해서 연산자 우선순위를 높일 수 있다.
'하루 30분 SQL 공부하기' 카테고리의 다른 글
| [SQL 코테준비] 가격이 제일 비싼 식품의 정보 출력하기, 잡은 물고기 중 가장 큰 물고기의 길이 구하기 프로그래머스 (0) | 2024.10.10 |
|---|---|
| [MySQL] 프로그래머스 코딩테스트 문제 풀이 SELECT 과일로 만든 아이스크림 고르기, 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.10.08 |
| [SQL] SQL을 공부하기전 알면 좋은 기본 지식 (0) | 2024.10.01 |
| [SQL/DML] SELECT 검색문의 SELECT 절 기초 쿼리 알아보기 (0) | 2024.10.01 |
| [MySQL] CTE Common Table Expression 임시 테이블 (0) | 2024.09.30 |