초보 마케터의 처음 만나는 SQL, 개념 정리
SQL 개념 정리
2021-12-16
email 공유
facebook 공유
linkedin 공유

우리는 종종 “온라인 마케팅을 한다.” 라고 우리의 직업을 이야기 하지만, 언제부턴가 온라인 마케팅이라는 말은 셀수없이 많은 종류의 직무와 작업들을 포함하기 시작했다.
특히 “전환”의 중요성이 강조되면서 온라인마케터의 작업은 광고플랫폼의 데이터 분석을 아득히 초월한 데이터베이스 작업의 영역까지 확장되었다.
이 때문에 온라인 마케터를 준비하는 과정에서 회사가 가지고있는 데이터베이스를 이해하고 활용하기 위한 도구로 SQL이 화두로 떠오른지도 오래된 이야기다.
그러나 아직 SQL을 접해본 적이 없는 당신을 위해 아래에 최근 강의를 듣고, 책을 읽으며 정리한 SQL의 기본 개념과 기초 명령어를 남긴다.
나에게 정말 SQL이 필요한 기술인지, 실무에서 활용할 방법이 있을지 고민이라면 천천히 따라가 보면서 생각을 정리할 수 있는 기회가 되었으면 한다.

SQL의 분류
언어의 목적에 따라 3가지로 분류

DML
– 데이터 조작 언어
– select insert update delete 등
– 선택 | 삽입 | 수정 | 삭제
– 해당 테이블의 행에 대하여 적용이됨
– DML을 사용하려면 꼭 “테이블”이 만들어져 있어야 함
– Transaction이 발생하는 SQL도 DML에 포함
DDL
– 데이터 정의언어
– alter view create table, drop table 등
– DB, 테이블, 뷰, 인덱스 등 DB개체를 생성/삭제/변경하는 역할
– Transaction을 일으키지 않음
– Rollback, commit 사용 불가
– DDL문은 실행즉시 SQL에 적용됨
DCL
– 데이터 제어 언어
– 사용자에게 데이터 권한부여, 부여된 권한 취소시 사용
– grant revoke
DB 개요 확인

USE
명령어: USE DB이름
사용할 DB 지정
지정 후 다시 USE문 사용하거나 다른 DB사용을 명시하지 않는 경우,
SQL문은 지정 DB에서 수행됨
Workbench에서 직접 선택하여 사용 가능
Workbench 접속경로
Navigator – Schemas – DB 이름
Show tables
명령어: Show tables
지정한 DB의 테이블들을 확인
이름 값을 보여줌
Show table status
명령어: Show tables
지정한 테이블들의 상태 표시
DB의 구성
DB – table – column(Field) / raw
Describe
명령어: describe 테이블 이름 | DESC 테이블 이름
테이블에 어떤 열이 있는지 확인
DML : 데이터 조작 언어

