[마케터를 위한 SQL #1] 데이터 조회를 위한 SELECT Clause 살펴보기
최근 사내에 데이터를 기반으로 일을 하시는 많은 분들에게 SQL 을 전파하고 있습니다. 글의 제목에는 마케터로 한정지어져 있지만, 평소 데이터를 가지고 엑셀 Pivot 이나 VLookup 등의 작업을 자주 하시는 분들이라면 SQL 을 익히시는 것이 매우 큰 도움이 됩니다. 특히 사내에 Data Warehouse 나 DB 시스템에 접근할 수 있는 분석환경이 제공된다면 더욱 SQL 의 필요성은 높아지게 됩니다. 앞으로 몇편의 글을 통해서 DBA 수준의 전문가를 위한 SQL 이 아닌, 데이터를 기반으로 일을 하시는 비전문가(DB영역)를 위한 SQL 에 대해 예제를 중심으로 설명 드리고자 합니다.
분석 환경 및 도구
분석 환경과 도구는 사용자의 상황에 따라 매우 다를 수 있습니다. 따라서 많은 경우의 수를 설명드리는 것은 이 글의 본질을 벗어날 수 있으므로 여러가지 환경 설명에 대한 내용은 생략하겠습니다. 필자는 아래와 같이 환경을 구성했다는 가정하에 설명을 드리며, 조금 다른 환경이라도 SQL 문법의 변화는 크지 않기 때문에 진행되는 내용을 각자의 환경에서 실습해 보는 것이 가능합니다.
- Database 와 Query Engine : 기본적으로 데이터를 HDFS 에 저장하고 Hive Metastore 에 스키마를 생성했다는 가정, Query 엔진은 Hive
- SQL Client 툴 : Zeppelin
몇가지 익숙하지 않은 용어가 나왔는데, 사용자 입장에서 몰라도 되거나 저와는 환경이 다르실 수 있으니 당황하지 않으셔도 됩니다. 단, SQL 도 Database 의 종류에 따라 조금씩 Syntax 가 다릅니다. 필자가 실습에 기준으로 정한 Hive Query Language 도 표준 SQL 과는 조금 다른 문법을 사용하지만, 표준과 거의 유사하기 때문에 크게 상관은 없습니다.
데이터베이스 용어에 대한 개념
많은 용어를 다 설명드리기 보다는 꼭 필요한 용어만 설명을 드리겠습니다. 먼저 아래는 이번 포스팅에서 사용할 샘플 데이터(엑셀) 입니다.
위 엑셀 파일과 데이터베이스(Hive 기준)에서 사용하는 주요 개념을 매핑해 보면 아래와 같습니다.
- Column, Row : 엑셀의 행, 열과 유사한 개념으로 보시면 되고, 예제에서 처럼 1 행에 표시된 USER_ID, USER_NAME 등을 컬럼명 이라고 생각하시면 됩니다.
- Table : 위 엑셀에서 Sheet 이름에 해당하는 USER_INFO 에 해당하는 개념입니다. 2차원 행, 열로 구성된 데이터를 가지는 가장 기본적인 구성이 되겠습니다. 엑셀 Sheet 의 이름을 사용자가 마음대로 변경할 수 있듯이 Table 이름도 원하는 기준으로 지정이 가능합니다(약간의 제약이 있음).
- Database : 위 엑셀 파일의 파일명에 해당 하는 개념입니다. 하나의 엑셀 파일에 여러개의 Sheet 를 가질 수 있듯이 하나의 Database 에 여러개의 Table 을 생성할 수 있습니다. 또한 엑셀 파일도 여러개 생성할 수 있듯이 Database 도 여러개가 생성이 가능합니다.
가장 기본적인 개념과 용어들에 대해서 설명을 드렸고, Database, Table, Column, Row 외에도 많은 용어들이 있지만, 필요할 때 적절히 설명을 드리겠습니다. 현재 시점에서는 4개의 용어만 명확히 이해하셔도 무방합니다.
Sample Data
이번 포스팅에서 사용할 예제 데이터는 아래와 같습니다.
- Database 이름 : POPIT
- Table 이름 : USER_INFO
[table id=2 /]
Select Syntax
Hive 위키에 표현되어 있는 Select Syntax 는 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10
[WITH CommonTableExpression (, CommonTableExpression)*] (Note: Only available starting with Hive 0.13.0) SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ORDER BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
전체 문법을 표현한 것이기 때문에 매우 복잡해 보이나, 단계적으로 설명을 드릴 것이니 부담을 갖으실 필요는 없습니다. 현재 시점에서는 대문자로 표현된 된 Syntax 들(SELECT, FROM, WHERE ...LIMIT 등)에 대해서 순서 정도만 봐 두시면 되겠습니다.
하나의 컬럼 조회하기
먼저 Sample Data 에서 조회하고자 하는 컬럼이 USER_NAME 하나인 경우, 아래와 같이 작성할 수 있습니다.
1 2 3
SELECT USER_NAME FROM POPIT.USER_INFO ;
위 쿼리는 POPIT 데이터베이스에 있는 USER_INFO 테이블에서 USER_NAME 을 조회하는 쿼리입니다. 기억하셔야 할 부분은 Database 명과 Column명 사이에 . 을 찍어주는 것으로 구분을 했다는 것이며, 대상 테이블을 선택하기 위해 FROM 구문을 사용했고, 조회를 위해서는 SELECT 구문을 사용했다는 것인데, 이는 SQL 의 Syntax 이므로 그냥 외워 주시면 되겠습니다.
두개 이상의 컬럼 조회하기
아래 쿼리는 USER_NAME 과 GENDER 를 조회하는 쿼리 입니다.
1 2 3
SELECT USER_NAME, GENDER FROM POPIT.USER_INFO ;
위와 같이 여러개의 컬럼을 가져오고 싶을 때는, 여러개의 컬럼명을 콤마(,)를 기준으로 나열해 주면 됩니다. 컬럼 간의 순서는 원하는 기준으로 변경해 주셔도 됩니다.
전체 컬럼 조회하기
조회 대상 테이블의 모든 데이터를 가져오고 싶을 때는 아래와 같이 쿼리를 사용할 수 있습니다.
1 2 3
SELECT * FROM POPIT.USER_INFO ;
특정 컬럼의 유니크(UNIQUE) 값 가져오기
Sample Data 에 있는 GENDER 컬럼은 데이터 Value 값으로 "남자", "여자" 두개의 값 만을 가지고 있으며, 이렇게 지정된 컬럼값들의 조합이 UNIQUE 한 리스트로 반환될 수 있도록 하기 위한 조회 쿼리는 아래와 같습니다.
1 2 3
SELECT DISTINCT GENDER FROM POPIT.USER_INFO ;
DISTINCT 구문 뒤에 원하는 컬럼을 명시해 주면 되는데, 아래와 같이 여러개를 동시에 사용해 줄수도 있습니다.
1 2 3
SELECT DISTINCT USER_NAME, GENDER FROM POPIT.USER_INFO ;
Sample Data 기준으로 USER_NAME 은 동일한 값이 없으므로, 위 쿼리의 실행 결과는 아래와 같습니다.
1 2 3 4 5
태희 여자 혜교 여자 우성 남자 동건 남자 정재 남자
마치며...
이번 포스팅에서는 SELECT Clause 의 기본 문법만 살펴봤습니다. 다음 포스팅에서는 조회의 조건을 필터링 할 수 있는 WHERE Clause 에 대해 살펴보겠습니다.
다음 글 보러가기 : [마케터를 위한 SQL #2] WHERE Clause 살펴보기