본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (3) WHERE, 비교연산자, 논리연산자, LIKE, BETWEEN, IN, IS NULL, IS NOT NULL

by 모닥불🔥 2024. 3. 3.

내가 이 글에서 설명하고 정리한 모든 내용은 요 강의에 있는 내용을 기반으로 함! 강의는 메타코드에서 구매 가능: https://mcode.co.kr/kor/ 


🔥 WHERE문

 

WHERE문을 쓰는 순서는 다음과 같다. 순서대로 안 쓰면 오류가 나니까 순서는 꼭 외워둘 것!

SELECT 컬럼명
FROM 테이블명
WHERE 조건문;

 

WHERE구문 안에는 '조건'이 들어가는데, 비교연산자와 논리연산자를 쓸 수 있다.


🔥 비교연산자(=, >, <)

WHERE orderlinenumber = 1 조건을 보자. 그냥 주문라인번호가 1과 같은 조건을 말한다. 해석하기 어렵지 않음!

'문자열'과 '=' 연산자를 사용할 수도 있다. 문자열을 쓸 때에는 따옴표 꼭 쓰기! 위 코드 결과로, productCode가 s24_3969인 데이터가 모두 조회되었다.

부등호를 사용해서 비교하기도 한다. 그런데 여기서 유의할 점은 '<=' 는 작거나 같다고 읽는다. '>=' 는 크거나 같다고 읽는다는 것이다. 왼쪽 컬럼을 기준으로 말하면 쉽다. 또한, >= 나 <=는 사용하지만 =< 나 => 처럼 부등호보다 등호가 먼저 오는 방식으로는 사용하지 않는다.

 

문제1. customers 테이블에서 creditLimit이 10000보다 큰 고객들의 이름(customerName)을 조회하세요.

일단 customers 테이블에서 customerName 컬럼을 조회하는 거니까, 이전에 배운대로 써보자.

SELECT customerName
FROM customers;

 

그런 다음, creditLimit이 10000(만)보다 크다. 라는 조건을 WHERE문으로 써주면 끝!

SELECT customerName
FROM customers
WHERE creditLimit > 10000;

🔥 논리연산자(AND, OR, NOT)

조건을 여러 개 쓰고 싶을 땐 어떻게 하면 될까? WHERE 조건문 뒤에 AND나 OR같은 논리연산자를 붙이고 또 다른 조건을 써주면 된다. WHERE 조건 AND 조건 OR 조건 NOT 조건 뭐 이런 식으로 쭉쭉 붙을 수 있다.

SELECT *
FROM orderdetails
WHERE priceEach = 35.29
AND productcode = 's24_3969'
OR quantityordered = 46;

 

그런데 논리 연산자에는 연산 순서라는 것이 있다. 우리가 사칙연산을 할 때에 1+2x3 = 곱하기와 나누기를 먼저 계산하고 덧셈 뺄셈을 계산하는 것처럼 말이다. 논리연산자의 연산은 NOT - AND - OR 순으로 이루어진다.

 

그러면, OR을 먼저 계산하고 싶을 땐 어떻게 하면 좋을까? 사칙연산에서 1+2x3 = 에서 덧셈을 먼저 계산하려면 소괄호로 묶어주면 되는 것처럼 (1+2) x 3 = 논리연산자의 연산 순서를 정하는 것도 먼저 연산되길 바라는 부분을 소괄호로 묶어주면 된다.

위 쿼리를 보면 OR 조건을 괄호로 묶어서 먼저 실행한 것을 볼 수 있다. 괄호를 어떻게 묶느냐에 따라 결과가 달라진다.

 

문제 4. products 테이블에서 제품의 가격(buyPrice)이 50보다 크고 재고(quantityInStock)가 100보다 작은 제품의 productName을 조회하세요. 

50보다 크고, 100보다 작다는 조건은 동시에 만족해야 하는 AND 조건에 해당하므로 아래와 같이 쿼리를 작성하면 된다.

SELECT productName
FROM products
WHERE buyPrice > 50 
AND quantityInStock < 100;

🔥LIKE

 

영어에서 LIKE가 '~와 같은'으로 쓰이듯이 쿼리에서도 마찬가지로 뭔가 이런 식으로 생긴 것을 조회해줘! 라는 의미로 사용된다. WHERE 구문에 사용하고 LIKE 'CARS%' , LIKE '%CARS' , LIKE '%CARS%' 와 같이 사용한다.

% 부분에는 어떤 특수기호가 들어가든 상관 없다.

