본문 바로가기

하루 30분 SQL 공부하기

[SQL/DFL] SELECT문의 WHERE절과 논리, 비교, SQL 연산자

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

이렇게 괄호를 사용해서 연산자 우선순위를 높일 수 있다.