[SQL 기초 강좌] SELECT문 WHERE절

SELECT 문은 테이블의 데이터를 조회하는 명령어입니다.

다음은 SELECT 문의 기본 형식입니다. 한 문장이 여러 개의 로 만들어져 있습니다. 아래 별도로 표기한 키워드가 각 절의 시작을 의미합니다. SELECT 절FROM 절WHERE 절 이렇게 말이지요.

SELECT   컬럼1, 컬럼2, ...     -- 필수
FROM     테이블명              -- 필수
WHERE    조건식 
GROUP BY 컬럼1, 컬럼2, ...      
HAVING   조건식
ORDER BY 컬럼1, 컬럼2, ...

SELECT 절과 FROM 절은 반드시 있어야 하고, 다른 절은 필요할 때 추가합니다. 테이블 중 일부 데이터만 필요하면 WHERE 절을 추가하고, 정렬이 필요하면 ORDER BY 절을 추가하는 식입니다.

기본 형식에서 절의 순서는 바꿀 수 없습니다. 예를 들어 GRUOP BY 절은 ORDER BY 절보다 항상 먼저 사용해야 합니다. 순서가 틀리면 SQL문이 실행되지 않고 바로 오류가 발생합니다.

SELECT REG_DT, COUNT(*)
FROM   CUST
ORDER BY REG_DT 
GROUP BY REG_DT; 

ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다

~~이제 각 절에 대해 좀 더 자세히 살펴보겠습니다.

SELECT … FROM …

먼저 WHERE 절이 없는 가장 간단한 예시를 보겠습니다.

SELECT *
FROM   CUST

CUST 테이블의 전체 데이터를 조회하는 쿼리입니다. SELECT 뒤에 컬럼명 대신 *(asterisk)를 사용하면 테이블의 모든 컬럼을 조회합니다.

아래는 CUST_NO, CUST_NM 컬럼만 조회하는 쿼리입니다.

SELECT CUST_NO, CUST_NM FROM CUST

조회한 컬럼은 다른 이름으로 바꾸는 별칭(Alias)을 사용할 수도 있습니다. 별칭을 사용할 때는 AS 키워드를 사용하고, AS 키워드를 생략할 수도 있습니다.

SELECT CUST_NO AS CNO  --> AS 키워드 사용
     , CUST_NM CNAME     --> AS 키워드 생략하고 공백만 사용
FROM   CUST

SELECT 절에서 실수로 콤마(,)를 누락하면 어떻게 될까요? 아래처럼 컬럼의 별칭으로 처리되어 원하지 않는 값이 조회될 수도 있습니다. 실제로 종종 발견되는 실수입니다.

SELECT CUST_NO CUST_NM 
FROM   CUST

다른 스키마(사용자)의 테이블을 사용할 때는 테이블명 앞에 스키마를 표기합니다.

SELECT CUST_NO, CUST_NM FROM MYDB.CUST

다른 스키마(사용자)의 테이블은 권한이 있어야 사용할 수 있습니다. 사용할 수 있는 테이블 목록은 아래처럼 조회할 수 있습니다.

SELECT * FROM ALL_TABLES

SELECT … FROM … WHERE …

SELECT 문에 WHERE 절을 추가하면 조건에 해당하는 레코드만 조회합니다. 가장 기본적이고 많이 사용되는 형식입니다.

WHERE 절에 아래와 같은 조건식을 추가하면 테이블의 전체 데이터 중 고객명(CUST_NM)이 ‘이정원’인 레코드만 조회합니다.

SELECT *
FROM   CUST
WHERE  CUST_NM = '이정원'

논리 연산자

AND

조건식을 여러 개 사용할 수도 있습니다. 이 때는 논리 연산자 AND 나 OR를 이용해서 여러 조건을 사용합니다. 아래는 고객명(CUST_NM)이 ‘이정원’이고 성별이 남자인 데이터를 조회합니다.

SELECT *
FROM   CUST
WHERE  CUST_NM = '이정원'
AND    GENDER = '남'

OR

아래는 고객명이 ‘이정원’ 또는 ‘이서진’ 인 데이터를 조회합니다.

SELECT *
FROM   CUST
WHERE  CUST_NM = '이정원'
OR     CUST_NM = '이서진'

AND 조건과 OR 조건을 섞어 볼까요? 아래는 남자 중에 고객명이 ‘이정원’ 또는 ‘이서진’인 고객을 조회합니다.

SELECT *
FROM   CUST
WHERE  GENDER = '남'
AND  ( CUST_NM = '이정원' OR  CUST_NM = '이서진' )

tipAND 조건과 OR 조건을 함께 사용할 때는 괄호를 이용해서 우선순위를 지정하는 것이 좋습니다. 괄호가 없으면 내부 우선순위를 따르는데 가독성이 좋지 않고 이해가 잘 되지 않습니다.

비교 연산자

오라클 SQL에서 사용하는 비교 연산자는 다음과 같습니다. 연산자 조건을 만족하는 경우 TRUE가 됩니다.