Select
명령어: Select ~ From
요구하는 데이터를 가져오는 구문
일반적으로 가장 많이 사용
사용 예시
Select 열 이름1, 열 이름 2 from 테이블 이름   테이블의 특정 열 데이터 표시(표시 순서는 열 이름을 입력한 순서)
Select * from 테이블 이름                                    테이블의 전체 데이터 표시
* = “모든 것”을 의미
형식
Select ~ From ~ where ~ Group by ~ having ~ order by ~ ;
; = 쿼리문이 끝남을 표현
Select Distinct 열이름 from 테이블이름                             해당 열에 중복값을 제거하고 출력
+ Select Distinct On (1열) 1열, 2열 From 테이블이름      1열 기준으로 중복제거 출력
Where
조회하는 결과에 특정 조건으로 원하는 데이터만 보고싶은 경우 사용
Select 필드 이름 From 테이블 이름 Where 조건식 ; (텍스트 대소문자 구분)
조건이 없는 경우 테이블의 크기가 클수록 찾는 시간과 노력 증가
조건식
관계 연산자
– OR
– AND
조건연산자 (=, <, >, <>, ! 등)
BETWEEN ~ AND ~
특정 값 사이에 위치하는 데이터를 표시
WHERE “ABC” BETWEEN “A” AND “B”
= WHERE “ABC” >= “A” AND “ABC” <= “B”
IN(~,~,~)
이산 값을 조건으로 사용할 때 사용 (값 사이의 쉼표는 OR 연산으로 작용)
예시) SELECT * FROM city WHERE name IN(‘Seoul’, ‘New York’, ‘Tokyo’)
NOT IN(~,~,~)
IN의 반대. OR연산작용이므로 값들이 모두 제외되기에, [AND 열이름 <> 값] 과 동일.
예시)
SELECT * FROM city WHERE name NOT IN (‘Seoul’, ‘New York’)
= SELECT * FROM city WHERE name <> ‘Seoul’ AND name <> ‘New York’
CAST(열이름 AS 형식)
특정 열의 값들을 특정 형식으로 간주하게 만드는 함수
예시) CAST (Return_Date AS DATE)
Return_Date 열의 값들을 날짜(DATE)로 간주하고 쿼리를 진행
TO_CHAR(열이름, ‘형식’)
CAST와 기본적으로 같은 방식으로 작용
예시) TO_CHAR(PAYMENT_DATE, ‘YYYY-MM-DD’)
LIKE
문자열 검색시 사용
예시) SELECT * FROM city WHERE countrycode LIKE ‘~’
LIKE ‘KO_’  >>> 한 글자만 허용
LIKE ‘K__’   >>> 두 글자만 허용
LIKE ‘KO%’  >>> 무엇이든 허용
SQL 함수 및 연산자 도움말 링크 : https://dev.mysql.com/doc/refman/8.0/en/functions.html
Sub Query
쿼리문 안에 쿼리문이 들어있는 것
쿼리의 결과가 둘 이상이면 에러 발생
예시: 서울이 포함된 국가의 모든 도시를 보고싶을 경우
SELECT *
FROM city
WHERE countrycode = (SELECT countrycode FROM city WHERE name = ‘seoul’);
출력) KOR
ANY(SOME)
서브쿼리의 결과가 여러 개인 경우, 한 가지만 만족해도 표시
= ANY 구문은 IN과 동일
예시: 뉴욕에 있는 동네들(district)의 인구 중 어느 것보다 인구가 많은 행 표시
SELECT *
FROM city
WHERE population
ANY (SELECT population FROM city WHERE district = ‘new york’);
출력) 8008278 | 292648 | 219773 | 196086 | 147306 | 93994
ALL
서브쿼리의 결과가 여러 개인 경우, 모두 만족하는 값을 표시
예시: 뉴욕에 있는 동네들(district)의 인구 중 가장 큰 값보다 인구가 많은 행 표시
SELECT *
FROM city
WHERE population > ANY (SELECT population FROM city WHERE district = ‘new york’);
출력) 8008278 | 292648 | 219773 | 196086 | 147306 | 93994
ORDER BY ~ ASC | DESC
앞서 지정된 행들을 특정 열의 오름차순 | 내림차순으로 정렬
오름차순(ASC)은 default값이라 생략 가능
쉼표를 사용하여 혼합사용 가능
예시:
모든 도시들을 국가코드 오름차순으로,
같은 이름 내에서는 인구가 많은 순으로 보여줘
SELECT *
FROM city
ORDER BY countrycode ASC, population DESC
ALIAS
코드의 가독성 증가 + SQL성능 최적화
열 또는 테이블 앞에 A. B. C. 등 구분을 위한 표시
LIMIT
특정 집합 출력시 출력하는 행의 개수를 한정.
출력값이 너무 많은 경우 사용한다
SELECT * FROM 테이블이름 ORDER BY 열이름 LIMIT 숫자1 OFFSET 숫자2
(숫자1 만큼의 결과값 출력, 숫자2는 출력할 행 번호- 1)
FETCH
특정 집합 출력시 출력하는 행의 개수를 한정.(LIMIT절과 같은 기능)
SELECT * FROM 테이블이름
OFFSET 숫자1 ROWS
FETCH FIRST 숫자2 ROW ONLY;
(숫자2 만큼의 결과값 출력, 숫자1은 출력할 행 번호- 1)
IS NULL / IS NOT NULL
특정 열의 값이 비어있거나 비어있지 않은 행을 찾을 때 사용
* = NULL 은 사용 불가. IS NULL로 작성.
DDL
입력하는 순간 바로 적용

Create table 테이블 이름
Drop table 테이블 이름
조인

