본문 바로가기
카테고리 없음

05 day. AND, OR, IN, NOT IN

by jessforever 2020. 9. 21.

05 day. 논리연산자를 활용한 데이터 조건 주기

 

논리연산자를 이용해 WHERE 조건절에 두 개 이상의 조건을 주는 방법을 배우다

 

AND 연산자: 조건을 모두 만족하는 데이터만 출력. 교집합

OR 연산자: 여러 조건들 중 적어도 하나만 충족해도 자료를 추출하고 싶을 때. 합집합

IN 연산자: OR 연산자가 여러개인 경우

 

연산자 우선순위: AND > OR

 

 

SELECT 열이름1, 열이름2 FROM 테이블명 WHERE 조건절1 AND 조건절2 ;

 

BRNCH_INFO 테이블의 기본기(PRIMARY KEY)는 BRNCH_NO 이다

 

예제1) BRNCH_INFO 테이블을 사용하여 직원 수가 10명 이상이고 경영평가가 'C'인 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 나타내보자 (조건이 두개)

SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF

FROM BRNCH_INFO

WHERE BRNCH_NUM >= 10 AND BRNCH_PERF = 'C' ;

 

예제2) BRNCH_INFO 테이블을 사용하여 직원 수가 10명 이상이고 경영평가가 'C'이면서 영업점이 폐쇄된 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 나타내보자 (조건이 두개 이상)

SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF

FROM BRNCH_INFO

WHERE BRNCH_NUM >= 10 AND BRNCH_PERF = 'C' AND CLOSE_DT IS NOT NULL ;

 

 

SELECT 열이름1, 열이름2 FROM 테이블명 WHERE 조건절1 OR 조건절2 ;

 

예제3) BRNCH_INFO 테이블을 사용하여 직원 수가 10명 이상이거나 경영평가가 'A'인 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 나타내보자 (조건이 두개)

SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF

FROM BRNCH_INFO

WHERE BRNCH_NUM >= 10 OR BRNCH_PERF = 'A' ;

 

예제4) BRNCH_INFO 테이블을 사용하여 직원 수가 8명이거나 경영평가가 'A'이거나 영업점이 폐쇄된 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 나타내보자 (조건이 두개 이상)

SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF

FROM BRNCH_INFO

WHERE BRNCH_NUM = 8 OR BRNCH_PERF = 'A' OR CLOSE_DT IS NOT NULL ;

 

 

우선순위

1순위: AND

2순위: OR

AND 보다 OR 연산자를 먼저 처리하고 싶다면 해당 연산을 괄호로 묶어주면 됨. 

 

 

 

IN 연산자: 여러 조건들 중 적어도 하나만 만족해도 출력함. 즉, 여러개의 OR 연산자를 하나로 묶은 것. 

IN 연산자는 OR 연산자보다 처리속도가 빠르다. 데이터가 방대할 때 좀 더 빠르게 실행할 수 있다. 

IN 연산자 안에 다른 SELECT 문장을 사용할 수 있다(하위 쿼리)

NOT IN 연산자: 해당하는 조건들 외의 모든 것

 

 

SELECT 열이름 FROM 테이블명 WHERE 비교할 열이름 IN (조건1, 조건2) ;

SELECT 열이름 FROM 테이블명 WHERE 비교할 열이름 NOT IN (조건1, 조건2) ;

 

만약 BRNCH_INFO 테이블에서 영업점 번호가 789, 640인 영업점 정보를 알고 싶다면 조건절을 다음과 같은 2가지 방법으로 줄 수 있다

첫번째 방법) WHERE BRNCH_NO = '789' OR BRNCH_NO = '640' ;

두번째 방법) WHERE BRNCH_NO IN ('789', '640') ;

 

예제) BRNCH_INFO 테이블을 사용하여 직원수가 10명 또는 8명이면서 경영평가가 'A' 또는 'B'인 영업점 번호, 영업점 이름, 영업점 인원, 경영평가를 나타내보자 (IN 연산자 사용하기)

SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF

FROM BRNCH_INFO

WHERE BRUNCH_NUM IN (10, 8) AND BRNCH_PERF IN ('A', 'B') ;

 

영업점 경영평가 점수가 A 또는 B가 아닌 모든 영업점을 나타내고 싶을 때

첫번째 방법) WHERE BRNCH_PERF <> 'A' AND BRNCH_PERF ^= 'B' ;

두번째 방법) WHERE BRNCH_PERF NOT IN ('A', 'B') ;

 

예제) BRNCH_INFO 테이블을 사용하여 폐쇄되었거나 2000년도 이전에 신설한 영업점 중 경영평가가 'A'가 아닌 영업점의 영업점 번호, 영업점 이름, 영업점 신설일, 영업점 폐쇄일, 경영평가를 나타내보자 (NOT IN 연산자 사용하기)

SELECT BRNCH_NO, BRNCH_NM, OPEN_DT, CLOSE_DT, BRNCH_PERF

FROM BRNCH_INFO

WHERE (CLOSE_DT IS NOT NULL OR OPEN_DT < '20000101') AND BRNCH_PERF NOT IN ('A') ;

 

 

PERF_MAST_201312 테이블의 기본 키(PRIMARY KEY)는 CMF이다

예제) 김대리, 소매 기반 사업을 하다보면 비활성화 고객(Inactive customer)을 예측하고 활성화 고객(Active customer)을 증대시키는 일은 매우 중요해. PERF_MAST_201312는 직전 3개월 동안의 카드사용금액을 알려주는 테이블이야. 비활성화 고객은 직전 3개월 연속 카드사용금액이 1만원 이하인 고객을 의미한다고 할 때, 이 테이블을 통해서 비활성화 고객을 찾아 볼래?

SELECT *

FROM PERF_MAST_201312

WHERE COALESCE(TOTAL_AMT_1, 0) <= 10000 AND COALESCE(TOT_AMT_2, 0) <= 10000 AND COALESCE(TOT_AMT_3, 0) <= 10000 ;

 

*COALESCE 함수를 이용해서 NULL 값을 0으로 치환함 (DAY 04 내용 참고)

 

 

예제) 만약 PB 고객이면서 비활성화 고객에게 일정 금액 이상 사용하면 상품권을 지급하는 활성화 캠페인(Activation Campaign)을 진행하려고 한다면 어떤 고객이 그 대상이 될 수 있을까?

SELECT *

FROM PERF_MAST_201312

WHERE SEG IN ('PB') AND COALESCE(TOTAL_AMT_1, 0) <= 10000 AND COALESCE(TOT_AMT_2, 0) <= 10000 AND COALESCE(TOT_AMT_3, 0) <= 10000 ;

 

예제) 직전 3개월 동안 카드사용금액이 계속 줄어드는 고객 중 직전 3개월 총 사용금액이 7천원 이상인 고객은 비활성화될 가능성이 높으면서 활성화 캠페인에 대한 반응률(Response rate)도 높은 고객군이라고 하자. 어떤 고객이 그 대상이 될까?

SELECT *

FROM PERF_MAST_201312

WHERE COALESCE(TOTAL_AMT_1, 0) < COALESCE(TOTAL_AMT_2, 0) < COALESCE(TOTAL_AMT_3, 0)

AND COALESCE(TOTAL_AMT_1, 0) + COALESCE(TOTAL_AMT_2, 0) + COALESCE(TOTAL_AMT_3, 0) >= 7000 ; 

댓글