등치 비교 ( = )

조건의 값과 같은 컬럼 데이터를 조회합니다. 위의 예제에서 이미 살펴봤습니다.

부등호 비교 ( >, <, >=, <=, <> )

부등호 양쪽 값의 크기를 비교하는 연산자입니다.

SELECT * FROM CUST WHERE AGE >  20;   -- 나이가 20 보다 크다
SELECT * FROM CUST WHERE AGE >= 20;   -- 나이가 20 보다 크거나 같다
SELECT * FROM CUST WHERE AGE <  20;   -- 나이가 20 보다 작다
SELECT * FROM CUST WHERE AGE <= 20;   -- 나이가 20 보다 작거나 같다
SELECT * FROM CUST WHERE AGE <> 20;   -- 나이가 20이 아니다

범위 비교 ( BETWEEN )

BETWEEN … AND … 형식으로 사용합니다. BETWEEN 연산자는 부등호 연산자 중 <=, >= 2개를 조합한 것과 같습니다. 아래 두 쿼리는 동일한 결과를 조회합니다.

SELECT * FROM CUST WHERE AGE BETWEEN 20 AND 30;

SELECT * FROM CUST WHERE AGE >= 20 AND AGE <= 30;

IN

IN 연산자는 OR 조건식을 간단하게 표현한 것입니다. 아래 두 쿼리는 같은 결과를 조회합니다.

SELECT * FROM CUST WHERE CUST_NM IN ( '이정원', '이서진' );

SELECT * FROM CUST WHERE CUST_NM = '이정원' OR CUST_NM = '이서진' ;

패턴 비교 ( LIKE )

LIKE는 문자열의 일부를 비교합니다. ‘K’로 시작하는 문자열, ‘OR’을 포함하는 문자열, ‘EA’로 끝나는 문자열 등을 찾을 수 있습니다.

와일드 문자는 %(퍼센트)와 _(언더바)가 있습니다.

  • % : 0개 이상의 모든 문자열과 일치
  • _ : 1개의 문자와 일치

아래는 국가명이 ‘K’로 시작하는 레코드를 검색합니다.

SELECT * FROM COUNTRY WHERE NAME LIKE 'K%'

다음은 국가명에 ‘OR’이 포함된 레코드를 조회합니다.

SELECT * FROM COUNTRY WHERE NAME LIKE '%OR%'

다음은 국가명이 ‘EA’로 끝나는 레코드를 조회합니다.

SELECT * FROM COUNTRY WHERE NAME LIKE '%EA'

다음은 국가명이 ‘K’로 시작하는 5글자 데이터를 조회합니다.

SELECT * FROM COUNTRY WHERE NAME LIKE 'K____'

NULL 값 비교 ( IS NULL, IS NOT NULL )

SQL에서는 NULL이라는 특수한 값을 사용합니다. NULL은 정의되어 있지 않은 값을 의미합니다. 아무 것도 없다는 뜻이지요. 테이블 컬럼 값이 NULL인 레코드를 찾기 위해서는 아래와 같이 사용합니다.

SELECT * FROM CUST WHERE TEL_NO IS NULL

다른 문자나 숫자 값 처럼 = 연산자를 이용해서 NULL을 비교할 수 없습니다. 아래 쿼리는 아무것도 조회되지 않습니다.

SELECT * FROM CUST WHERE TEL_NO = NULL

NULL 값의 특징 중 하나는 NULL과의 모든 비교연산, 산술연산의 결과는 NULL 이라는 것입니다. TEL_NO = NULL 라는 비교연산의 결과가 NULL이므로 TRUE를 만족하는 레코드가 없습니다. 그래서 결과가 아무것도 조회되지 않습니다. NULL 비교는 항상 IS NULL, IS NOT NULL 연산자를 사용해야 합니다.

NULL 이 아닌 레코드를 찾는 IS NOT NULL은 아래 처럼 사용합니다.

SELECT * FROM CUST WHERE TEL_NO IS NOT NULL

NULL 비교 연산에 대해 한가지 더 꼭 알아야 하는 것이 있습니다.

오라클에서는 작은따옴표 2개를 연속으로 사용한  표기가 바로 NULL의 또다른 표현이라는 것입니다. 다른 DBMS에서는 이 ” 표기를 빈문자열(Empty String)로 사용하기도 합니다. NULL과 다른 새로운 값 입니다.

오라클에서 아래 두 쿼리는 동일한 의미입니다. 즉, 아무것도 조회되지 않고 조회 결과는 0건입니다.

SELECT * FROM CUST WHERE TEL_NO = NULL;

SELECT * FROM CUST WHERE TEL_NO = '';

그래서, 다른 DBMS를 사용하던 사용자 분들이 많이 실수하는 부분입니다. DBMS를 바꾸면서 기존의 SQL을 그대로 가져온 경우에도 이 부분을 변경하지 않으면 잘못된 결과값을 조회하게 되니 꼭 주의해야합니다.

위로 스크롤