SQL

WHERE 절을 알아보자 1편 (feat. NULL, 비교/논리 연산자)

인공지능끙정 2023. 1. 26. 00:09
반응형

안녕하세요, 끙정입니다.

 

오늘은 SELECT문과 함께 쓰이는 WHERE절에 대해서 알아보겠습니다.

SELECT문에서 필드 목록이 열을 지정해주는 것이라면, WHERE 절은 행을 지정해주는 것입니다.

WHERE조건으로 쓸 수 있는 NULL, 비교/논리 연산자까지 같이 알아보겠습니다.

 

1. WHERE 기본 문법

 

/* "FROM 테이블" 뒤에 "WHERE 조건" 으로 선언해준다. */
SELECT 필드목록 FROM 테이블 WHERE 조건;

 

아래는 area가 1000 이상인 행만 출력해달라는 선언을 한 것이다.

 

SQL 서버에서 WHERE절 사용

 

여기서 유의할 점이 조금 있는데, 조건으로 지정해주는 문자열과 날짜 상수는 항상 작은따옴표로 감싸야한다는 것이다. 따옴표가 없으면 필드명으로 인식하기 때문에, 잘못된 데이터를 추출하거나 에러가 뜰 수 있다. 오라클에서는 큰 따옴표는 별명을 지정할 때만 쓴다. (Maria DB는 큰 따옴표도 인식해준다.)

 

SELECT * FROM tCity WHERE name = '서울'  /* 맞음 */
SELECT * FROM tCity WHERE name = 서울  /* 에러 */
SELECT * FROM tCity WHERE name = "서울"  /* 에러, but Maria DB는 맞음 */

 

Maria DB는 거진 다 허용해준다...

 

또한 필드 값의 영문자를 비교할 때는 대소문자를 유의해야 한다. SQL은 대소문자를 잘 구분하지 않고 잘 허용하지만, 필드 값에서는 대소문자를 구분해야 한다. 그러나 여기서도 차이가 있는데, SQL 서버와 Maria DB는 비교할 때는 대소문자를 구분하지 않는다.

 

대소문자가 달라서 에러가 뜨는 오라클과 뜨지 않는 SQL서버

 

2. NULL  값

NULL은 값이 입력되어 있지 않은, 비어 있는 상태를 말한다. 0이나 빈 문자열과는 엄연히 다르다.

WHERE 절을 통해 NULL값과 관련한 조건을 지정해줄 수 있다.

 

/* IS NULL 조건으로 출력이 가능하다. */
SELECT * FROM tStaff WHERE score IS NULL;

/* 반대로 IS NOT NULL 로도 출력이 가능하다. */
SELECT * FROM tStaff WHERE score IS NOT NULL;

 

유의할 점은 NULL은 값이 아니라 상태이기 때문에 논리 연산자로 선언할 수 없다.

 

= 연산자로는 아무것도 출력하지 못한다.

 

3. 비교 연산자, 논리 연산자

비교 연산자는 모든 언어에 똑같이 쓰이는 표준 언어이다.

비교 연산자 설명
A = B 같다. WHERE name = '서울'
A > B A가 더 크다. WHERE area > 50
A < B B가 더 크다. WHERE popu < 100
A >= B A가 B보다 크거나 같다. SQL Server 에서는 !< 도 지원 WHERE popu >= 100
A <= B A가 B보다 작거나 같다. SQL Server 에서는 !> 도 지원 WHERE popu <= 100
A <> B, A != B A와 B는 다르다. 같지 않다. WHERE region <> '경기'

 

논리 연산자는 AND, OR, NOT을 사용한다.

AND는 두 조건이 모두 참인 레코드를 검색,

OR는 두 조건 중 하나라도 참인 레코드를 검색,

NOT은 표현식의 진위 여부를 반대로 바꾼다.

 

또한 3개 이상의 조건문을 지정할 때, 우선순위를 주의해야 한다.

일반적으로 AND의 우선순위가 OR보다 높다.

괄호를 지정해주면 우선순위를 지정해줄 수 있다.

 

/* 기본 */
SELECT * FROM tCity WHERE popu >= 100 AND area >= 700;

/* 1번 */
SELECT * FROM tCity WHERE region = '경기' AND popu >= 50 OR area >= 500;

/* 2번 */
SELECT * FROM tCity WHERE region = '경기' AND (popu >= 50 OR area >= 500);

 

기본적으로 이렇게 조건을 지정해준다.

1번과 2번의 경우는 큰 차이가 존재한다. 이 부분은 쿼리 결과를 보면서 설명하는 것이 이해가 쉽다.

 

맨 위가 전체 출력, 중간이 1번, 아래가 2번 출력이다.

 

중간 결과물이 1번, 아래 결과물이 2번이다.

즉, 1번은 AND 조건을 먼저 거친다. region이 '경기' 이면서 popu가 50 이상인 조건을 출력하고, 또한,  area 가 500 이상인 조건을 출력하라는 말이다. 앞선 조건으로 경기에서 50 이상인 서울이 출력되고, 뒷 조건으로 area가 500 이상인 조건을 출력했다. 500 미만인 오산, 전주는 출력되지 않았다.

 

반면 2번은 괄호 안의 조건을 먼저 거친다. popu가 50 이상이거나 area가 500 이상인 도시를 출력하고, 이와 동시에 region이 '경기'인 조건을 만족하는 결과만 출력한다. 해당 조건은 서울뿐이다.

 

NOT 연산자의 활용은 조건이 2개 이상이 될 때 쓰는 것이 일반적이다. 조건이 하나만 있을 경우 NOT(조건)을 쓰는 것보다는!= 을 쓰는 것이 더 편하기 때문이다.

 

!= 이 훨씬 편하다.

 

그러나 조건이 2개 이상이 되면!= 로 치환하는 게 더 어려워진다. 아래 쿼리와 결과를 보면 알 수 있다.

 

 

A AND B의 부정은! A OR! B이다. 드 모르간의 법칙이라고 한다. 즉, NOT 하나만 넣으면 되는 것을 3개의 수정을 거쳐야 하는 것이다. 조건이 늘어나면 늘어날수록 수고로움은 더해진다. 그래서 NOT()으로 감싸버리면 편하다.

 

 

그만 알아보겠습니다.

 

 

출처

http://www.yes24.com/Product/Goods/101637633

 

김상형의 SQL 정복 : 소문난 명강의 (무료특별판) - YES24

DBMS에 제약 없이 SQL을 활용한다!핵심 원리를 알려주는 SQL 바이블 DBMS 제품이나 개발툴이 아닌 SQL 언어 그 자체를 배우는 바이블 도서다. 특정 DBMS에 종속적인 사용법보다는 표준화된 데이터 관리

www.yes24.com

반응형