개발이나 데이터 분석과 접점이 없는 삶을 살아왔기에 스키마, RDBMS, ERD 등 용어들은 나에게 너무 생소하고 낯선 단어들이다.
그러나 PM에게 개발과 데이터 분석에 대한 기본적인 이해는 필수적이다.
특히 오늘 이야기하고자 하는 주제인 '데이터 분석'에 대해 PM이 데이터를 분석하지 못하고, DB 설계 과정에 있어 개입을 하지 못한다면 기획자로서의 역할을 기대하기는 어렵다고 한다. 아무리 전문적인 데이터 분석가가 옆에 있다고 해도 PM은 분석가와 데이터를 함께 바라볼 줄 알아야 조직 내에서 PM으로서의 정체성을 잃지 않을 수 있다는 것이다.
이에 데린이답게 아주 기본적인 것부터 차근차근 그날 배운 것들을 정리해 나가보려 한다.
관계형 데이터베이스(RDBMS)란?
데이터베이스(Database)는 쉽게 말해 데이터들이 저장되는 곳이다.
그리고 그 데이터베이스 구성으로서 그 안의 데이터들을 관리하는 시스템을 DBMS(DB Management System)이라고 한다.
그렇다면 관계형 데이터베이스(RDBMS,Relational DataBaseManagenent System)는 무엇일까?
관계형 데이터베이스는 데이터를 구성하는 필요한 방법 중 하나로 모든 데이터를 엑셀과 같은 행, 열이 있는 테이블 형태로 표현하는 것이다. 테이블 기반의 DBMS이다.
각 데이터들은 주민번호와 같이 누구와도 겹치지 않으면서 해당 값을 알면 모두를 알게 되는, 즉 구분할 수 있는 기준인 기본키 값이 있다. 이 기본키 값들을 사용해 데이터 상호 간의 관계를 형성 및 기록하고 표현해 내는 것이 관계형 데이터베이스이다.
SQL(Structured Query Language) 이란?
SQL은 관계형 데이터베이스를 효율적으로 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
SQL의 명령어를 통해 데이터베이스들간의 관계 속에서 내가 원하는 데이터를 추출해 낼 수 있다.
미국표준협회 ANSI가 관리하며 SQL 명령의 기본 규격들을 만들어 놓았기 때문에 DBMS를 사용하는 프로그램은 달라도 모두 동일한 SQL(언어)를 사용한다. 즉 데이터베이스를 관리하기 위해 사용하는 프로그램이 무엇이든 SQL 언어만 사용할 줄 안다면 데이터를 분석할 수 있다는 뜻이다.
SQL 문장에는 여러 종류들이 있는데, 데이터 조작어 정도만 이해해도 괜찮다고 한다.
이에 실제 SQL을 통해 관계형 데이터베이스를 어떻게 추출하고 데이터를 활용할 수 있을지 더 확실히 알아보기 위해 w3schools를 이용해 보았다.
w3스쿨즈(w3schools)란?
온라인으로 웹 기술을 배우는 교육용 웹 사이트이다. 콘텐츠에는 HTML, CSS, 자바스크립트, JSON, PHP, 파이썬, XML, SQL, Bootstrap, Node.js, JQuery 등 다양한 교육용 자료를 제공한다.
(출처 : 위키백과)
SQL 명령어로 원하는 데이터 추출해 보기
w3schools에 들어가면 교육용으로 SQL을 실습해 보는 페이지가 있다.
아래 이미지의 오른쪽 'Your Database'에 8가지 Tablename이 존재하고, 각 Tablename을 누르면 'Result' 하단에 데이터 값이 표로 나오게 된다.
각 다른 데이터를 갖고 있는 Tablename들 사이에서 내가 원하는 데이터만 명령어를 통해 가져오면 된다.
그러기 위해서는 위에서 이야기한 각 Table의 고유한 특성을 가리키는 기본 키 값들을 찾고, 관계를 맺을 수 있는 키 값들을 연결하는 쿼리, 명령어를 'SQL Statement'에 입력해야 한다.
실제 내가 원하는 데이터를 3가지로 정해 보며 가장 쉽고 기본적인 것부터 SQL을 실행해 보았다.
독일 고객의 명단과 수를 추출하기 위해서는 Tablename에서 'Customers'만 확인하면 된다.
고객 테이블에서 독일 국적을 가진 고객만을 추출하기 위해서는 데이터를 필터링할 수 있는 'Where' 구문을 통해 명령할 수 있다. 사용한 명령어를 풀이해서 설명하면 다음과 같다.
- Select * : 전체 데이터에서
- From Customers : 'Customers' 테이블의
- Where Country = 'Germany' : Country에서 독일 사람들 데이터만 추출하기
위 명령어 값의 결과로 전체 고객 중 독일인은 11명이라는 것과 그 상세 정보를 확인할 수 있었다.
더불어 여기서 하나 주의할 점이 있었다.
해당 명령어를 처음 사용할 때 첫 에러가 났었는데, 그 이유가 독일 'Germany' 앞자를 대문자로 쓰지 않아서였다. 다른 명령어들은 대문자와 소문자 상관없이 명령 실행이 되었으나, 데이터 내부 값들에 대한 것은 안에 적힌 글자 그대로(대문자, 소문자 구분하여) 작성해야 한다는 것을 알았다.
첫 번째 질문을 응용해 보다 복잡한 데이터를 시도해 보고자, 독일 고객들 중 7~8월에 실제 구매를 한 사람의 수는 몇 명 일지 확인해 보았다.
먼저 Tablename은 'Customers'와 'Orders' 2개가 필요하다.
Customers의 Country 데이터와 Orders의 OrderDate를 가져와야 하기 때문이다.
두 개의 로우 데이터를 가져와 독일인들 중 7~8월에 구매한 데이터를 가공하기 위한 명령어는 다음과 같다.
명령어 A 부분
- Select customers.country, orders.orderdate
: customers 테이블의 country 데이터와 orders 테이블의 orderdate 추출하기
- from customers inner join orders
: customers 데이터를 orders 데이터로 합친 테이블 전체 값에서
- on customers.customer ID = orders.customerID
: (단, 두 데이터의 customerID 값은 동일함)
명령어 B부분(A부분 뒷부분)
- Where customer.country = 'Germany'
: A부분 데이터 중 독일 사람 데이터만 확인하기
- and orders.orderdate between '1996-07-01' and '1996-08-30'
: 그리고 그중 7월~8월 구매 이력만 다시 확인하기
명령어가 길기 때문에 두 부분(A, B로) 나눠 설명했다.
A부분의 명령어를 통해 먼저 필요한 데이터(country와 orderdate)만 불러오고, 그 값에서 독일(Germany)과 7~8월 구매 이력(Orderdate 1996-07-01 ~1996-08-30)을 추출했다.
그 결과 7~8월에 구매한 독일 고객은 총 7명인 것을 확인할 수 있었다.
여기서도 하나 짚고 넘어가고 싶은 부분은
명령어 중 'on customers.customerID = orders.customerID' 부분이다.
2개의 다른 테이블의 데이터들을 조합하여 합치고 싶을 때, 즉 관계를 형성시킬 때 위에서 언급했듯 각자의 고유 키 값이 필요하다. 그 키 값을 연결해 관계를 형성하게 되는데, 두 테이블 데이터(customers, orders)가 동일하게 갖는 고유 키 값이 'customerID' 였던 것이다. 그래서 위 명령어는 키 값으로 두 데이터를 연결한다는 뜻이라고 이해하면 될 것 같다.
위 두 가지와 다르게 이번에는 원하는 데이터의 금액의 합을 구해보고자 한다. 이에 상품을 판매하는 공급자 중 Exotic Liquid라는 사람이 판매하는 상품들의 판매 금액 합을 구해보았다.
이번에도 Suppliers 테이블과 Products 테이블, 총 2가지의 테이블의 정보가 필요하다.
그런데 결론부터 이야기하면 실제 명령어를 불러올 때는 Product 테이블만 확인하면 된다.
우선 Suppliers 테이블을 보면 Exotic Liquid 공급자의 SupplierID가 1번인 것을 확인할 수 있다.
그리고 Products 테이블에는 공급자 이름 대신 SupplierID가 표기되어 있다. Exotic Liquid 공급자의 정보를 확인하기 위해서는 Product 테이블 내에서 SupplierID 1번의 데이터를 추출하면 된다. 즉 여기서는 2가지 데이터를 확인해야 했지만, 실질적으로 데이터를 불러올 때는 2가지 테이블을 다 가져올 필요가 없다는 것이다. Products 테이블만 확인해도 원하는 정보를 충분히 추출할 수 있기 때문이다.
- Select sum(price) from products : products 테이블의 price 값을 합산한 데이터를 추출하기
- where products.supplierid=1 : 그중 1번 공급자의 (price) 값만
위 명령어의 값은 총 47이다. 즉 정확히 단위는 모르겠지만 SupplierID가 1번인 Exotic Liquid 공급자가 판매하는 상품들의 금액 합은 47(달러?)이라는 것을 알 수 있다.