두 개 이상의 테이블에 있는 정보 중 사용자가 필요한 집합에 맞게 가상의 테이블처럼 만들어서 결과를 보여주는 것.
INNER 조인
특정 칼럼을 기준으로 정확히 매칭된 집합 출력
OUTER 조인
특정 컬럼을 기준으로 매칭된 집합을 출력하지만 한 쪽의 집합은 모두 출력, 다른 한 쪽의 집합은 매칭되는 컬럼의 값만 출력
SELF 조인
동일 테이블끼리의 특정 컬럼을 기준으로 매칭되는 집합을 출력
FULL OUTER 조인
INNER, LEFT OUTER, RIGHT OUTER 조인 모두 출력
CROSS 조인
CATRISIAN PRODUCT라고도 하며, 조인되는 두 테이블에서 곱집합을 반환
각 그룹의 요소가 모두 한번씩 매칭
NATURAL 조인
특정 테이블의 같은 이름을 가진 컬럼간의 조인집합을 출력
Inner join
A n B : A와 B테이블에 모두 존재하는 한 열의 값들을 기준으로 조인
예시
select
(A테이블의 열 이름1), A.(A테이블의 열 이름2)
, A.(A테이블의 열 이름3), A.(A테이블의 열 이름4)
, B.(B테이블의 열 이름1), B.(B테이블의 열 이름2),
from (A테이블 이름) A
inner join (B테이블 이름) B
on A.(공통되는 열) = B. (공통되는 열);
Outer join
A u B : A 테이블은 모두, B 테이블은 A와 매칭되는 열의 값만 출력
Left(또는 Right) outer join
A / B 테이블 중 기준은 왼쪽 (또는 오른 쪽)
한 쪽 테이블엔 존재하나, 다른 쪽 테이블에는 없는 값들은 null로 출력
예시
select
(A테이블의 열 이름1) as (좌측 열 이름의 새로운 정의)
, A.(A테이블의 열 이름2) as (좌측 열 이름의 새로운 정의)
, B.(B테이블의 열 이름1) as (좌측 열 이름의 새로운 정의)
, B.(B테이블의 열 이름2) as (좌측 열 이름의 새로운 정의)
from (A테이블 이름) A
left (outer 생략) join (B테이블 이름) B
on A.(공통되는 열) = B. (공통되는 열);
Left/Right only
null값을 제외하고 싶은 경우 : where (특정 열) is not null 추가
– 사실상 inner join과 같은 모습
null값만 포함하고 싶은 경우 : where (특정 열) is null 추가
– 두 테이블의교집합을 제외하고 기준테이블만 가지고 있는 값만 출력
Full outer join
두 테이블간 출력 가능한 모든 데이터를 포함한 집합을 출력
(Inner join + left/right outer join)
엑셀에서 lookup함수와 같은 역할
예시1
(A테이블의 열 이름1) (열 이름의 새로운 정의)
, A.(A테이블의 열 이름2) (열 이름의 새로운 정의)
, B.(B테이블의 열 이름1) (열 이름의 새로운 정의)
, B.(B테이블의 열 이름2) (열 이름의 새로운 정의)
from (A테이블 이름) A
full outer join (B테이블 이름) B
on A.(공통되는 열) = B. (공통되는 열);
예시2
A테이블과 B테이블의 교집합을 제외하고, left/right outer join만 출력하는 경우
(서로 다른 테이블의 값은 한 행에서 NULL값으로 표시)
select
(A테이블의 열 이름1) (열 이름의 새로운 정의)
, A.(A테이블의 열 이름2) (열 이름의 새로운 정의)
, B.(B테이블의 열 이름1) (열 이름의 새로운 정의)
, B.(B테이블의 열 이름2) (열 이름의 새로운 정의)
from (A테이블 이름) A
full outer join (B테이블 이름) B
on A.(공통되는 열) = B. (공통되는 열)
where A.(열 이름 1) is null
or B.(열 이름 1) is null;
Cross join
두개의 테이블의 CATESIAN PRODUCT연산의 결과를 출력.
데이터 복제 작업에서 쓰이는 기법
inner/outer 조인과 다르게 on 조건식은 필요가 없음
모든 값이 한번 씩 매칭되기 때문
예시
select *
from (테이블 1)
cross join (테이블 2);
Natural join
두 테이블에서 같은 이름을 가진 컬럼간의 inner join집합의 결과 출력
“같은 이름을 가진 컬럼”이 조인의 대상이 되므로 별도의 on 조건식 사용은 불가
SQL자체가 간소해지는 효과가 있으나, 안정적인 방식은 아님
예시
select *
from (A테이블 이름) A
natural join (B테이블 이름) B

황보현
매니저
당신의 고민을 담당합니다. 퍼포먼스마케터 황보현입니다.
마케팅팀
위픽 마케팅팀의 일에는 한계도, 가이드라인도 없습니다.
황보현의 글 더보기
복잡한 유튜브 광고, 나의 KPI에 딱 맞는 상품은?
성과 추적의 스테디셀러 구글태그매니저(GTM), 어떻게 활용할까?
엑셀 초보를 위한 실무에서 자주 쓰는 엑셀 함수 요약
매거진 더보기
제품 개발자의 자세
지역성장 바우처 신청하기
지역성장 바우처 소개
중소기업 혁신 바우처 신청하기
중소기업 혁신 바우처 소개
수출 바우처 신청하기