🖇 쿼리문 작성과 데이터 필터링
🖇 비교 연산자
🖇 논리 연산자
🖇 산술 연산자
SQL은 단순히 데이터를 조회하는 언어가 아니다.
어떤 데이터를 보여줄 것인가, 어떤 방식으로 분류하고 필터링할 것인가,
어떻게 더 읽기 쉽게 가공할 것인가에 따라 쿼리의 힘은 훨씬 더 커질 수 있다.
이 글에서는 기본적인 SELECT 문에 이어서
조건을 기준으로 데이터를 걸러내고 LIKE,
가독성을 높이기 위한 별칭을 설정하고 Alias,
데이터 정렬 ORDER BY 및 중복을 제거하는 DISTINCT,
조건에 따른 분류 IF, CASE,
타입을 변환하여 활용도를 높이는CAST 등의 SQL 문법들을 정리했다.
다양한 데이터셋에 직접 적용해 보면서 SQL의 기본기를 탄탄하게 다지는 계기가 되길 바란다.
지금부터 다룰 데이터셋은 아래 글에서 소개했으니 참고해도 좋다.
[SQL] 데이터 분석의 시작: SQL로 데이터 다루기
LIKE
조회 조건 값이 명확하지 않을 때 특정 내용을 찾을 수 있다
Wildcard
% : 조건을 포함하는 모든 문자를 의미 (0개 이상의 문자)_ : 한 글자를 의미_의 개수에 따라 뒤에 오는 문자열의 개수를 정할 수 있다to_라고 지정하면 tom은 추출되지만 tomi는 추출되지 않음-- hr이 0이고, weekday에 'ur'이란 단어가 들어간 데이터 추출하기
SELECT *
FROM bike
WHERE hr = 0
AND weekday LIKE '%ur%'
-- hr이 0이고, weathersit이 'Cl'로 시작하는 데이터 추출하기
SELECT *
FROM bike
WHERE hr = 0
AND weathersit LIKE 'Cl%'
-- hr이 0이고, mnth이 'ma?'인 데이터 추출하기
SELECT *
FROM bike
WHERE hr = 0
AND mnth LIKE 'ma_'
-- hr이 0이고, mnth이 'ma?'이며 weekday에 'ur'이란 단어가 들어간 데이터를 추출하기
SELECT *
FROM bike
WHERE hr = 0
AND mnth LIKE 'ma_'
AND weekday LIKE '%ur%'
임시로 컬럼명을 변경할 때 별칭을 사용할 수 있다
💡 별칭은 왜 필요할까?
긴 컬럼명을 간결하게 표현할 수 있고,
계산식이나 CASE 문 등에서 생성한 가상 컬럼에 이름을 붙일 수 있어 가독성이 좋아진다.
특히 JOIN이나 서브쿼리에서 테이블 이름을 줄여 쿼리를 간결하게 만들 때 필수적이다.
SELECT, FROM절에서 사용AS를 작성 (생략 가능)-- temp와 hum를 추출하고 hum에 'humidity'란 별칭 주기
SELECT temp,
hum AS 'humidity'
FROM bike
LIMIT 5
-- bike 테이블 이름을 'b'로 지정하고, b 테이블의 temp와 hum를 추출하기
-- . 생략 가능
SELECT b.temp,
b.hum AS 'humidity'
FROM bike AS b
LIMIT 5
ORDER BY
오름차순, 내림차순으로 정렬된 형태의 데이터가 필요할 때가 있다
# 작성 순서 SELECT FROM WHERE ORDER BY LIMIT
-- 오름차순
-- ASC 생략 가능
ORDER BY 컬럼명 (ASC)
-- 내림차순
ORDER BY 컬럼명 DESC
-- 컬럼명 대신 지정한 컬럼 순서를 입력하는 것도 가능
-- SELECT에 작성한 첫번째 컬럼 기준으로 내림차순으로 정렬하고, 같은 값이 있다면 두번째 컬럼 기준으로 정렬
ORDER BY 1 DESC, 2
-- dteday, temp, cnt 컬럼을 추출하고, cnt가 높은 순서대로 100개만 정렬하고 순서가 같은 것이 있다면 temp가 낮은 순서대로 정렬
SELECT dteday,
temp,
cnt
FROM bike
ORDER BY cnt DESC, temp
LIMIT 100
-- 컬럼 순서로 정렬
SELECT dteday,
temp,
cnt
FROM bike
ORDER BY 3 DESC, 2
LIMIT 100
DISTINCT
선택한 모든 컬럼을 고려하여 중복을 제거한다
DISTINCT 사용 가능COUNT, SUM, AVG, MAX, MIN-- weekday, weathersit 컬럼에서 중복 제거하기
-- -> weekday와 weathersit 컬럼이 동일한 행은 하나만 남기고 제거된다
SELECT DISTINCT weekday, weathersit
FROM bike
-- yr, weekday, weathersit 컬럼에서 중복 제거하기
SELECT DISTINCT yr, weekday, weathersit
FROM bike
IF(조건, 참일 때 반환 값, 거짓일 때 반환 값)
단일 조건문
엑셀의 IF 함수와 동일한 역할
SELECT, WHERE 절에서 사용 가능IF 내에 조건을 줄 때 함수와 함께 사용 가능if함수를 iif로 표현-- customerName 테이블에서 1990년 이전과 이후에 태어난 고객을 분리하기
-- 데이터를 이해하기 쉽게 '고객명', '생년월일', '1990년 기준'이라는 별칭을 사용
SELECT customerName AS "고객명",
birthday AS "생년월일",
iif(birthday >= '1990-01-01' , '이후', '이전') AS "1990년 기준"
FROM customers
CASE WHEN ~ THEN
다중 조건문
조건에 따른 값을 다르게 출력하고 싶은 경우 사용
작성 순서
CASE WHEN '조건1' THEN '조건1 반환값' WHEN '조건2' THEN '조건2 반환값' ELSE '만족하는 조건이 없을 때 반환 값' END
WHEN 의 조건을 순차적으로 체크하고 조건이 충족되면 THEN 에 명시된 값을 반환WHEN 과 THEN 은 한 쌍으로 존재
WHEN과 THEN 은 여러 개가 존재할 수 있다
ELSE 는 앞의 조건들에 모두 해당하지 않았을 때 정해줄 기본 값
ELSE가 없고 조건에 맞는 값이 없으면 NULL값을 반환
Tip) CASE WHEN, THEN, END를 먼저 작성한 후에 조건을 적으면 문법 실수를 줄일 수 있다
-- 고객 한도를 5만원, 십만원 단위로 분리하기
SELECT customerName,
creditLimit,
CASE WHEN creditLimit <= 50000 THEN '5만원이하'
WHEN creditLimit <= 100000 THEN '10만원이하'
ELSE '10만원초과'
END AS '고객한도분리'
FROM customers

