본문 바로가기
  • ㄹㅇ
패스트캠퍼스

[패스트캠퍼스] 데이터 분석 부트캠프 13기 - SQL(2)

by 한강석 2024. 4. 12.
부트캠프가 온라인 강의와 실시간 강의 양 쪽으로 진행되다 보니까 같은 내용을 두 번씩 배우게 된다. 저번 주에는 온라인 강의로 SQL을 배웠다면 이번 주에는 실시간 강의로 강사와 커뮤니케이션 하면서 배우서 좀 더 자세하게 들을 수 있었다. 그리고 강의 내용 외에도 데이터 분석에 대해 여러 이야기를 해주어서 그런 것들을 듣는 것도 의미있었다. 그래서 이번 주차도 저번이랑 내용은 비슷하지만 SQL 전반에 대한 내용을 가볍게 요약하여 작성하게 될 것 같다. 

 

SQL이란? 

SQL은 Structured Query Language 으로 관계형 데이터베이스 시스템에서 데이터를 관리하기 위한 언어이다. 데이터 베이스 시스템마다 조금씩 문법이 다르지만 표준 정의된 SQL이 있고 이를 중심으로 파생된 여러 언어들에 각각 조금씩 다른 부분이 존재한다. 그래서 표준 SQL 위주로 배우면 나중에 다른 언어를 다루게 되더라도 기본적인 문법은 같기 때문에 쉽게 배울 수 있다. 

관계형 데이터 베이스는 수많은 데이터들을 관리하기 위한 데이터베이스 시스템 중 하나로 데이터 간의 관계를 중심으로 데이터를 정리하는 방식이다. 가장 많이 사용된 방식이기도 하고 오랜 시간 사용되었기에 신뢰도도 높다. 

관계형 데이터 베이스 (RDBMS) 는 데이터를 2차원의 표 형식으로 저장하는 것을 기본으로 한다.

2차원의 표는 세로 줄인 열(컬럼)과 가로 줄인 행(로우)로 이루어져 있고 각 세로 줄은 어떤 객체의 서로 다른 속성을, 각 가로 줄은 서로 다른 개체를 의미하게 된다. 

제품 번호 제품명 가격 유통기한 제조공장코드
1 서울우유 2000 2024-04-17 F4
2 새우깡 2500 2024-10-11 F2
3 투게더 5000 - G1

 

예를 들어 제품에 대한 데이터가 다음과 같이 있다면 각 가로줄은 제품 하나하나를 의미하게 되고 각 세로줄은 제품이 가지고 있는 속성에 대한 정보를 의미한다. 각 개체는 모든 속성을 갖는 것은 아니지만 주요 속성은 가져야 한다. 또한 각 제품을 식별할 수 있는 컬럼(Primary Key)이 존재해야 하는데 이는 모든 개체가 갖는 유일한 값이어야 한다. 

위의 테이블에서는 제품 번호가 그 역할을 한다. 

그리고 관계형 데이터베이스의 핵심은 다른 테이블과의 관계에 있다. 그래서 이 테이블의 어떤 속성을 다른 테이블에서 참조하고 있다면 둘의 연결관계를 통해 서로 다른 데이터를 독립적으로 유지하면서 연결할 수 있다.

만약 제조 공장에 대한 또다른 테이블이 있다면 제품과 제조 공장이라는 서로 다른 데이터를 각각 유지시켜 놓고, 필요할 때에는 조인을 통해 연결하여 필요한 데이터를 관계를 통해 얻어올 수 있다. 이렇게 다른 테이블에서 참조할 수 있는 속성을 (Foreign Key) 라고 한다. 위의 테이블에서는 제조 공장 코드가 그 역할을 하며 이는 제조 공장 테이블에서는 Primary Key로 작동한다. 

 

데이터베이스 스키마

앞으로 배울 SQL은 주로 데이터의 조회에 대한 내용이다. SELECT와 WHERE을 사용해서 원하는 데이터를 불러오는 것을 주로 사용하지만 불러올 데이터베이스의 구조를 짜서 만드는 것도 SQL을 이용해서 작성하게 된다. 

데이터베이스를 조회하거나 수정할 때에도 사용되지만 가장 기본적인 데이터베이스의 구조를 짤 수 있다. 데이터 베이스의 구조 및 형식, 관계를 작성해 놓은 것을 스키마(Schema)라고 한다. 

 

데이터 모델링은 3가지 단계로 이루어진다. 

  1. 개념적 데이터 모델링: 추상화 수준이 높고 업무 중심적이고 포괄적인 수준의 모델링이다.( EA수립, 전사적 데이터 수집때 사용) - 데이터의 요구사항을 분석해 ERD를 생성하는 단계
  2. 논리적 데이터 모델링: 시스템으로 구축하고자 하는 업무에 대해 key, 속성, 관계 등을 정확하게 표현하는 수준 - 누가 어떻게 데이터에 엑세스하는지 관계를 ERD로 표현하고 정규화 진행(일관성, M:M관계 해소)
  3. 물리적 데이터 모델링: 실제 데이터에 이식할 수 있도록 성능, 저장 등 물리적인 성격을 고려해 설계하는 단계 - 어떻게 하드웨어에 실제로 표현될 것인가 (테이블, 칼럼 설계)

