Search

SQL 심화편

목차

  개요

1주차에 아래의 내용을 배웠었는데요! 잠깐 복습하고 넘어가보면,
SQL이란?
Structured Query Language의 약자로, 구조화된 질의어라는 뜻!
RDBMS에서 공통으로 사용되는 약속된 언어 (엑셀의 함수와 비슷)
RDBMS란?
DBMS = Database Management System
RDBMS = Relational DBMS
여러 테이블에서 데이터를 참조하여 연결한다는 의미
종류 mysql / oracle 등
그래서 오늘은 여러 테이블을 결합하여 데이터를 추출하는 법, JOIN에 대해 배워볼 거예요.
예시 김상지 라는 유저의 주문 금액을 추적하고 싶다면?
테이블1) users
user_id
user_name
user_phone
1
김소명
010-9339-9759
2
김망키
010-1239-5678
3
김상지
010-2323-3333
4
김샐리
010-2939-9382
테이블2) orders
order_number
user_id
order_price
3230
4
5,000
3231
2
50,100
3232
1
8,000
3233
3
89,000
⇒ 이때, 우리는 users 테이블과 orders 테이블을 결합해서 데이터를 추출하게 되고, 이를 JOIN 이라고 불러요.

  JOIN에 필요한 구성요소

테이블의 관계는 기본적으로 Key 값으로 정의되어요
Primary Key = PK = 기본키
Foreign Key = FK = 외래키

  JOIN의 종류

LEFT (OUTER) JOIN = 좌우 테이블에서 일치하는 행과 좌측 나머지 모든 행(레코드) 출력
RIGHT (OUTER) JOIN = = 좌우 테이블에서 일치하는 행과 우측 나머지 모든 행(레코드) 출력
INNER JOIN = 좌우 테이블에서 일치하는 행(레코드)만 출력
예시 LEFT JOIN을 제일 자주 쓰게 돼요. 대표적인 레프트 조인의 예시를 살펴볼게요.

  JOIN문의 규칙

1) JOIN의 종류를 기재 (LEFT / RIGHT / INNER JOIN)
2) ON 을 통해 키값을 정의
3) 모든 속성에 별칭을 설정
예시 결제 정보가 없는 회원의 이름과 이메일을 추출해 봅시다.
결제정보 = billing 테이블
회원정보(이름/이메일) = users 테이블
HINT : users 테이블을 기준으로 billing 테이블을 LEFT JOIN 하는 쿼리를 먼저 작성해 봅시다. 여기서 우리는 회원의 이름과 이메일을 추출하게 됩니다.
SELECT US.name, US.email FROM users US LEFT JOIN billing BL ON US.user_id = BL.user_id WHERE BL.user_id IS NULL
JavaScript
복사
예제1 회원(user) 테이블을 기준으로 결제(billing) 테이블을 LEFT JOIN 하여 유저의 이름과 카드 일련번호를 추출해 보세요.
예제2 가입 후 구매 이력이 0건인 고객 의 수를 구해봅시다.
가입시점 = users
구매이력 = orders
키값 = user_id

  서브쿼리

쿼리문 안에 쿼리를 배치시키는 방법이에요. 이때, 서브쿼리는 SELECT / FROM / WHERE / JOIN 절에서 사용할 수 있어요.
예시 특정 고객의 제한된 정보(이름과 이메일주소)만 알고 있을 때, 이 사람의 구매기록을 조회하고 싶다면?
SELECT * FROM orders WHERE user_id = (SELECT user_id FROM users WHERE name = '하주원' AND email = 'nseo@naver.com')
JavaScript
복사
users = 유저아이디 / 유저의 이름 / 이메일 주소 / 핸드폰번호 등등 / 구매기록은 알 수 없어
orders = 구매아이디 / 유저아이디 / 금액 / 등등 / 이름/이메일주소는없어
참고 여기저 의문이 하나 들 거예요. 이거 조인으로도 구할 수 있는 거 아니에요?
SELECT * FROM orders OD LEFT JOIN users US ON OD.user_id = US.user_id WHERE US.name = '하주원' AND US.email = 'nseo@naver.com'
JavaScript
복사
데이터를 결합하는 방식에 있어 어떤 것이 더 효율적인지 고민하는 게 데이터 분석가들이 하는 업무 중 하나예요. 쿼리문 하나를 작성하더라도 어떻게 작성하느냐에 따라 시간이 단축되기도 하고 사용하는 데이터량도 천차만별이거든요. 결론 : 조인 하나만이라도 제대로 조지자.

과제

오늘은 과제가 있어요. 다음 시간에 직접 예제를 풀어보며 실무에 적용해 볼 예정인데요. 혼자서 생각해보며 어떻게 쿼리를 짜면 좋을지 고민해보아 주세요.
1.
최근 6개월 내 구매이력이 2건이상이며 VVIP, VIP 등급인 고객 수 (재구매 충성고객의 수)
2.
최근 6개월 내 구매이력이 2건이상이며 Family, 일반 등급인 고객 수 (재구매 일반고객의 수)
3.
가입 후 총 구매 이력이 1건이며, 최근 6개월 내 구매이력이 1건 있는 고객 수 (첫구매 고객의 수)
4.
가입 후 구매 이력이 1건 이상이며, 최근 6개월 내 구매이력이 없는 고객 수 (비활성 고객의 수)
5.
가입 후 구매 이력이 0건인 고객 수 (비구매 고객의 수)