-> 출력 셸에서만 컬럼이 생성되어 보이는 거지,
Alias와 마찬가지로 실제 결과에는 영향을 주지 않는다 (물리적 변경 X)
CAST
데이터의 타입을 변환하는 함수
CAST(컬럼 AS 변환할 타입)
-- 예시
SELECT CAST(14.58 AS int) -- [결과] 14
-- 데이터 bike의 정보 확인하기
bike.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17379 entries, 0 to 17378
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 dteday 17379 non-null object
1 season 17379 non-null object
2 yr 17379 non-null int64
3 mnth 17379 non-null object
4 hr 17379 non-null int64
5 holiday 17379 non-null int64
6 weekday 17379 non-null object
7 workingday 17379 non-null int64
8 weathersit 17378 non-null object
9 temp 17379 non-null float64
10 atemp 17379 non-null float64
11 hum 17379 non-null float64
12 windspeed 17379 non-null float64
13 casual 17379 non-null int64
14 registered 17379 non-null int64
15 cnt 17379 non-null int64
dtypes: float64(4), int64(7), object(5)
memory usage: 2.1+ MB
=> 현재 yr은 int 타입임을 알 수 있다
-- 2011년 데이터 5개 추출하기
SELECT *
FROM bike
WHERE yr = 2011
LIMIT 5
-- yr을 문자열타입으로 변환한 후, 2011년 데이터 5개 추출하기
SELECT CAST(yr AS varchar) AS yr
FROM bike
-- 문자로 변경된 상태이기 때문에,
-- 문자열로 조건을 주는 것처럼 변경해서 사용해야 한다
WHERE CAST(yr AS varchar) = '2011'
LIMIT 5
[참고] 보통 해당 타입을 지정하지 않으면 에러가 나지만
데이터베이스 시스템에 따라 타입에 상관 없이 데이터를 추출할 수 있다