간단히 필요한 데이터를 먼저 파악하고, 이 데이터들이 어떤 관계를 갖는지 key 와 속성, 관계를 명확히 해주고, 실제 데이터베이스를 만들어주는 과정으로 데이터 베이스의 모델링이 이루어진다.

옛날에는 파일 방식으로 사용자 접점의 인터페이스로 운영되었다. 파일에 필요한 데이터를 모아놓고 수정하면서 사용하였기에 사용자에 따라 데이터의 구성이 바뀌며 데이터 중복으로 수정이나 삭제에 대응하기 어려워 데이터 간 불일치가 일어나기 쉽다. 이를 보완하기 위해 Client/Server 방식으로 나누어 독립성을 가지게 해 유지보수, 데이터 중복, 복잡해지는 데이터에 효율적으로 대응할 수 있도록 데이터베이스 시스템으로 바뀌었다.  

데이터 모델링의 이해 - 데이터 독립성 (tistory.com)

 

데이터 독립성은 

  1. 외부 스키마: view 단계 여러 개의 사용자 관점으로 구성, 사용자에게 가까운 단계로 개개인이 보는 관점에 관련되어 있다. 
  2. 개념 스키마: 모든 사용자 관점을 통합한 조직 전체의 DB를 기술하는 것.
  3. 내부 스키마: DB가 물리적으로 저장된 형식, 실제로 데이터가 저장되는 방식을 표현하는 것.

3가지로 개념이 분리되면서 각각의 영역에 대한 독립성을 지킬 수 있다. 개념-외부 간의 독립성은 논리적 독립성, 내부-개념 간의 독립성은 물리적 독립성이라 한다.

 

따라서 좋은 데이터 모델은 다음과 같은 속성을 가지고 있어야 한다.

  1. 완전성: 모든 데이터가 데이터 모델에 정의되어야 한다.
  2. 중복배제: 동일 사실은 한번만 기술해야 한다.
  3. 업무규칙: rule을 모델에 잘 반영하고 이는 관련자들에게 잘 공유될 수 있어야한다.
  4. 데이터 재사용: 통합된 데이터 모델을 가지고 확장성을 갖도록 해야 테이블을 늘리지 않고 재사용이 가능하다.
  5. 의사소통: 업무규칙을 관련자가 잘 받아들이고 활용하도록 한다.
  6. 통합성: 여러 곳에 데이터가 존재하지 않도록 한번만 정의되도록 잘 통합하여야 한다.

 

엔터티 (entity)

엔터티는 업무에서 관리해야 하는 데이터의 집합을 의미하며, 저장되고 관리되어야 하는 데이터다. 

 

쉽게 생각해서 엔터티는 데이터의 집합이다. 그리고 이걸 구조화해서 만들어 놓은 것이 하나의 테이블이 된다. 즉 테이블이라고 봐도 될 것 같다. 

 

엔터티는 몇 개의 특징을 만족해야 하는데

  1. 반드시 업무에 필요해야 한다. 
  2. 유일한 식별자에 의해 식별이 가능해야한다. (Primary Key)
  3. 인스턴스들의 집합이어야 한다. (인스턴스는 엔터티의 단수형이다. 즉 고객 엔터티 안에는 고객이 2명 이상 있어야 한다)
  4. 업무 프로세스에 이용되어야 한다.
  5. 반드시 속성이 있어야 한다.
  6. 엔터티는 다른 엔터티와 최소한 1개의 관계를 맺어야한다. (Foreign Key)

속성과 인스턴스라는 말이 나오는데 인스턴스는 엔터티의 단수형이다. 예를 들어 고객 정보 엔터티가 있다면 고객 한명 한명이 모여서 고객 정보라는 데이터의 집합(엔터티)이 이루어지는 것이고 이를 구성하는 각각의 고객 정보를 인스턴스라고 말한다. 즉 엔터티에 하나의 인스턴스 밖에 없다면 그 엔터티는 의미가 없다는 뜻이다.

속성은 각 인스턴스의 관리하고자 하는 데이터의 단위이다. 예를 들어 고객 엔터티가 있다면 고객 1명의 데이터를 인스턴스라고 하고 이 고객 한 명이 갖는 여러 데이터(이름, 생년월일, 주소, 회원 ID) 를 각각 속성이라고 말한다. 테이블의 칼럼과 같은 의미.

 

 

엔터티도 분류 기준에 따라 몇 가지로 나눌 수 있다. 

 

유무형에 따른 분류

종류
설명
유형 엔터티
물리적인 형태가 있고 안정적이며 지속적으로 활용되는 데이터의 집합이다. 
예) 고객,강사,사원 등
개념 엔터티
물리적인 형태가 없고 관리해야 할 개념적 정보로 구분되는 데이터의 집합이다.
예) 거래소,종목, 고스닥 종목, 생명보험 상품
사건 엔터티
업무를 수행할 때 발생하는 데이터의 집합이다. 
예) 주문, 체결, 취소주문, 수수료 청구 등

 

