본문 바로가기
Programming/Knowledge

데이터 사이언티스트 면접자를 위한 SQL 기본 가이드

by 지표덕후 2022. 9. 24.

엔터프라이즈 데이터 영역에서 SQL은 널리 사용됩니다. NoSQL이 부상하기 전, 관계형 데이터베이스에서 데이터를 검색할 때 SQL은 가장 먼저 떠오르는 쿼리 언어였습니다. High scalability가 DeveloperWeek의 IT 리더 대상으로 수행한 설문 조사에 따르면 2019년에도 SQL은 여전히 60% 이상 사용되고 있었습니다. 다중 데이터베이스 전략(SQL+NoSQL)이 75% 이상이었습니다. 놀랄 일이 아닌 것이, 상이한 유형의 데이터베이스는 서로 다른 목적으로 사용되니까요. (관심이 있으시다면 여기서 더 읽어보실 수 있습니다.)

 

모든 관계형 데이터베이스 중에서 MySQL은 여전히 가장 인기 있는 데이터베이스입니다.

 

좋은 머신러닝 알고리즘을 개발할 줄 알고, Kaggle 대회에도 참가하며, Pandas를 사용하여 데이터를 조작하는 데이터 사이언티스트 지망생들이 SQL 질문을 인터뷰 현장에서 받는다면 어안이 벙벙할 수 있습니다. 하지만 이는 실제로 일어나는 일이기에 데이터 사이언티스트를 지망하는 이들도 SQL에 대한 지식이 필요합니다.

 

 

SQL 역사

실무에서 관계형 데이터베이스는 모든 유형의 엔터프라이즈 데이터를 저장하는 데 널리 활용됩니다. 데이터는 모든 유형의 데이터 원천(sorce)에서 쉽게 검색될 수 있도록 저장됩니다. SQL을 알면 데이터를 쉽게 검색하고 조작할 수 있습니다. 데이터 사이언스가 전반적으로 퀀텀 점프(“hype”)하기 전에 데이터 과학은 대규모 조직의 통계학자에 의해 수행되었습니다(맥주회사 기네스의 직원이 t-test를 만들었단 건 아시죠). 데이터 마이닝은 통계학과 컴퓨터 과학의 교차점이었습니다. 단순화시켜 말하면 데이터 마이닝은 머신러닝과 통계를 사용하여 대규모 데이터 집합에서 패턴을 발견하는 과정입니다.

 

데이터 마이닝을 사용하면 분석 전에 데이터를 전송하거나 데이터를 병합할 필요가 없습니다. 분석은 많은 데이터 저장소에 걸쳐 그때 그때 수행될 수 있습니다.

 

엔터프라이즈 기술 기반 하에서는 데이터 마이닝을 위해 대규모 데이터셋을 SAS로 처리하는 경우가 많습니다. SAS를 사용하면 데이터 사이언티스트가 코드를 너무 많이 작성하지 않고도 대량의 데이터에 대한 통계 분석을 쉽게 수행할 수 있습니다. SAS의 내장 기능은 모든 유형의 데이터 분석에서 매우 유용합니다. SQL은 SAS 내에서 실행될 수 있습니다. SAS 문법도 SQL과 유사합니다.

 

Oracle의 DataMiner도 데이터 사이언스를 다루는 엔터프라이즈 기술 기반으로 널리 사용되는 소프트웨어입니다. 여기에는 분류, 예측, 회귀, 연관성, 특징 추출 등과 같은 수많은 데이터 분석 알고리즘이 포함되어 있습니다. 관계형 데이터베이스에 저장된 대규모 데이터셋에서 작동시킬 수 있습니다.

 

 

 

Relational Database의 개념

SQL에 대해 살펴보기 전에 몇 가지 RDBMS(관계형 데이터베이스 관리 시스템) 개념을 살펴보겠습니다.

 

Schema 스키마

데이터베이스 스키마는 데이터 구성을 나타냅니다. 데이터베이스를 어떻게 구성할 것인가에 대한 청사진이라고 생각해주시면 됩니다. RDBMS에서 데이터베이스 모델은 스키마에 의해 구현됩니다. Entity-relationship객체 관계 모형이라 불리는 그것입니다.

 

