본문 바로가기
BackEnd/DB, SQL

SQL 2편: WHERE절과 연산자(논리, 산술, 비교, NOT, IN,BETWEEN, LIKE, IS NULL, 집합 연산자), 연산자의 우선순위

by summer_light 2021. 12. 17.

1. WHERE절

SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는 데 사용한다. SELECT 문이 열을 지정하는 것이라면, WHERE절은 행을 지정하는 것이다. WHERE절에서 문자열을 비교할 때는 작은 따옴표 '로 묶어 주어야 한다. 테이블 안의 값들은 대소문자를 구별하므로, 정확하게 지정해야 한다. 

SELECT *
FROM TABLE
WHERE A=1;

 

2. 연산자

WHERE절에서 원하는 행만 골라내려면, 조건식이 필요하다. 이 때 사용하는 것이 연산자이다.

 

1) 논리 연산자

AND, OR 등 

2) 산술 연산자

+, -, *, /

3) 비교 연산자

>, >=, <, <= : 대소 비교

= : 같으면 TRUE

!=, <>, ^= : 다르면 TRUE

 

4) NOT 연산자

논리 부정 연산자. 뒤에 오는 전체 조건식을 부정하는 연산자. 복잡한 조건식에서 정반대의 최종 결과를 원할 때 주로 사용한다. 

 

5) IN 연산자

출력하고 싶은 열의 조건이 여러 가지 일 때, OR 대신 사용

WHERE 열 이름 IN (데이터1, 데이터2, ... 데이터 N); 

 

6) BETWEEN A AND B 연산자

A이상 B이하

WHERE 열 이름 BETWEEN 최솟값 AND 최댓값; 

 

7) LIKE 연산자

검색 기능에서 일부 문자열이 포함된 데이터를 조회할 때 사용한다. 

와일드 카드를 활용할 수 있다.

 

와일드 카드 종류

%: 길이와 상관없이 모든 문자 데이터를 의미한다. 아무 값도 없는 것도 포함한다.

_: 길이가 1인 문자 데이터를 의미한다. 

 

예를 들어 _a%라고 작성하면 A열의 값이 두번째 글자가 a이고, 그 뒤에 오는 값은 상관 없는 경우를 의미한다. 

SELECT *
FROM TABLE
WHERE A LIKE '_a%';

 

가장 자주 사용하는 검색 방법은 어떤 값을 포함하는 것을 찾는 것이다.

그럴 때는 '%원하는값%' 이라고 작성하면 원하는 값을 포함하는 모든 것들을 찾을 수 있을 것이다. 

SELECT *
FROM TABLE
WHERE A LIKE '%원하는값%';

 

와일드 카드가 찾고자 하는 데이터의 일부일 경우: ESCAPE 절을 사용한다. 

WHERE A LIKE 'a\_a%' ESCAPE '\';

위와 같이 작성하면 \바로 뒤에 있는 문자는 와일드 카드가 아니라는 의미이다. (\대신 다른 문자를 사용할 수 있다.) 

따라서 a_a로 시작하는 데이터들을 모두 찾을 것이다. 

 

8) IS NULL 연산자 

- NULL이면 TRUE, 아니면 FALSE를 반환한다.

- A열의 값이 NULL 이어도 WHERE A = NULL; 과 같이 쓰면 TRUE가 아닌 NULL이 반환되어 데이터를 조회할 수 없다.

?와 ?를 비교했을 때 그 값이 같다고 할 수없는 것과 같다. 같을 수도 있고, 다를 수도 있기 때문이다. 그래서 ?를 의미하는 NULL이 반환된다. 그래서 어떤 열의 데이터가 NULL인 경우를 구별해 내고 싶다면, IS NULL 연산자를 사용해야 한다. 

- 데이터가 NULL이 아닌 경우를 찾고 싶다면 IS NOT NULL 을 사용하면 된다. 

 

NULL의 의미는 값이 완전히 비어있음을 의미한다(0이 아니다!). 아래와 같이 이해하면 편하다.

- 존재하지 않는 값 (EX. 아직 미혼인 사람의 결혼기념일)

- 확정되지 않은 값 (EX. 아직 대학 재학 중인 사람의 최종 학점 평균)

- 노출할 수 없는 값 (EX. 민감한 개인 정보)

 

※ 참고

AND 연산의 결과

  T F NULL
T T F NULL
F F F F
NULL NULL F NULL

OR 연산의 결과 

  T F NULL
T T T T
F T F NULL
NULL T NULL NULL

NULL 값을 ?라고 생각하면 편하다. T*? 의 값은 T나 F가 될 수 있으므로 하나로 확정되지 않아 그 결과는 NULL이 된다. AND 연산의 결과 표에서 T열에서, 행이 T이냐 F이냐에 따라 결과가 T가 될 수도 있고, F가 될 수도 있다. 그러므로 NULL을 곱하면 NULL이 되는 것이다. 

 

9) 집합 연산자

두 개 이상의 SELECT 문의 결과 값을 연결할 때 사용한다.

SELECT 문이 출력하려는 열 개수와 각 열의 자료형이 순서대로 일치해야만 사용할 수 있다. 조회하는 열 이름이 다른 것은 문제가 되지 않는다. 

 

집합 연산자의 종류

UNION 합집합
UNION ALL 합집합 (중복 제거 없는)
MINUS 차집합
INTERSECT 교집합

 

3. 연산자의 우선순위 

우선순위 연산자  
높음 *, /  
  +, -  
  =, !=, >, <  대소 비교 연산자 모두
  IS NULL, LIKE, IN  NOT 포함 가능
  BETWEEN A AND B  
  NOT  
  AND  
낮음 OR  

 

댓글