발생 시점에 따른 분류

종류
설명
기본 엔터티
독립적으로 생성이 가능하고 고유한 주식별자를 가지는 데이터의 집합이다. 
예) 물품, 고객 등
중심 엔터티
기본 엔터티에서 발생되고 중심적인 역할을 하는 데이터의 집합이다.
예) 주문, 취소, 체결
행위 엔터티 
두개 이상의 부모 엔터티로부터 발생되고 상관 모델링을 통해 도출되는 데이터의 집합
예) 주문 이력, 체결 이력 등

 

예를 들어 고객이 물품을 주문한다는 하나의 이벤트에서 발생하는 데이터를 엔터티 별로 분류한다면

고객, 물품 등의 물리적인 데이터는 유형 엔터티 (고객 ID, 이름, 주소, 물품 ID, 이름, 주소 등)

고객이나 물품이 어느 카테고리에 속하는지 의미하는 개념 엔터티 (고객 분류, 물품 분류)

고객이 물품을 주문하면서 생기는 주문 상세 내용을 사건 엔터티로 나눌 수 있다. (주문 번호, 주문자, 주문 물품, 배송지)

 

식별자

식별자는 하나의 엔터티에 구성된 여러 속성 중에 엔터티를 대표할 수 있는 속성이다. 일반적으로 고유하게 부여되는 값으로 회원 ID, 주민번호, 계좌번호 등이 있다. 

위에 엔터티의 속성을 살펴보면 각 엔터티는 유일한 식별자에 의해 구분되어야 한다는 말이 있는데 이 유일한 식별자가 바로 Primary Key이다. 즉 엔터티는 각 인스턴스를 구분할 수 있는 식별자를 가져야 한다는 뜻이다. 

 

주식별자(PK)의 특징은 다음과 같다. 

  1. 유일성: 엔터티 내 모든 인스턴스들이 유일하게 구분되어야 한다.
  2. 최소성: 주식별자를 구성하는 속성의수는 유일성을 만족하는 최소의 수가 되어야 한다.
  3. 불변성: 지정된 주식별자는 자주 변하지 않는 값이어야 한다.
  4. 존재성: NULL값을 허용하지 않는다.

 

또한 엔터티는 다른 엔터티를 참조하며 관계를 가질 수 있는데 다른 엔터티와의 관계로 만들어지는 식별자를 Foreign key라고 한다. Foreign Key는 데이터의 참조 무결성을 유지하는 데 중요한 역할을 한다.  

 

예를 들어 주문 엔터티에서는 주문 번호가 PK 가 될 것이고 고객 엔터티에서는 고객 ID가 PK가 될 것이다. 주문 엔터티에서는 주문한 주문자가 누구인지 고객 엔터티와 연결해야 하기 때문에 고객 엔터티의 PK인 고객 ID를 참조해 외래키(Foreign Key)로 사용한다. 주문 엔터티에서는 고객 엔터티의 고객 ID를 참조하기 때문에 고객 엔터티에 없는 정보는 입력되지 않는다. (참조할 데이터가 없기 때문에 참조 무결성이 깨진다고 판단된다.)

 

예를 들어 주문을 했는데 주문자의 정보가 고객 ID에 없다면 이 주문은 오류가 뜨면서 주문 엔터티에 입력되지 않는다. 

 

또한 데이터를 삭제할 때에도 참조 무결성을 지키기 위해 여러 제한 사항이 있다. 예를 들어 고객 엔터티에서 고객 정보를 지우려 할 때, 이 고객의 데이터가 주문 엔터티에 참조되어 있다면 데이터를 지울 수 없다. 그래서 주문 엔터티에서 이 고객이 주문한 내역을 전부 삭제해 참조하지 않는 상태로 만든 다음에야 고객 데이터를 지울 수 있다. 

 

식별자/ 비식별자 관계

외부 식별자(FK)는 자기 자신의 엔터티에서 필요한 속성이 아니라 다른 엔터티와의 관계를 통해 자식쪽에 생성되는 속성이며 이를 주식별자로 정의하면 식별자관계가 형성된다. 

한편 부모로부터 속성을 받았으나 자식 엔터티의 주식별자로 사용하지는 않고 부모와의 연결로만 사용하면 이를 비식별자 관계라고 말한다.

 

비식별자 관계에 의한 외부속성을 생성하는 조건으로

  1. 자식 엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하여 부모 없는 자식이 생성될 수 있는 경우
  2. 엔터티별로 데이터의 생명주기가 달라 부모가 자식을 남기고 먼저 소멸할 수 있는 경우
  3. 여러 개의 엔터티가 하나의 엔터티로 통합되었는데 각각의 엔터티가 별도의 관계를 가질 경우( 통합된 엔터티 전체를 식별할 수 없음)
  4. 자식 엔터티에서 주식별자로 사용해도 되지만 별도의 주식별자를 쓰는 게 더 유리할 경우