객체 관계 모형에 대해 더 자세히 알고 싶은 분은 이 글을 참고해보세요.

 

Table

스키마의 주요 단위 중 하나는 테이블입니다. RDBMS에서 테이블들은 서로서로 다양한 유형의 관계(1 대 1, 1 대 다, 다 대 다)를 맺고 있습니다.

 

Columns

테이블을 수직으로 쪼개놓은 것을 열column이라고 합니다. RDBMS에서 열은 속성attribute이라고도 합니다.

 

Rows

테이블을 수평으로 쪼개놓은 것을 행row이라고 합니다. RDBMS에서 행은 종종 튜플tuple이라고도 불립니다.

 

Indexes

RDBMS에서 색인index은 데이터를 빠르게 찾아 테이블 운용operation을 개선하기 위한 데이터 구조입니다. 색인 유형에 따라 다를 순 있지만, 색인을 생성하여 특정 방식으로 정렬된 데이터의 복사본을 서버에 만들어둠으로써 데이터 검색을 더 용이하게 할 수 있습니다. 때로는 데이터의 복사본을 만드는 대신, 데이터가 생성되는 당시에 특정 색인을 기준으로 정렬하여 검색 최적화를 달성할 수도 있습니다.

 

색인에는 대표적인 두 가지 유형이 있습니다. 비군집형non-clustered index과 군집형clustered index입니다.

  • 비군집형 색인은 데이터가 임의의 순서로 저장되지만 색인에 의해 논리적인 순서가 지정되어 있는 것입니다.
  • 군집형 색인은 데이터가 저장되는 데이터 블록data block이 색인 기준 정렬방식을 만족시키기 위해 변형되는 것입니다.

다음은 비군집형 색인과 군집형 색인의 차이점을 설명하는 게시물입니다.

 

SQL Statements

SQL은 RDBMS 데이터베이스의 구조화된 쿼리 언어(Structured Query Language)입니다. 데이터를 검색할 때 일반적으로 SQL문(SQL statements)을 사용하여 데이터를 검색합니다. 내가 의도한 목적의 데이터만 발라내기 위하여 SQL 문을 사용해 테이블을 결합할 수 있습니다.

 

Stored Procedure

SQL 문을 즉시 실행하는 대신 "저장된 프로시저(Stored Procedure)"라는 프로그램의 집합을 만들어 둘 수 있습니다. 함수를 작동시킬 때 그러는 것처럼 인수(arguments)를 프로그램에 전달할 수 있습니다.

 

Query Plan

쿼리 플랜(Query Plan)은 데이터에 액세스하기 위한 일련의 절차입니다. 쿼리 플랜은 데이터베이스 내부에 있는 쿼리 최적화 프로그램에 의해 결정됩니다. SQL문과 저장된 프로시저는 데이터 검색 방법에 대한 의도를 선언해둔 것일 뿐입니다. 쿼리 최적화 프로그램에 명기된 쿼리 플랜에는 데이터베이스에 의해 SQL문이 실행되는 방식이 순차적으로, 그리고 정확하게 표시되어 있습니다. 쿼리 플랜을 분석함으로써 저장된 프로시저와 SQL문을 최적화하고 조정할 수 있습니다.

 

Constraints

제약 조건(Constaraints)은 RDBMS 데이터베이스 내에서 데이터의 무결성을 강제합니다. 데이터 및 데이터 타입을 한정하는 등의 제약을 걸 수 있습니다. 제약 조건은 열 수준 또는 테이블 수준에서 설정할 수 있습니다. NOT NULL, UNIQUE, PRIMARY KEY, FOREGE KEY, CHECK, INDEX 등 몇 가지 다른 유형의 제약 조건이 존재합니다.

  • 기본 키Primary key — 테이블의 각 레코드를 고유하게 식별하는 제약 조건입니다. 일반적으로 고유한 레코드 ID입니다.
  • 외래 키Foreign Key — 테이블에서 부모-자녀 관계를 설정할 수 있는 제약 조건입니다. 일반적으로 외래 키가 있는 테이블은 하위 테이블이고 외래 키가 없는 테이블은 상위 테이블입니다.

