마케터를 위한 SQL : WHERE 절을 통한 조건부 쿼리 (연산자)

Sean Lee·2022년 9월 8일
0

마케터를 위한 SQL

목록 보기
5/7
post-thumbnail

조건부 쿼리

이전 글에서 테이블의 전체 컬럼 혹은 일부 컬럼을 SELECT와 FROM을 활용해서 검색하는 방법에 대해 알아보았습니다. 여기서 한단계 더 발전해서 필터(Filter)가 적용된 데이터 즉, 조건에 맞는 일부의 레코드만 선택하는 WHERE절을 추가하는 방법을 알아보도록 하겠습니다.

조건에 맞는 데이터를 조회한다는 측면에서 상세 검색을 떠올리면 이해하기 쉽습니다. 아래 이미지에서는 일자에 대해 기간 조건을 부여했습니다. 2013년 1월 1일부터 2014년 9월 30일 사이에 추가된 대상을 조회한다는 필터조건이 적용되어 있습니다.

SQL의 WHERE 키워드를 활용한 구문의 기능이 위와같은 기능을 제공합니다. WHERE절 안에는 어떤 컬럼의 값이 특정 문자열을 포함하거나 일치하는 조건을 명시하거나, 특정 수치보다 크거나 같거나 작거나 등의 조건을 명시할 수 있습니다. 또한 위의 예제처럼 일정 기간 내에 발생한 이벤트 (회원가입, 구매 등)를 확인하기 위한 필터조건을 적용할 수 있습니다.

SELECT FROM 구문의 쿼리가 N x M 결과 테이블의 큰 윤곽을 그린다면, WHERE절은 윤곽이 그려진 테이블을 목적에 맞도록 어떻게 세밀하게 필터링 할 것인지를 명시합니다. 따라서 WHERE 절 안에는 다양한 연산자를 활용할 수 있습니다. 논리 연산자나 비교 연산자의 다양한 기호와 기능에 대해서도 이번에 함께 다뤄볼 예정입니다.


SQL 연습에 사용될 참조 테이블 목록

users 테이블 (가짜 데이터)

order 테이블 (가짜 데이터)

product 테이블 (가짜 데이터)



1. 비교 연산자

비교연산자는 값을 가진 두 대상 사이의 상대적인 크기를 판단합니다. 상대적인 크기를 비교연산자의 수식이 올바르게 표현한 경우, 참을 나타내며 그 반대의 경우, 거짓을 나타내게 됩니다. 아래 표에서 연산자 기호화 그에 따른 설명을 확인할 수 있습니다. 주로 조건부인 WHERE절 안에서 값의 크기를 비교할 때 사용됩니다.

1-1. 비교 연산자 : 수치비교

-- 판매가격(sale_price)이 40,000원 이상인 상품명 목록
SELECT product_name 
FROM products 
WHERE sale_price >= 40000;
-- 현재 할인율(marketing_ratio)이 5%인 상품명 목록
SELECT product_name
FROM products
WHERE marketing_ratio = 5;

1-2. 비교 연산자 : 문자비교

-- 구글 소셜로그인(social_login)으로 가입한 고객명 목록
SELECT name
FROM users
WHERE social_login = 'google';

1-3. 비교 연산자 : 날짜비교

-- 어제 발생된 매출 목록 전체
SELECT *
FROM orders
WHERE DATE(created_at) = (NOW() - INTERVAL 1 DAY);
-- 최근 3달 이내에 가입한 고객의 이름과 이메일 주소 목록
SELECT name, email
FROM users
WHERE DATE(created_at) >= (NOW() - INTERVAL 3 MONTH);


2. 논리 연산자

논리 연산자는 주어진 조건의 진위(참 혹은 거짓) 여부를 테스트합니다.

ANY

-- 주문시 '경기도'로 배송지를 설정한 고객의 이름과 이메일 목록
SELECT name, email 
FROM users
WHERE user_id = ANY(
		SELECT DISTINCT user_id 
	    FROM orders 
    	WHERE order_city='경기도'
    );

Between

문자, 숫자, 날짜 적용 가능

-- 이메일의 시작이 c와 e사이의 알파벳으로 시작하는 고객의 이름과 이메일 목록
SELECT name, email
FROM users
WHERE email BETWEEN 'c' AND 'e';
-- 판매 금액이 3,000 원과 10,000 원 사이의 상품명 목록
-- 숫자형의 BETWEEN에서 두 양끝의 수치는 범위에 포함됨 (이상, 이하)
SELECT product_name
FROM products
WHERE sale_price BETWEEN 3000 AND 10000
-- 어제와 오늘을 제외한 지난 7일간의 구매 정보 목록
SELECT *
FROM orders
WHERE DATE(created_at) 
    	BETWEEN (NOW() - INTERVAL 7 DAY) AND (NOW() - INTERVAL 2 DAY);