# LIKE '%문자열': 문자열로 끝나는 행 조회
SELECT *
FROM products
WHERE productline LIKE '%CARS';

 

앞에 어떤 문자열이 있든, 마지막에 CARS로 끝나는 모든 데이터를 조회한다.

 

# LIKE '문자열%': 문자열로 시작되는 행 조회
SELECT *
FROM products
WHERE productline LIKE 'CARS%';

 

뒤에 어떤 문자열이 오든, CARS로 시작하는 모든 데이터를 조회한다.

# LIKE '%문자열%': 앞뒤에 어떤 문자가 오든, 특정 문자열이 포함된 행 조회
SELECT *
FROM products
WHERE productline LIKE '%CARS%';

 

앞, 뒤에 어떤 문자가 있든 상관없이, CARS가 포함된 데이터를 조회한다. 일반적으로 양 옆에 %가 붙은 형태를 가장 많이 사용한다.

 

문제 5. employees 테이블에서 jobTitle에 'Sales'라는 단어가 포함된 직원의 firstName과 lastName을 조회하세요.

아래와 같이 적을 수 있다.

SELECT firstName, lastName
FROM employees
WHERE jobTitle LIKE '%Sales%';

🔥 BETWEEN A AND B

 

BETWEEN A AND B 함수는 A 이상, B 이하인 데이터를 출력한다. 이상과 이하임에 유의하자.

# 구매일자가 2023년 1월인 데이터 모두 조회

SELECT *
FROM orders
WHERE orderdates
BETWEEN '2003-01-01' AND '2003-01-31';

 

BETWEEN은 아래와 같이 풀어서 사용할 수 있지만 코드의 간결성을 위해 BETWEEN을 사용한다.

# BETWEEN 없이 표현하자면 A 이상이면서 B 이하인 데이터를 조회한다.

SELECT *
FROM orders
WHERE orderdates >= '2003-01-01' AND orderdates <= '2003-01-31';

 

NOT BETWEEN A AND B

A이상 B이하를 제외한 모든 데이터를 출력한다. 즉, A미만 B초과인 데이터를 출력한다.

SELECT *
FROM orders
WHERE orderdate NOT BETWEEN '2003-01-01' AND '2003-01-31';

# NOT BETWEEN은 A 미만, B 초과로 풀어쓸 수 있다.
SELECT *
FROM orders
WHERE orderdate < '2003-01-01' AND orderdate > '2003-01-31';

🔥 IN

IN은 특정 값이 있는 경우를 조회한다. WHERE column1 IN (10, 20, 30)이라고 쓰면 column1에서 10, 20, 30에 해당하는 데이터를 조회한다. OR로 풀어쓸 수 있다.

SELECT *
FROM orders
WHERE orderdate IN ('2003-02-11', '2003-02-17');

# IN은 OR로 풀어쓸 수 있다.
SELECT *
FROM orders
WHERE orderdate = '2003-02-11' OR orderdate = '2003-02-17';

 

NOT IN은,

특정 값들을 제외한 데이터를 조회한다.

SELECT *
FROM employees
WHERE officecode NOT IN (1, 2, 3);

# NOT IN은 AND로 풀어쓸 수 있다.
SELECT *
FROM employees
WHERE officecode <> 1 AND officecode <> 2 AND officecode <> 3;

 

두 코드는 같은 결과를 출력한다.

 

문제 7. customers 테이블에서 국가(country)가 'USA', 'Canada', 'France' 중 하나인 고객의 customerName을 조회하세요.

# IN을 사용한 풀이

SELECT customerName
FROM customers
WHERE country IN('USA', 'Canada', 'France');

🔥 IS NULL / IS NOT NULL

SQLD 시험에 어마어마하게 자주 등장하는 개념, IS NULL과 IS NOT NULL이다.

NULL은 값의 부재(빈칸) 또는 알 수 없는 값을 의미한다. 값이 NULL인지 아닌지 조회하는 경우에는 무조건 IS NULL, IS NOT NULL을 사용해야 한다. 문제에서 컬럼명 = NULL 혹은 컬럼명 <> NULL 이런 식으로 표현되어 있으면 전부 틀린 구문이라고 보면 된다.

 

문제 8. employees 테이블에서 상사(reportsTo)가 지정되지 않은 직원의 firstName, lastName을 조회하세요.

SELECT firstName, lastName
FROM employees
WHERE reportsTo IS NULL;

오늘은 여기까지! 다음에는 order by 구문과 group by 구문을 정리할 예정이다. SQL 부트캠프 도움을 정말 많이 받아서 꼼꼼하게 정리를 해두고 싶은 마음이다. :)