다음은 MySQL 데이터베이스에서 외래 키와 기본 키의 관계를 설명하는 좋은 게시물입니다.

Normalization

정규화는 RDBMS 데이터베이스의 데이터를 효율적으로 구성하기 위한 프로세스입니다. 핵심은 중복된 데이터를 제거하는 것입니다. 예를 들어 ClientInfo 테이블에 있는 클라이언트의 주소가 세 개인 경우, 데이터를 정규화하기 위해 ClientId에 의해 인덱싱된 ClientInfo라는 테이블에 클라이언트 정보를 저장하고 ClientId를 사용하여 ClientAddress 테이블에 세 개의 서로 다른 주소를 저장할 수 있습니다. 그런 다음 ClientId를 기준으로 두 테이블을 함께 연결할 수 있습니다. 각 테이블의 "고유한" 데이터를 보장함으로써 스토리지 공간을 절약하고 성능을 최적화할 수 있습니다. (어쨌든 이게 핵심입니다.)

 

MySQL Database 세팅

MySQL 데이터베이스를 설정하는 것은 매우 쉽습니다. 실행 파일을 Mac 또는 PC에 다운로드하여 실행하면 실행 파일이 설치됩니다. 그런 다음 MySQL 클라이언트를 사용하여 서버에 연결합니다.

 

아래는 사용자가 따를 수 있는 지침입니다.

 

Creating Tables

아래 쿼리는 primary key를 가진 테이블을 생성합니다:

CREATE TABLE ClientInfo (
 ClientId INT NOT NULL
 ClientName VARCHAR(255)
 PRIMARY KEY (ClientId)
);

 

Retrieving Data From Tables

아래 쿼리는 테이블 하나로부터 데이터를 검색합니다:

SELECT * FROM ClientInfo

 

아래 쿼리는 두 개의 테이블을 INNER JOIN으로 합치고 데이터를 검색합니다. 그 결과 ClientInfo와 ClientAddress 테이블에 공통적으로 들어있는 데이터 추출됩니다:

SELECT * from ClientInfo
INNER JOIN ClientAddress
ON
ClientInfo.ClientId = ClientAddress.ClientId

 

아래 쿼리는 명시적으로 INNER JOIN을 기재하지 않았지만 위의 쿼리와 똑같은 결과물을 내놓습니다. 

SELECT * from ClientInfo, ClientAddress
WHERE
ClientInfo.ClientId = ClientAddress.ClientId

 

아래 쿼리는 두 개의 테이블을 OUTER JOIN으로 합쳐 데이터를 추출합니다. ClientInfo의 모든 레코드 + ClentInfo & ClientAddress에 공통적으로 포함된 레코드가 추출됩니다.

SELECT * from ClientInfo
LEFT OUTER JOIN ClientAddress
ON
ClientInfo.ClientId = ClientAddress.ClientId

 

Creating Indexes

아래의 쿼리는 하나의 테이블에 고유한 인덱스를 생성합니다:

CREATE UNIQUE INDEX ClientId ON ClientInfo(ClientId)

 

다음 스텝

MySQL 테이블과 상호 작용하고 테이블에서 정보를 검색하는 방법에 대해 알아보았습니다. 다음 단계에서는,

 

1. 데이터베이스의 데이터를 다루는 간단한 프로젝트를 만듭니다. 가장 쉬운 방법은 일군의 "더러운 데이터"를 데이터베이스에 로드하는 것입니다. 그런 다음 Pandas를 사용하지 않고 SQL을 사용하여 데이터를 정리해봅니다.

2. 아래의 자료를 참고하면서 깊이 있게 수행해봅니다.

 

인터뷰에 자주 나오는 질문

이제 기본 개념을 공부하고 첫 번째 프로젝트를 수행했으며 몇 가지 참고 자료도 확인했습니다. 이제 면접 질문을 통해 여러분의 지식을 테스트해 볼 시간입니다.

 

아래은 웹 사이트는 데이터 사이언티스트 면접에 대해 사례를 제공하는 좋은 사이트입니다. 한 번 참고해보세요!

 

댓글