IN

-- 지난달 구매 완료된 주문건 중 배송 지역이 서울, 경기, 인천인 주문건에 대한 결제 금액 및 결제일 정보

SELECT order_price, created_at
FROM orders
WHERE
	order_status = 'complete'
    AND DATE_FORMAT(created_at, '%Y-%m') = date_format(DATE_SUB(NOW(), INTERVAL 1 month),'%Y-%m')
	AND order_city IN ('서울특별시', '경기도', '인천광역시')
-- 카드정보가 등록된 고객의 이름과 이메일 주소 목록
SELECT name, email
FROM users
WHERE user_id IN (SELECT user_id FROM billing WHERE credit_card_status=TRUE);

LIKE

정확한 값이 아닌 유사한 값을 일치시킬 수 있는 연산자

  • LIKE 연산자 안에에서 와일드카드(%)를 사용가능

와일드카드(%)를 패턴 앞에 표시하는 경우

-- email이 '@gmail.com'으로 끝나는 고객 목록
SELECT * FROM users
WHERE email LIKE '%@gmail.com'

-- email이 '@naver.com'으로 끝나는 고객 목록
SELECT * FROM users
WHERE email LIKE '%@naver.com'

와일드카드(%)를 패턴 뒤에 표시하는 경우

-- 이씨성을 가진 고객 목록 조회
SELECT * FROM users
WHERE name LIKE '이%'

-- zero로 시작하는 이메일을 가진 고객 목록
SELECT * FROM users
WHERE email LIKE 'zero%'

와일드카드를(%)를 패턴 중간에 표시하는 경우

-- 이씨성을 가졌으며, 이름이 진으로 끝나는 고객 목록 조회
SELECT * FROM users
WHERE name LIKE '이%진'

-- zero로 시작하며 도메인이 구글인 이메일을 가진 고객 목록
SELECT * FROM users
WHERE email LIKE 'zero%@email.com'
LIKE 연산자설명
WHERE Column LIKE 'a%'a로 시작하는 문자열
WHERE Column LIKE '%a'a로 끝나는 문자열
WHERE Column LIKE '%and%'and가 포함된 문자열
WHERE Column LIKE 'a%c''a'로 시작해서 'c'로 끝나는 문자열

그밖에도 다양한 종류의 와일드카드를 사용할 수 있습니다.
더 많은 종류의 와일드카드 참고 : https://www.w3schools.com/mysql/mysql_wildcards.asp


AND & OR


AND와 OR연산은 밴다이어그램을 활용하면 쉽게 이해할 수 있습니다.

AND

A AND B 조건을 위에 이미지에서 보면, 두 그룹이 교차하는 영역에 해당합니다. 아래의 예제 쿼리에서는 A조건 (소셜로그인이 페이스북, social_login = 'facebook')과 B조건 (회원 등급이 VIP, user_class = 'VIP')이 동시에 만족하는 항목들을 쿼리 결과로 반환하게 됩니다.

-- 페이스북 소셜 로그인으로 가입했으며, 회원등급이 VIP인 고객의 이름과 이메일 주소 목록
-- 2개의 조건 (소셜 로그인, 회원등급)이 모두 만족하는 경우의 레코드만 반환
SELECT name, email
FROM users
WHERE 
	social_login = 'facebook'
    AND user_class = 'VIP';

OR

A OR B 조건은 A에 부합하는 데이터와 B에 부합하는 데이터 모두를 반환하게 됩니다. 아래 예제에서

-- 회원 중에서 이메일 도메인이 google과 hotmail 인 고객의 이름과 이메일 주소 목록
SELECT name, email
FROM users
WHERE 
	(email LIKE '%hotmail.com') OR (email LIKE '%@gmail.com');

정리

이번 블로그에서는 WHERE절을 통해 조건부 필터를 적용하는 방법에 대해 알아보았습니다.
WHERE절 작성시 많이 사용되는 중요한 연산자 2가지가 있습니다.

1. 비교 연산자 (Comparison Operation)

  • =,<,>,>=,<=,<>과 같이 등호와 부등호를 통해 두 값의 상대적인 크기를 판단

2. 논리 연산자 (Logical Operation)

  • AND, OR, LIKE, IN, NOT 등 다양한 연산자를 통해 참, 거짓을 판별하여 참인 값에 대한 필터를 진행

감사합니다.

profile
배우기만 하고 생각하지 않으면 얻는 것이 없고, 생각만 하고 배우지 않으면 위태롭다.

0개의 댓글