참고) 현재 데이터 베이스와 SQL을 배우고 있는 과정에서 배운 내용들을 요약/기록중인 블로그입니다. 잘못된 내용이 있을 수 있으며 필요한 범위 내에서 최대한 정확한 정보를 담을 수 있도록 꾸준히 관리 및 수정할 예졍입니다.
0. (들어가기 앞서서) 우리는 왜 SQL을 배워야 할까?
데이터 분석을 진행해 봤다면 알겠지만 데이터를 분석하기 위해서는 당연히 수집된 데이터가 필요하다. 이러한 데이터는 캐글이나 여타 기본 데이터셋과 같이 분석용으로 잘 가공된 손쉬운 데이터도 존재하지만 이는 굉장히 특수한 경우이다.
실제 데이터 분석에서는, 분석할 기반이 되는 데이터가 전혀 없는 경우에는 웹 사이트를 직접 크롤링하거나 관련있는 데이터를 직접 찾아 수집하는 등의 방법을 통해서 직접 데이터를 생성하거나, 회사나 기업등에서 미리 수집한 고객이나 상품에 대한 데이터를 끌어와서 분석에 써야 하는 경우가 훨씬 많다. 이때 질좋은 데이터를 수집하는것 뿐 아니라, 필요한 데이터를 분석방향에 적합한 형식에 맞게 잘 가져오는 것도 매우 중요하다.
데이터를 직접 수집하여 적합한 형식으로 가공하는 방법은 나중에 따로 다루도록 하고, 회사나 기업에서 미리 수집한 데이터들을 끌어다 쓰는 경우를 생각해보자. 회사에서 미리 데이터가 수집되어 있다면 이러한 데이터는 어떻게 저장되어 있고 이걸 어떻게 가져올까?
대부분의 회사들은 산발된 곳들에서 수집되는 데이터를 효과적으로 관리하기 위해 데이터베이스라는 것을 만든다. 이는 단순히 생각하면 모든 부서에서 수집되는 고객들의 데이터를 전부 데이터베이스란 곳에 한데 모아 관리하고, 각 부서가 필요할 때 마다 이 데이터베이스에 접근해 필요한 데이터를 활용하는 방식이다.
다시한번 정리하면 데이터베이스(DB; Database)는 한곳에 저장된 데이터를 원하는 어떤 곳에서든 사용할 수 있는 것, 즉 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보집합 내지 저장소이며, 이를 관리해주는 시스템 또는 소프트웨어를 데이터베이스 관리 시스템(DBMS) 이라고 한다. 그리고 이러한 데이터베이스 관리 시스템에서 데이터와 대화하는 언어가 바로 Structured Query Language (SQL)이다.
■ 데이터 분석을 다루는 우리는 왜 SQL을 따로 배워야 할까?
먼저, DB안의 데이터 수집 형태를 정확하게 모르는 채로 분석을 한다면 어떻게 될까? 이는 가용할수 있는 데이터를 모르는 채로 분석하는 것과 다를 바 없다. 즉 요리를 하는데 있어 준비된 재료가 닭인지, 소고기인지, 돼지고기인지 모르는 채로 메뉴를 선정하는 것과 같다. 즉 데이터베이스를 기본적으로 확인하고 이해할 수 있는 수준의 소양이 필요하다.
그럼, DB를 다룰 줄 아는 사람과 협업하면 되지 않을까? BD에 대한 이해없이 서버 관리자에게 데이터를 요청하면 둘 사이의 이해 차이로 인해 전혀 다른 데이터를 받게 될 수도 있고 소통과정에서의 시간낭비로 이어질 수 있다.
따라서 데이터 분석가가 직접 쿼리를 통해서 데이터를 확인하고 필요한 데이터를 뽑아오는 것이 사실 가장 효율적이며, 간단한 SQL 기본 문법만으로 이러한 기능들을 수행할 수 있기 때문에 대부분의 기업에서 데이터분석가에게 적당한 SQL 지식과 역량을 요구하는 것이다.
<참고>
- 데이터 분석과 SQL 배워야 하는 이유 - 코드스테이트
- 비개발자를 위한 엑셀로 이해하는 SQL: ① 엑셀로 온라인 서비스의 RDB 이해하기 - 플래터
- 아직도 SQL을 모른다고해서 5분 설명해드림 - 노마드 코더 (youtube)
- 왕초보용! 갖고 노는 MySQL 데이터베이스 강좌 - 얄팍한 코딩사전 (youtube)
https://www.youtube.com/watch?v=z9chRlD1tec
https://www.youtube.com/watch?v=dgpBXNa9vJc
1. 데이터베이스에 대한 간단한 이해
데이터베이스에 대해 다시한번 정리하자면,
데이터베이스는 한곳에 저장된 데이터를 원하는 어떤 곳에서든 사용할 수 있는 것, 즉 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보집합 내지 저장소 <얄팍한 코딩사전 youtube 참고>
그렇다면, 데이터베이스는 정확하게 어떤 식으로 데이터를 저장하는 것일까? 두가지의 방식을 생각해 볼 수 있다.
먼저 각 수집된 데이터를 가공하는 사람의 입맛에 맞게 각각의 파일로서 따로 저장하고, 이를 한데 모으는 방식을 생각해 볼 수 있다. 즉, 데이터베이스라는 공용 폴더 안에 각 작성자가 데이터를 자신의 방식으로 텍스트 파일로 기록하여 저장하고, 필요할 때 마다 누구든 꺼내볼 수 있도록 하는 방식을 상상해 볼 수 있다. 대표적으로 mongo DB 가 이런 방식을 따르는데, 데이터의 입력 과정이 굉장히 자유롭기 때문에 읽고 저장하는 속도가 매우 빠르다는 장점이 있다. 그러나, 데이터를 저장하는 형식이 작성자 마다 다르므로, 데이터 분석을 위해 한데 모을 때, 어떤 데이터에 대해서는 특정 항목에 대한 데이터가 빠져있거나, 데이터 내에 항목명이 서로 달라(예를들어 누구는 상호명으로 이름을 기록하고, 누구는 업소명으로 기록한다면) 데이터를 합칠 수 없는 문제가 생길 수 있다. 이러한 데이터베이스 저장방식을 non-relation database 이라고 한다.
그렇다면 애초에 정보를 저장할때 기입해야 하는 항목을 공통적으로 설정해 놓는다면 어떨까. 엑셀과 같이 특정 열에 어떤 내용을 담을지 미리 정해놓고 데이터를 수집할 경우, 데이터의 작성자가 다르더라도 데이터가 통일되게 들어오기 때문에 전체적인 관리와 활용이 매우 쉬운 장점이 있을 것이다. 만약 다른 형식의 데이터를 따로 저장해야 하더라도, 새로운 시트를 열어 새로 데이터를 수집하고, 필요에 따라 여러 개의 시트를 오가며 데이터를 관리할 수 있다.
그러나 정보 수집을 모두 일정한 틀 내에서 저장되도록 한다면 데이터가 비효율적으로 수직으로 쌓이는 문제가 생길 수 있는데, 예를들어 같은 업소에서 같은 시간 같은 제작자가 생성한 서로 다른 상품 A, B 에 대해 기록할 때, 상품 종류만 A, B로 다르고 수십개의 컬럼 값이 동일하게 곂친다면 이 데이터들을 똑같이 전부 기록해 두는것은 어찌보면 비효율적이다. 또, 필요에 따라 서로 다른 시트에 수집한 두 개의 데이터 테이블이 서로 관련이 있어 특정 테이블의 데이터 수정이 다른시트의 데이터들에도 영향을 끼쳐 이를 한번에 수정해야되는 경우도 생길 수 있다. 예를들어 회사 내 부서에 대한 데이터와, 회사 내 상품데이터를 서로 다른 시트에서 다루는 경우, 특정 부서에 대한 데이터 수정이 그 부서에서 생산하는 상품에 대해서만 영향을 끼치는 경우가 생길 수 있고, 이 경우 부서와 상품시트간의 관계를 일일이 확인해 결과를 모두 수정해야 되는 것이다.
이에 따라 내용이 곂쳐 불필요하게 저장되는 데이터가 적어지도록 적절하게 테이블을 분리하여 설계하고, 각 테이블간 관계를 설정해 서로 테이블끼리 자동으로 연동되게 설정해 놓은 저장방식을 relation database 라고 한다.
각 프로그램마다 데이터베이스 저장 방식이 다른데 대표적으로 이렇게 나눠볼 수 있다.
1) Relational Database management system (RDBMS) - SQL : MySQL, PostgreSQL, SQLite
2) non-relational database management system - Non-SQL : mongoDB, DynamoDB, CouchDB
보다시피 SQL은 RDBMS(관계형 데이터베이스 시스템) 에서 사용되는자료 관리 및 처리를 위해 설계된 언어이다.
2. SQL 에 대한 간단한 이해
SQL은 어떻게 생겼고, 어떻게 작동할까? 얕게 따지고 보면 사실 엑셀이랑 거의 비슷하다.
SQL에서 사용하는 하나의 테이블은 엑셀에서의 하나의 시트와 동일하게 생각해 보면 된다. SQL에서의 테이블은 행(row)과 열(column)의 조합으로 이루어져 있으며 동일하게 기록하고 삭제하며, 명령어를 통해 데이터를 가공하고 요약하고 수정할 수 있다.
그러나, 이 두가지의 프로그램을 사용하는 사용자 입장에서의 가장 큰 차이는 엑셀은 저장된 데이터를 확인하는 과정(조회), 입력, 수정, 삭제 등의 작업 과정이 마우스 클릭과 드래그를 통해 직관적으로 이루어지는 반면, SQL은 저장된 데이터의 모든 과정이 오로지 명령어를 입력해야지만 이루어지는 추상적인 형태를 보인다는 점이다.
이해를 위해 데이터를 조회하는 함수인 select 구문을 가볍게 살펴보자.
SQL 에서 저장된 데이터 테이블의 내용을 확인하기 위해서는, 일반적으로 아래와 같이 과정을 거쳐야 한다.
> select * from 테이블명 ;
라는 명령어를 입력해야 한다.
이때 *는 '전부' 를 의미하며 *에 특정 컬럼을 작성하여, 테이블 내의 특정 컬럼만을 조회할 수 있다.
> select 열이름 from 테이블명 ;
> select 열이름 from 테이블명 where 조건 ;
을 통해서 특정 조건을 만족하는 열에 대해서만 조회할 수도 있다.
< 조건문 예시 : 조건 부분에 다음을 입력 >
특정 열 > 특정값 (특정 값 초과인 경우만 조회)
특정열 = 특정 값 (특정 값과 같은 경우만 조회)
특정열 like "%naver.com"; (특정 열의 값이 naver.com으로 끝나는 경우만 조회)
특정열 between 15 and 18 ; (특정 열의 값이 15이상 18 이하인 경우만 조회)
+ α. 부가적인 지식들
왜 많은 프로그래머 개발자들은 SQL을 잘 모르는걸까 -> ORM이 있기 때문
ORM은 다른 언어의 코딩문을 SQL로 바꿔주는 역할을 한다.
ex) 특정 ORM은 파이썬 코딩을 SQL로 바꿔주는 역할을 함. 즉 파이썬 코딩으로 SQL 코드를 얻을 수 있음. 파이썬의 경우 장고 ORM, 라라벨의 경우 eloqent orm, node.js의 경우 sequelize 혹은 type orm을 사용할 수 있다.
그러나 orm에 의존하다보면 간단하게 사용해야할때, 코드가 꼬일때 해결이 불가능해짐
따라서 풀스택 개발을 위해서는 SQL 문이 어렵지 않기 때문에 알아두는 것이 좋다.
<관심있게 본 댓글, 나중에 더 알아볼 것들>
댓글1.
sql과 MongoDB의 차이점과 장단점에 대해서도 궁금합니다. 라인에서도 MongoDB를 쓰고 있고 최근에 MongoDB를 쓰는 경우도 많다고 들었습니다.
댓글2.
프로그램은 빠른데 DB 응답이 느리다고 합니다. 쿼리 실행 계획을 보고 쿼리를 튜닝해서 인덱스를 태우고 인덱스 순서라든가 볼줄만 알면 쿼리 응답 시간이 10 초 -> 0.1 초로 바뀌는 것을 보고는 신기해 합니다. (sql 튜닝)
(간섭이 생길때 안에들어가서 해결해야하는거군용)
댓글3.
개발자가 아닌 사람에게 SQL 구사능력을 요구하는 이유는 본인들이 DB안의 데이터 형태를 모르면서 서버 관리자에게 데이터를 요청하다보면 자기들이 원하는 형태의 결과물이 안나오거나 아예 잘못된 내용이 올 수 있고 핑퐁치면서 시간이 엄청 소모 되기 때문에 직접 쿼리를 날려서 원하는 데이터를 뽑아내는 것이 더 중요짐 결국 업무 퍼포먼스 측면에서 분석 업무에서 SQL은 거의 필수 코스 서브쿼리 까진 안가도 SELECT 기본 만 해도 왠만한건 다 뽑을 수 있으니 난이도도 높지 않고
'My SQL' 카테고리의 다른 글
[데이터 분석을 위한 SQL 레시피] 데이터 분석 목적과 분석 방향 정리 (1) | 2024.06.18 |
---|---|
My SQL "데이터 분석을 위한 SQL 레시피" - part3 테이블 구조 변경, 다중 테이블 조작 (0) | 2024.03.22 |
My SQL "데이터 분석을 위한 SQL 레시피" - part2 연산 및 그룹화 (0) | 2024.03.11 |
MySQL "데이터 분석을 위한 SQL 레시피" - part1 값 조작하기 (0) | 2024.02.27 |
비전공자 SQLD 시험 후기 (1) | 2023.03.24 |