현업의 그 누구도 여러분께 "Item 테이블에 ItemSizeCd가 REG이면서 ItemCat가 BEV인 데이터만 보여주세요." 라고 친절하게 요청하지 않을 겁니다. 우리는 현업의 언어를 이해하기 위해 데이터를 이해해야 합니다.

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
    • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.
    • 전체 교육 슬라이드는 무료 오픈되어 있습니다: https://sweetquant.tistory.com/497

 

 

 

데이터 이해하기

SQL을 작성하는 이유는 데이터를 조회하거나 조작(변경, 입력, 삭제)하기 위해서입니다. 간단히 말하면 데이터를 다루기 위해 SQL을 사용합니다. 단지 SQL을 배우는 목적이 아니라 데이터를 다루기 위해 SQL을 배우는 것입니다.

그런데 우리는 우리가 다루어야 할 데이터에 대해 얼마나 알고 있나요?

많은 분들이 SQL만 배우면 취업이 되고 일하는데 문제가 없을거라고 생각합니다.

하지만, 실제 업무를 해보면 SQL 기술보다 중요한 것이 데이터를 아는 것입니다.

은행, 보험, 병원과 같은 특화된 업무일수록 더욱 데이터 이해를 필요로 합니다.

해당 업종의 취업 공고를 보면 경험자를 찾는 것을 어렵지 않게 볼 수 있습니다.

SQL을 활용해 기계적으로 데이터를 추출하는 일은 많은 사람들이 할 수 있습니다.

다른 사람들보다 조금 더 앞서 나가기 위해서는 SQL뿐만 아니라 데이터를 이해해야 합니다.

그리고 데이터를 이해하고 나면, SQL이 더 쉬워집니다.

SQL 교육을 해보면 개발자보다 업무 지식이 있거나, 데이터에 대한 이해가 빠른 사람들이 SQL을 잘 만드는 것을 자주 볼 수 있습니다.

 

데이터 이해하기 4단계.

바로 앞에서는 테이블 설계, 식별자, PK에 대해 이야기했습니다. 이것들은 데이터 이해를 위해 필요한 아주 기초적인 지식입니다. 이제 본격적으로 데이터 이해를 위해 테이블을 직접적으로 살펴볼 시간입니다.

데이터를 이해하기 위해서는 절대적인 경험과 시간이 필요합니다. 여기서 소개하는 방법으로 데이터를 완벽히 이해할수는 없습니다. 다만, 이 방법들을 통해 데이터와 조금 더 친숙해질 수 있으며, 결국 데이터를 조금 더 빨리 이해하는데 도움이 될 것입니다.

데이터 이해를 위해 아래와 같은 4 단계의 작업을 권장합니다. 순서상 4번을 가장 마지막에 놓았지만 4번은 언제 진행해도 상관없습니다. 1번과 4번을 병행하는 것도 좋은 방법입니다.

  1. ERD와 실제 데이터 살펴보기.
  2. ERD에서 관계 테이블 살펴보기
  3. 코드성 데이터 추적하기
  4. 자료형 살펴보기

​위 4단계로 Item(상품) 데이터를 이해해보도록 하겠습니다.

1. ERD와 실제 데이터 살펴보기 - Item(상품) 테이블

데이터 이해를 위해 가장 먼저 할 일은 아래와 같이, ERD와 실제 저장된 데이터를 조회하는 것입니다.

 

ERD로 테이블의 각 컬럼이 의미하는 바를 확인하고, 데이터를 통해 각 컬럼별로 어떤 값들이 있는지 살펴봅니다. 그리고 컬럼별로 자신의 생각을 정리합니다. 이것만으로 데이터와 한층더 가까워집니다. 살펴본 내용을 아래와 같이 정리해봅니다.

  • ItemId: 상품(Item)을 구별하는 식별자, PK 컬럼이다.
  • ItemNm: 상품의 전체 명칭 값이 들어가 있음
  • ItemCat: 상품카테고리, COF, BKR과 같은 값이 있음
    • 해당 값 들의 의미를 좀 더 조사해볼 필요가 있음
  • ItemSizeCd: 상품의 사이즈를 나타내는 코드
    • BIG과 REG가 있음, REG는 Regular 같음
  • HotColdCd: Hot/Cold 구분을 나타내는 코드. 실제 값도 HOT 아니면 COLD
  • LaunchDt: 상품이 출시한 일자

이처럼 자신만의 생각으로 컬럼이 의미하는 바를 정리해보기 바랍니다. 그리고 PK 컬럼이 무엇인지 반드시 기억해두기 바랍니다. PK 컬럼은 나중에 조인에도 자주 사용되며, 데이터를 정확히 처리하기 위해 반드시 필요한 속성입니다.
이와 같은 정리가 틀렸을 수도 있습니다. 틀리더라도 정리를 해보는 것이 중요하며 나중에 틀린 점은 하나씩 바로 잡으면 됩니다. 업무 담당자나 개발자, 선배 등에게 질문이 필요한 내용은 잘 체크해놓고 기회가 있을 때 질문하면 됩니다.
​​

2. ERD에서 관계 테이블 살펴보기

ERD를 살펴보면, Item 테이블과 관계선으로 연결된 테이블을 발견할 수 있습니다. 아래와 같이 Item(상품) 테이블과, ItemCat(상품카테고리), ItemPrcHist(상품가격이력), OrdDet(주문상세) 테이블이 연결되어 있습니다. 이를 통해 Item 테이블이 아래 테이블들과 관련이 있구나 정도만 기억해도 성공입니다.

 


관계에 대해 정확히 이해하기 위해서는 관계선과 관계차수에 대한 이해가 필요한데, 아직은 이 부분은 이해하지 못해도 괜찮습니다. 안타깝게도 ERD에 이와 같은 관계선 자체가 없는 경우도 실제로 많답니다.
관계 있는 테이블을 하나씩 조회해보면서 데이터를 살펴보며, 어떤 정보가 있는지 살펴봅니다. 이는 나중에 데이터를 확장해서 분석하는데 큰 도움이 됩니다.
테이블을 하나씩 조회하다 보면 ItemCat(상품카테고리) 테이블에 BEV, BKR과 같은 값의 의미가 저장된 것을 알 수 있습니다. 이 값은 Item(상품) 테이블에 ItemCat 컬럼에도 있던 내용입니다. ItemCat 테이블을 통해 BEV가 무엇인지, BKR이 무엇인지 확인할 수 있다는 것을 알 수 있습니다.

SELECT  T1.*
FROM    startdb.ItemCat T1;

-- 결과
ItemCat  ItemCatNm  
-------  ---------  
BEV      음료       
BKR      베이커리   
COF      커피

 

3. 코드성 데이터 추적하기

시스템을 설계하면 다양한 코드성 데이터가 정의됩니다.

코드성 데이터는 기준코드(공통코드, 기초코드, 기본코드등 다양한 이름으로 불립니다. 여기서는 기준코드란 이름을 사용하겠습니다.)란 테이블을 만들어  관리하는 것이 일반적입니다.

대부분의 업무 프로세스의 상태나 유형들은 코드화되서 관리되며, 이러한 코드에 따른 값들이 기준코드 테이블 안에 데이터로 관리됩니다.

처음으로 접한 데이터베이스라면 이 기준코드 테이블 명이 무엇인지 빨리 파악해 놓으면 좋습니다.

그리고 중요한 코드 몇 개 외워놓는 것도 앞으로 데이터를 활용하는데 큰 도움이 됩니다.

 

우리가 실습 중인 데이터베이스에는 BaseCdDv(기준코드구분)와 BaseCd(기준코드) 테이블에 코드성 데이터의 정보가 담겨있습닙다. BaseCdDv는 기준코드의 종류를 정의하기 위한 부모 테이블로, 실제 기준코드에 따른 값은 BaseCd 테이블만 확인하면 됩니다. BaseCdDv와 BaseCd 테이블은 아래와 같은 구조입니다.

 

 

우리가 사용 중인 startdb의 테이블들에는 기준코드 사용 규칙이 있습니다. 기준코드로 등록된 값을 가지게 되는 컬럼은, 컬럼명 자체를 기준코드구분(BaseCdDv) 값으로 사용합니다. 그러므로 Item(상품) 테이블에 ItemSizeCd(상품사이즈코드)란 컬럼의 코드 데이터들을 확인하고 싶다면, 아래와 같이 BaseCd 테이블에 BaseCdDv 조건으로 ItemSizeCd를 사용하면 됩니다. 아래 SQL의 결과를 통해 ItemSizeCd에는 BIG과 REG란 코드 값이 있고 그에 따라 언어(LangDvCd)별로 코드 명을 관리하는 것을 알 수 있습니다.

SELECT  T1.*
FROM    startdb.BaseCd T1
WHERE   T1.BaseCdDv = 'ItemSizeCd';

BaseCdDv    BaseCd  LangDvCd  BaseCdNm      SortOrder  
----------  ------  --------  ------------  ---------  
ItemSizeCd  BIG     EN        Big Size      2          
ItemSizeCd  BIG     KR        큰 사이즈     2          
ItemSizeCd  REG     EN        Regular Size  1          
ItemSizeCd  REG     KR        기본 사이즈   1

 

Item(상품) 테이블의 HotColdCd 컬럼에 대한 코드와 한글 코드명만 알고 싶다면 아래와 같이 조회를 해보면 됩니다.

SELECT  T1.*
FROM    startdb.BaseCd T1
WHERE   T1.BaseCdDv = 'HotColdCd'
AND     T1.LangDvCd = 'KR';

BaseCdDv   BaseCd  LangDvCd  BaseCdNm  SortOrder  
---------  ------  --------  --------  ---------  
HotColdCd  COLD    KR        차가운    2          
HotColdCd  HOT     KR        뜨거운    1

 

이와 같은 데이터를 구성하는 코드 데이터는 데이터를 집계하거나 추출하는 주요 조건으로 자주 사용됩니다. 업무 처리에도 자주 사용되는 조건입니다. 그러므로 주요 코드 데이터 몇 개 정도는 외우고 SQL을 작성하시면 조금 더 편하고 효율적으로 SQL을 작성할 수 있습니다.

​​

4. 자료형 살펴보기

마지막으로 DESC 명령어를 통해 테이블의 자료형을 살펴봅니다. Comment도 같이 보고 싶다면 DESC가 아닌 아래 SQL을 사용해 볼 수 있습니다. 이 과정을 통해 각 컬럼별로 어떤 자료형을 사용하고 있는지 익혀두는 것입니다.

SELECT  T1.TABLE_SCHEMA DB ,T1.TABLE_NAME Tab
        ,T1.COLUMN_NAME Col ,T1.COLUMN_COMMENT Cmt
        ,T1.ORDINAL_POSITION Pos ,T1.COLUMN_TYPE Typ
        ,T1.IS_NULLABLE Null_YN ,T1.COLUMN_KEY Ky
FROM    INFORMATION_SCHEMA.COLUMNS T1
WHERE   T1.TABLE_NAME = 'Item'
AND     T1.TABLE_SCHEMA = 'startdb'
ORDER BY pos ASC;

-- 결과
DB       Tab   Col         Cmt                 Pos  Typ           Null_YN  Ky   
-------  ----  ----------  ------------------  ---  ------------  -------  ---  
startdb  item  ItemId      상품ID              1    varchar(40)   NO       PRI  
startdb  item  ItemNm      상품명              2    varchar(100)  YES           
startdb  item  ItemCat     상품카테고리        3    varchar(40)   YES      MUL  
startdb  item  ItemSizeCd  상품사이즈코드      4    varchar(40)   YES           
startdb  item  HotColdCd   아이스/HOT구분코드  5    varchar(40)   YES           
startdb  item  LaunchDt    출시일자            6    date          YES

 

4번 단계는 1단계 과정에서 같이 작업하는 것도 좋습니다. 대부분의 컬럼이 VARCHAR 형태의 문자형 데이터인 것을 알 수 있습니다. 출시일자인 LaunchDt만 DATE 자료형인 것을 인지하고 있으면 될거 같습니다.

 


네 단계를 거쳐 Item 테이블을 살펴봤습니다. 이 과정을 통해 Item 데이터와 좀 더 가까워졌기 바랍니다.

Item 데이터와 충분이 가까워졌다면, 이제 현업이 아래와 같이 요구하는 것을 알아 들을 수 있을 겁니다.

음료 상품 중에서 레귤러 사이즈의 상품만 보여주세요.

 

현업의 그 누구도 여러분께 "Item 테이블에 ItemSizeCd가 REG이면서 ItemCat가 BEV인 데이터만 보여주세요." 라고 친절하게 요청하지 않을 겁니다. 우리는 데이터를 이해하고 현업의 언어를 번역해 데이터를 추출하거나 분석해야 합니다.

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

PK는 데이터의 정확성과 활용에 지대한 영향을 줍니다. PK를 정하기 위해 고민과 고민을 거듭해야 합니다.
이러한 고민의 시간은 자신의 성장에 큰 도움이 될 것이며, PK 선정을 위해 고심한 시간은 전혀 아깝지 않습니다

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
    • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.
    • 전체 교육 슬라이드는 무료 오픈되어 있습니다: https://sweetquant.tistory.com/497

지금까지 아주 간단한 SELECT 기초에 대해 익혔습니다.

진도를 더 나가기 전에 약간 원론적이지만 중요한 부분을 살펴보고 넘어가야 합니다.

바로 우리가 활용할 데이터를 이해하는 방법입니다.

 

 

데이터 이해하기 - 식별자와 PRIMARY KEY

MySQL, ORACLE, PostgreSQL과 같은 DBMS에서 SQL로 다루는 데이터는 관계형 데이터입니다.

여기서 관계(Relation)란 데이터를 행과 열로 조직화한 구조를 의미합니다. 즉, 테이블을 말합니다.

 

테이블은 관계형 데이터 모델 개념을 사용해 설계됩니다.

관계형 데이터 모델링은 데이터 활용 능력 발전에 매우 중요한 기술입니다.

SQL로 데이터를 활용할 수 있지만, 그 전에 제대로 된 테이블 구조에 데이터가 저장되어 있어야 합니다.

테이블 구조에 따라 SQL 작성 방법이 달라집니다. 또한 테이블 구조에 문제가 있으면 정확한 데이터 추출이 불가능할 수도 있습니다.

그러므로 SQL에 대한 공부가 어느 정도 마무리되었다면, 관계형 데이터 모델링 공부에 시간을 투자해보시기 바랍니다.

제대로 데이터를 쌓아야, 제대로 데이터를 활용할 수 있으니까요.

나중에는 SQL만 공부한 사람과 SQL과 데이터 모델링을 모두 공부한 사람간의 데이터 활용 능력은 매우 큰 차이가 날 수 있습니다.

테이블 설계 과정을 아주 간단하게 살펴보고 넘어가도록 하겠습니다.
관계형 데이터 모델은 개념 설계, 논리 설계, 물리 설계의 세 단계로 이루어집니다.

  • 개념 설계: 관리할 데이터의 핵심적인 개념만 정리해서 표현합니다. 주로 엔티티명(논리 테이블명)과 식별자 정도를 정의합니다.
  • 논리 설계: 개념 설계를 좀 더 상세화합니다. 엔티티(논리 테이블명)에 필요한 모든 속성(컬럼의 논리명)을 도출합니다.
  • 물리 설계: 논리 설계의 결과를 실제 구현할 DBMS에 맞게 설계하는 과정입니다.

 

실제 프로젝트를 해보면, 논리 설계와 물리 설계를 분리해 진행하는 경우는 드뭅니다.

다양한 이유로 논리 설계와 물리 설계가 동시에 이루어지는 경우가 많습니다.

관계 데이터를 설계하는 과정에서 중요한 개념 중 하나로 정규화(Normaliztion)가 있습니다.
개념 설계부터 물리 설계까지 항상 정규화를 유념해서 설계를 진행하게 됩니다.
(여기서는 정규화에 대해 별도 설명하지 않습니다. 매우 긴 내용이니까요.)

관계형 데이터 모델 기법을 이용해 테이블을 설계할 때는 ERD(Entity-Relation-Diagram) 툴을 사용합니다.

대표적인 툴로 ERWIN이 있으며, 우리나라에서는 DA#도 많이 사용됩니다. 안타깝게도 유료툴입니다.

개인 연습용으로 ERD를 그려보고 싶다면 ERD-CLOUD와 같은 웹상의 무료 플랫폼도 있으니 참고하시기 바랍니다.

ERD 툴로 설계된 상품 테이블과 실제 저장된 상품 데이터를 비교해보면 아래와 같습니다.

 


테이블에서 데이터를 조회하면 위 그림의 오른쪽과 같이 컬럼이 가로로 펼쳐지고 저장된 값들이 위에서 아래로 출력됩니다. 그런데, ERD Tool로 테이블을 설계할 때는 그림 왼쪽과 같이 컬럼을 위에서 아래로 채워가면서 세로로 표시합니다.

이처럼 컬럼을 세로로 나열해야 더 많은 테이블을 효율적으로 설계할 수 있습니다.

테이블 설계 과정에서 가장 중요한 것 하나를 뽑으라면 바로 PK(Primary Key)입니다.

PK를 이해하려면 식별자(Identifier)에 대해서 먼저 알아야 합니다.​
식별자는 데이터를 식별할 수 있는 속성(컬럼)을 뜻합니다. 데이터를 식별할 수 있다는 것은, 데이터 집합에서 한 건의 데이터만 정확히 골라낼 수 있다는 뜻이기도 합니다.

 

A 대학교에 재학 중인 학생 데이터 집합의 식별자로 학번을 사용할 수 있습니다.

한 학교내에서 학번은 중복되지 않습니다. 9627015란 학번을 가진 학생이 두 명 이상 존재할 수 없는 것이죠.

그러므로 학번을 이용하면 정확히 한 명의 학생만 찾아낼 수 있습니다.

이처럼 데이터를 구분해 한 건을 정확히 골라낼 수 있는 속성을 식별자라고 합니다.

우리가 코인 노래방에서 원하는 노래를 정확히 선택해서 부르려면 노래 번호를 입력해야 합니다.

노래 번호가 노래의 식별자가 되는 것이죠.

하나의 데이터 집합은 여러 개의 식별자가 있을 수 있습니다.

다시 학생 데이터 집합으로 돌아가보죠.

학번 외에도 주민등록번호, 이메일, 핸드폰 번호도 식별자로 사용할 수 있습니다.

또한 식별자는 여러 속성을 결합해서 정의할 수도 있습니다.

학생이 수업을 신청한 "수강신청"이라는 데이터 집합은 "학번, 과목, 학기"(예: 2023년 1학기, 2023년 2학기) 세 개의 속성을 결합해 식별자로 사용할 수 있습니다.

식별자에 대해 정리해보면 아래와 같습니다.

  • 식별자는 데이터 집합(테이블)에서 데이터 한 건을 유일하게 식별해 낼 수 있는 속성이다.
  • 식별자는 데이터 집합별로 여러 개 있을 수 있다.
  • 하나의 식별자는 여러 속성(컬럼)을 결합해 사용할 수 있다.

​지금까지 식별자를 열심히 설명한 이유는 PK(Primary Key)를 설명하기 위함이었습니다.
그런데 식별자를 이해했다면 PK를 이미 이해한 것과 같습니다. PK는 데이터 집합의 여러 식별자 중에서 대표로 사용하는 식별자이니까요.

예를 들어, 학생의 식별자로 학번, 주민등록번호, 이메일, 핸드폰 번호가 있는데, 이 중에 대표 식별자 하나를 정합니다.

이 대표 식별자가 테이블 생성 시 바로 PK 속성(제약 조건)으로 지정됩니다.

대표 식별자는 데이터 집합을 가장 잘 표현할 수 있으며, 변경되지 않으며, 노출 시 보안에 문제가 없는 속성을 사용하는 것이 좋습니다.

이외에도 다양한 부분을 고려해 대표 식별자를 정하게 됩니다.

학생 데이터 집합의 대표 식별자로는 학번이 가장 적절합니다. 따라서 학생 테이블의 PK로 학번이 선정됩니다.

앞에서 "테이블 설계 과정에서 가장 중요한 것 하나를 뽑으라면 바로 PK(Primary Key)입니다."라고 언급했습니다.

데이터를 활용하려면 데이터의 정확성이 뒷받침되어야 합니다.

데이터의 정확성을 위해서는 중복된 데이터가 있어서는 안됩니다. 이를 보장하기 위해 필요한 최소한의 장치가 바로 PK입니다.

데이터를 활요하기 위해서는 필요한 데이터를 정확히 찾아 낼 수 있어야 합니다. 이를 위해 사용하는 대표적인 조건 속성도 PK 컬럼입니다.

또한 데이터를 보다 다채롭게 활용하기 위해서는 데이터와 데이터를 연결해야 합니다. 일반적으로 데이터 연결을 위해 사용하는 조건 컬럼이 바로 PK와 FK 컬럼입니다. PK 컬럼 정의에 따라 데이터 연결이 쉬워질 수도 있고 복잡해 질 수도 있습니다.

이처럼 PK는 데이터의 정확성과 활용에 지대한 영향을 줍니다. PK를 정하기 위해 고민과 고민을 거듭해야 합니다.

이러한 고민의 시간은 자신의 성장에 큰 도움이 될 것이며, PK 선정을 위해 고심한 시간은 전혀 아깝지 않습니다.

 

오늘은 여기까지입니다. 감사합니다.



[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
    • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.
    • 전체 교육 슬라이드는 무료 오픈되어 있습니다: https://sweetquant.tistory.com/497


ORDER BY

ORDER BY 절은 조회 데이터의 정렬 순서를 결정합니다.

ORDER BY는 SELECT SQL의 가장 마지막에 사용합니다. ORDER BY 절 뒤로 정렬 기준으로 사용할 컬럼을 지정해 주면 됩니다.

아래와 같이 SQL을 실행해보면 상품명(ItemNm)의 순서로 데이터가 정렬되어 출력됩니다. 이때, ORDER BY 컬럼명 뒤에 특정한 기준을 정의하지 않으면 작은 값이 먼저 나오고 큰 값이 나중에 나오는 오름차순으로 정렬이 됩니다. 결과를 보면 ItemNm 값이 가장 작은 '레몬에이드'가 가장 먼저 나오고, 그 다음에는 그 다음으로 큰 값인 '마카롱'이 출력되어 있습니다. (문자의 정렬은 문자의 크기 순서로 이루어지는데 기본적으로 가나다 순서를 따릅니다. 그러므로 ㄹ이 앞에 있는 레몬에이드가 ㅁ이 앞에 있는 마카롱보다 작은 값이 됩니다.)

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
ORDER BY ItemNm;

-- 결과
ItemId  ItemNm               ItemCat  
------  -------------------  -------  
LEMR    레몬에이드(R)        BEV      
MACA    마카롱(R)            BKR      
BGLR    베이글(R)            BKR      
BMFR    블루베리머핀(R)      BKR 
… 생략 …

 


데이터를 정렬하는 방법은 두 가지가 있습니다. 하나는 작은 값이 먼저 나오고 큰 값이 나중에 나오는 오름차순이고 다른 하나는 정 반대로 처리되는 내림차순입니다. 내림차순은 큰 값이 먼저 나오고 작은 값이 나중에 나옵니다.

출력되는 데이터를 오름차순하고 싶다면 ORDER BY의 컬럼명 뒤에 ASC 키워드를 내림차순하고 싶다면 DESC 키워드를 사용합니다.

위의 SQL과 같이 ASC, DESC를 명시하지 않으면 기본적으로 오름차순 처리됩니다.

아래는 상품명(ItemNm)을 내림차순 정렬해 데이터를 출력하는 SQL입니다. 상품명의 값이 가장 큰 핫초코(R)이 가장 먼저 출력된 것을 알 수 있습니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
ORDER BY ItemNm DESC;

-- 결과
ItemId  ItemNm               ItemCat  
------  -------------------  -------  
HCHR    핫초코(R)            BEV      
HCHB    핫초코(B)            BEV      
FLTR    플랫화이트(R)        COF      
CLR     카페라떼(R)          COF 
… 생략 …


여러 컬럼의 ORDER BY

ORDER BY 절에는 콤마를 사용해 여러 컬럼을 지정할 수 있습니다. ORDER BY에 여러 컬럼을 지정하면 가장 왼쪽 컬럼부터 차례대로 정렬이 처리됩니다.


​아래는 상품종류(ItemCat)가 BEV(음료), BKR(베이커리)인 데이터를 HotColdCd 컬럼으로 정렬하는 SQL입니다. 아직은 ORDER BY에 하나의 컬럼만 사용했습니다. ORDER BY HotColdCd에 정렬 방향을 지정하지 않았기 때문에 작은 값이 먼저 나오는 오름차순으로 결과가 출력됩니다.

SELECT  HotColdCd ,ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemCat IN ('BEV','BKR')
ORDER BY HotColdCd;

-- 결과
HotColdCd  ItemId  ItemNm           ItemCat  
---------  ------  ---------------  -------  
COLD       CITR    유자에이드(R)    BEV      
COLD       LEMR    레몬에이드(R)    BEV      
COLD       ZAMB    자몽에이드(R)    BEV      
COLD       BMFR    블루베리머핀(R)  BKR      
COLD       CMFR    초코머핀(R)      BKR      
HOT        HCHB    핫초코(B)        BEV      
HOT        HCHR    핫초코(R)        BEV      
HOT        BGLR    베이글(R)        BKR      
HOT        MACA    마카롱(R)        BKR

 

 

결과를 보면, COLD인 상품이 먼저 출력되고 HOT인 상품이 나중에 출력되고 있습니다.

이번에는 위 SQL의 ORDER BY 절에 ItemId도 추가합니다. 아래와 같이 말이죠.

SELECT  HotColdCd ,ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemCat IN ('BEV','BKR')
ORDER BY HotColdCd, ItemId;

-- 결과
HotColdCd  ItemId  ItemNm           ItemCat  
---------  ------  ---------------  -------  
COLD       BMFR    블루베리머핀(R)  BKR      
COLD       CITR    유자에이드(R)    BEV      
COLD       CMFR    초코머핀(R)      BKR      
COLD       LEMR    레몬에이드(R)    BEV      
COLD       ZAMB    자몽에이드(R)    BEV      
HOT        BGLR    베이글(R)        BKR      
HOT        HCHB    핫초코(B)        BEV      
HOT        HCHR    핫초코(R)        BEV      
HOT        MACA    마카롱(R)        BKR


​SQL 결과를 확인해보면, HotColdCd로 먼저 데이터가 정렬이 되어 있고, 같은 HotColdCd를 가진 데이터간에는 다시 ItemId로 정렬이 처리된 것을 알 수 있습니다. COLD인 상품들을 살펴보면, ItemId가 가장 작은 BMFR이 가장 먼저 나오고 그 다음에 CITR, CMFR, LEMR, ZAMB 순으로 정렬된 것을 알 수 있습니다.

ORDER BY HotColdCd와 ORDER BY HotColdCd, ItemId 에 따른 결과를 하나의 그림에 담아서 살펴보면 다음과 같습니다.

 

이처럼, ORDER BY에 여러 컬럼을 사용하면 가장 왼쪽의 컬럼 기준으로 먼저 정렬이 된 후에, 가장 왼쪽의 컬럼 값이 같은 데이터는 다시 두 번째 컬럼 기준으로 정렬이 됩니다.

 


Tip. 한 건의 레코드는 공동운명체

당연한 이야기이지만 누군가는 궁금해할지 모를 내용을 하나 말씀 드리면,
한 건의 레코드(로우)를 구성하는 컬럼의 값들이 ORDER BY로 인해 각각 다른 레코드로 분리되는 경우는 없습니다.
한 건의 레코드를 구성하는 값들은 공동운명체로서 언제나 같이 이동합니다.

물론 나중에 분석함수 등을 사용하면, 다른 레코드의 값을 현재의 레코드로 가져올 수는 있지만 기본적으로 한 건의 레코드는 공동운명체입니다.


 

이번에는 세 개 컬럼을 ORDER BY에 사용한 SQL입니다. 그리고 컬럼별로 정렬 방향의 기준을 지정했습니다.
가장 왼쪽에 있는 ItemCat로 먼저 오름차순 한 후에, 같은 ItemCat를 가진 레코드들은 HotColdCd로 내림차순 정렬됩니다.
그리고 같은 ItemCat와 HotColdCd를 가진 레코드는 다시 ItemId로 오름차순 정렬되어 결과가 출력됩니다.



ORDER BY에 관련된 간단한 BOOSTER QUIZ도 풀어보기 바랍니다. 쉽습니다.~!

퀴즈를 풀어보기 위한 실습환경 구성은 아래 글을 참고하세요.

https://sweetquant.tistory.com/561

 

[StartUP SQL BOOK]실습 환경 구성하기

StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.현재 블로그에 전체 교육 슬라이드 무료로 오픈되어 있습니

sweetquant.tistory.com

 

 



 

[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
    • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.
    • 전체 교육 슬라이드는 무료 오픈되어 있습니다: https://sweetquant.tistory.com/497
 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

 

특수 조건자

​WHERE 절에서 컬럼과 조건 값의 비교를 위해 =, >, <와 같은 비교 조건자를 지금까지 사용했습니다.

WHERE 절에는 조건 비교를 위해 BETWEEN, LIKE, IN과 같은 특수 조건자도 사용할 수 있습니다.

 

 

BETWEEN

BETWEEN 조건은 이상(>=)과 이하(<=) 조건을 동시에 처리할 수 있는 조건자입니다.

BETWEEN 뒤에는 '시작 조건값 AND 종료 조건값'과 같이 두 개의 조건 값을 줄 수 이습니다.

BETWEEN과 AND는 항상 쌍으로 사용됩니다. BETWEEN의 AND는 WHERE 절에서 조건을 연결하는 AND와는 별개입니다.

 

아래 예제를 살펴보시죠. 아래 예제는 Item(상품) 테이블에서 ItemId가 'A' 이상이면서 'C' 이하인 데이터를 조회하고 있습니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemId BETWEEN 'A' AND 'C';

-- 결과
ItemId  ItemNm           ItemCat  
------  ---------------  -------  
AMB     아메리카노(B)    COF      
AMR     아메리카노(R)    COF      
BGLR    베이글(R)        BKR      
BMFR    블루베리머핀(R)  BKR

 


​위 SQL은 다음과 같이 이상(>=) 조건과 이하(<=) 조건 두개를 사용한 것과 동일합니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemId >= 'A'
AND     ItemId <= 'C';


LIKE

LIKE는 조건값의 일부가 포함된 데이터를 검색하기 위해 사용합니다.

LIKE는 문자형 데이터에만 사용할 수 있습니다.

LIKE를 사용할때는 아래의 특수문자를 사용해 와일드카드(대체문자)로 사용합니다.

  • %: 글자 수 상관 없이 아무 문자를 의미
  • _(Under Bar): 한 글자의 아무 문자를 의미

아래는 상품명(ItemNm)이 '카페'로 시작하는 데이터를 조회하는 SQL입니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemNm LIKE '카페%';

-- 결과
ItemId  ItemNm       ItemCat  
------  -----------  -------  
CLB     카페라떼(B)  COF      
CLR     카페라떼(R)  COF

 

반대로 %를 앞쪽에 놓고 뒤에 조건 값을 사용하면, 입력한 조건 값으로 끝나는 데이터를 검색할 수 있습니다.

아래는 상품명이 '(B)'로 끝나는 데이터를 조회하는 SQL입니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemNm LIKE '%(B)';

-- 결과
ItemId  ItemNm               ItemCat  
------  -------------------  -------  
AMB     아메리카노(B)        COF      
CLB     카페라떼(B)          COF      
HCHB    핫초코(B)            BEV      
IAMB    아이스아메리카노(B)  COF      
ICLB    아이스카페라떼(B)    COF


​%를 중간에 사용하면 시작 문자, 끝 문자가 일치하는 데이터를 검색할 수 있습니다.
아래는 '아이스'로 시작하면서 끝에가 '(B)'로 끝나는 상품명을 검색하는 SQL입니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemNm LIKE '아이스%(B)';

ItemId  ItemNm               ItemCat  
------  -------------------  -------  
IAMB    아이스아메리카노(B)  COF      
ICLB    아이스카페라떼(B)    COF

 

'_'는 한 글자의 아무 문자를 의미합니다. 아래 SQL을 실행해보시기 바랍니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemNm LIKE '카페라떼(_)';

-- 결과
ItemId  ItemNm       ItemCat  
------  -----------  -------  
CLB     카페라떼(B)  COF      
CLR     카페라떼(R)  COF


​LIKE를 앞에 NOT을 붙여 부정 조건으로 사용할 수 있습니다.

아래는 ItemCat(상품종류)가 'COF'(커피) 중에서 ItemNm(상품명)에 라떼가 포함되지 "않은" 데이터를 조회하는 SQL입니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemCat = 'COF'
AND     ItemNm NOT LIKE '%라떼%';

-- 결과
ItemId  ItemNm               ItemCat  
------  -------------------  -------  
AMB     아메리카노(B)        COF      
AMR     아메리카노(R)        COF      
EINR    아인슈페너(R)        COF      
FLTR    플랫화이트(R)        COF      
IAMB    아이스아메리카노(B)  COF      
IAMR    아이스아메리카노(R)  COF      
IEINR   아이스아인슈페너(R)  COF      
IFLTR   아이스플랫화이트(R)  COF



 

​IN

IN 조건은 하나의 컬럼에 여러 값에 대한 조건 값을 비교하기 위해 사용합니다.
아래와 같이 괄호안에 필요한 조건 값을 콤마로 구분해 여러개 사용하면 됩니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   ItemId IN ('AMB','IAMB','BGLR');

-- 결과
ItemId  ItemNm               ItemCat  
------  -------------------  -------  
AMB     아메리카노(B)        COF      
BGLR    베이글(R)            BKR      
IAMB    아이스아메리카노(B)  COF

 

위의 IN을 사용한 SQL은 아래와 같이 OR를 사용한 SQL로 변경할 수 있습니다.

SELECT  ItemId ,ItemNm ,ItemCat
FROM    startdb.Item
WHERE   (ItemId = 'AMB'
        OR ItemId = 'IAMB'
        OR ItemId = 'BGLR');


​SQL의 가독성을 위해 가능하면 OR 보다는 IN 조건을 권장합니다.
NOT LIKE와 마찬가지로 NOT IN으로 IN 조건을 부정 처리할 수 있습니다.
아래는 상품종류(ItemCat)가 'COF'(커피)이면서 Hot/Cold구분(HotColdCd)가 'HOT'인 상품 중에, ItemId(상품ID)가 'CLB'와 'CLR'이 아닌 상품만 조회하고 있습니다.

SELECT  ItemId ,ItemNm,ItemCat, HotColdCd
FROM    startdb.Item
WHERE   ItemCat = 'COF'
AND     HotColdCd = 'HOT'
AND     ItemId NOT IN ('CLB','CLR');

-- 결과
ItemId  ItemNm         ItemCat  HotColdCd  
------  -------------  -------  ---------  
AMB     아메리카노(B)  COF      HOT        
AMR     아메리카노(R)  COF      HOT        
EINR    아인슈페너(R)  COF      HOT        
FLTR    플랫화이트(R)  COF      HOT


​IN을 OR로 변경할 수 있는 것처럼 NOT IN도 NOT과 OR를 혼합한 SQL로 변경할 수 있습니다. 아래와 같습니다.

SELECT  ItemId ,ItemNm,ItemCat, HotColdCd
FROM    startdb.Item
WHERE   ItemCat = 'COF'
AND     HotColdCd = 'HOT'
AND     NOT (ItemId = 'CLB' OR ItemId = 'CLR');



WHERE 절에서 사용할 수 있는 특수 조건자로 BETWEEN, LIKE, IN을 살펴봤습니다.

제법 많이 사용하는 특수 조건자입니다.

 

지금까지 익힌 SQL 기술을 사용해 다음 BOOSTER QUIZ들을 직접 풀어보시기 바랍니다.

실습 문제를 풀어보고 싶다면 다음 글을 참고해 실습 환경을 구성하세요.

https://sweetquant.tistory.com/561

 

[StartUP SQL BOOK]실습 환경 구성하기

StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.현재 블로그에 전체 교육 슬라이드 무료로 오픈되어 있습니

sweetquant.tistory.com

 

 

 

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
    • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.
    • 전체 교육 슬라이드는 무료 오픈되어 있습니다: https://sweetquant.tistory.com/497
 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

데이터를 시행착오 없이 잘 활용하기 위해서는 데이터 자료형에 따른 크기 비교에 대한 이해가 필요합니다.

 

 

데이터의 크기 비교

​데이터를 구성하는 가장 기본적인 데이터 자료형은 문자 또는 숫자입니다. 여기에 하나를 더 추가하면 날짜 형식의 자료형이 있습니다. 이외에도 다양한 자료형이 있지만, 기본적으로 이 세 개의 자료형이 많이 사용됩니다.

데이터를 시행착오 없이 잘 활용하기 위해서는 데이터 자료형에 따른 크기 비교에 대한 이해가 필요합니다.

 

먼저, 숫자의 크기 비교는 매우 간단합니다. 숫자의 크기 비교는 유치원생도 할줄 알죠.
1보다 2가 크고, 2보다는 10이 큽니다. 숫자 값 자체에 크기가 있기 때문에 쉽게 비교할 수 있습니다.

날짜의 크기 비교는 어떨까요?

SQL이나 프로그램을 지금까지 해왔다면, '24년 5월 2일'이 '24년 5월 1일'보다 크다라는 것을 알고 있을겁니다.

그러나 가만히 생각해 보면 날짜에 크기라는 것이 있을까요? 두 날짜 모두 24시간이라는 똑같은 시간의 양을 가진 하루입니다. 다만, 프로그램에서는 날짜의 순서를 따져 크기를 결정합니다. 보통은 순서상 앞쪽의 날짜가 작은 값, 뒤쪽의 날짜가 큰 값이 됩니다. 그러므로 '24년 5월 2일'이 '24년 5월 1일'보다 큰 값이 됩니다.

이처럼 프로그램에서는 숫자가 아닌 형태의 데이터는 일정한 기준의 순서를 적용해 크기를 결정합니다.

프로그램뿐만 아니라 데이터베이스도 마찬가지입니다.

 

문자 역시 크기가 없습니다. 그러므로 문자도 일정한 순서에 의해 크기 비교가 이루어집니다.

일반적으로 알파벳 순서나 가나다 순서에 따라 크기가 결정됩니다.
B는 A보다 크고, C는 B보다 큰 값이 됩니다. A부터 Z까지 중에는 A가 가장 작은 값, Z가 가장 큰 값이 됩니다.

여기까지 이해하는데 어려움은 없을 것입니다.

문자열의 크기 비교

문자가 두 개 이상 합쳐진 것을 문자열이라고 합니다. 'CAFE'는 C, A, F, E라는 문자 네 개가 합쳐진 하나의 문자열입니다.

문자열을 구성하는 요소가 문자이므로 문자열의 크기 비교도 문자의 규칙을 따르게 됩니다.
다만, 문자열은 문자열 전체가 아닌 각 문자열의 앞 문자부터 차례대로 크기 비교를 수행합니다. 아래의 예를 보면 쉽게 이해가 될 것입니다.

  • 'CAFE'와 'AMERICANO'의 크기를 비교
    • 문자열 전체가 아닌 첫 번째 문자부터 차례대로 크기를 비교합니다.
    • 두 문자열의 첫 번째 문자인 'C'와 'A'를 비교하면, 'C'가 'A'보다 큽니다.
    • 첫 번째 문자에서 크기가 결정되었으므로 나머지 문자들은 더이상 비교하지 않습니다.
    • 첫 번째 문자가 큰 'CAFE'가 'AMERICANO'보다 큰 값으로 처리됩니다.
  • 'CAFE'와 'COFFEE'의 크기를 비교
    • 두 문자열의 첫 번째 문자가 'C'로 서로 같습니다.
    • 첫 번째 문자가 서로 같으므로 그 다음 문자인 'CAFE'의 'A'와 'COFFEE'의 'O'를 비교합니다.
    • 'A'와 'O'를 비교하면 'O'가 큽니다. 크기가 결정되었으므로 나머지 문자는 더이상 비교하지 않습니다.
    • 첫 문자가 서로 같으므로 두 번째 문자가 큰 'COFFEE'가 'CAFE'보다 큰 값으로 처리됩니다.

이처럼 문자열의 크기 비교는 가장 앞 문자부터 차례대로 크기 비교가 이루어진다는 점을 기억하기 바랍니다.

컴퓨터 프로그램에 익숙하지 않은 사람들에게는 낯설게 느껴질 수 있는 부분입니다.

 

문자와 문자열의 크기 비교 개념을 이해했다면 다음 SQL을 실행해보시기 바랍니다.
ItemId(상품ID)에 문자열로 크기 비교 조건을 넣었고, 그에 맞는 데이터가 어떻게 나오는지 한번씩 확인해보기 바랍니다.

-- ItemId가 AMZ보다 작거나 같은 데이터 조회
SELECT  ItemId ,ItemNm ,ItemCat, HotColdCd
FROM    startdb.Item
WHERE   ItemId <= 'AMZ';

-- ItemId가 AMA보다 작거나 같은 데이터 조회
SELECT  ItemId ,ItemNm ,ItemCat, HotColdCd
FROM    startdb.Item
WHERE   ItemId <= 'AMA';

-- ItemId가 C보다 작거나 같은 데이터 조회
SELECT  ItemId ,ItemNm,ItemCat, HotColdCd
FROM    startdb.Item
WHERE   ItemId <= 'C';



​문자형 숫자

SQL의 WHERE 절에 조건 값을 줄 때 일반적으로 숫자 또는 문자 형태의 조건 값을 사용할 수 있습니다.
숫자 조건을 줄때는 숫자를 바로 입력하면 되고, 문자 형태 조건 값을 주기 위해서는 조건 값을 싱글따옴표로 처리해야 합니다. 그러면, 아래와 같은 SQL의 WHERE 절에 입력한 조건 값 '1234'는 숫자일까요? 문자일까요?

SELECT  *
FROM    TAB
WHERE   TAB_COL = '1234';


위 SQL에서 조건 값으로 사용한 '1234'는 싱글따옴표 처리가 되어 있으므로 숫자가 아닌 문자열입니다. 1234라는 값 자체는 숫자이지만, 싱글따옴표 처리를 하게 되면 이는 숫자가 아닌 문자로 인식이 됩니다. 그러므로 '1234'는 문자열의 크기 비교 규칙을 따르게 됩니다. 아래 예를 살펴보도록 하겠습니다.

  • '1234'와 '23'의 크기 비교
    • 두 값에 모두 싱글따옴표 처리했기 때문에 문자열입니다.
    • 문자열은 첫 문자부터 차례대로 비교 처리합니다.
    • '1234'와 '23'의 첫 번째 문자인 '1'과 '2'의 비교가 먼저 이루어집니다.
    • 문자 '2'가 '1'보다 크므로, '23'이 '1234'보다 큰 값으로 판정이 됩니다.

숫자 1234와 23을 비교하면 어떻게 될까요? 숫자 비교는 숫자 값 전체로 비교합니다. 그러므로 1,234(천이백삼십사)가 23(이십삼)보다 큰 값이 됩니다.

컴퓨터 속의 데이터를 자주 접해보지 않은 분들이라면 이러한 내용이 헷갈릴 수 있습니다.

"값이 온전히 숫자여도 싱글따옴표가 사용되었다면 이는 문자열이다." 이 부분을 기억하시기 바랍니다. 그리고 "문자열은 문자열의 크기 비교 규칙을 따르게 된다"는 것도 기억하시면 됩니다.

 

문자 종류에 따른 정렬 순서

문자를 아래와 같이 크게 4개로 분류해 볼 수 있습니다.

  • 특수문자: !, *, #, @와 같은 특수 기호입니다.
  • 문자형숫자: 1, 2, 3과 같은 숫자이지만 문자로 처리된 경우입니다.
  • 알파벳: 영어의 알파벳
  • 한글 또는 각 나라의 언어

위와 같은 문자 종류는 "일반적"으로 특수문자, 문자형숫자, 알파베, 한글(각 나라의 언어) 순서로 크기가 커집니다. ("일반적"을 강조한 이유는 반드시 이러한 순서가 아닐 수 있기 때문입니다.)
아래 그림과 같습니다. 같은 문자 종류 안에서는 각 종류의 규칙에 따라 크기가 결정됩니다.

또한 일부 특수문자(@나 _(Under bar))는 알파벳보다 큰 값으로 판단되기도 합니다.

 

 

이러한 문자 종류의 크기와 문자 종류별 크기는 데이터베이스나 테이블 컬럼에 설정된 CHARACTER SET과 COLLATION에 의해 결정됩니다. 다시 말해, CHARACTER SET과 COLLATION을 무엇으로 설정했는지에 따라 다른 순서로 크기가 결정될 수도 있습니다. 그럼에도 불구하고 전반적으로는 위와 같은 순서를 가지니 참고하시기 바랍니다. SQL을 배우는 과정에서는 조금 어려운 이야기 일 수 있으므로, "일반적으로 특수문자, 문자형 숫자, 알파벳, 한글 순서로 크기가 커진다" 정도만 이해하시면 될거 같습니다.

 

 

데이터 자료형에 따른 SQL

앞에서 배운 내용을 실제 SQL에 적용해 보면 이해해보도록 하겠습니다. 

아래와 같이 TestWhere라는 테이블을 생성합니다. TestWhere 테이블은 Id1과 Id2, 두 개의 컬럼으로 구성되어 있습니다.
Id1은 숫자 자료형, Id2는 문자 자료형입니다.

CREATE TABLE startdb.TestWhere
(
    Id1 INT
    ,Id2 VARCHAR(40)
);



테이블을 생성한 후에 아래와 같이 INSERT 문장을 실행합니다.
INSERT문은 테이블에 데이터를 입력하는 SQL입니다. INSERT INTO 뒤에 테이블명을 적고,
INSERT할 컬럼들을 괄호안에 적어주면 됩니다. 그리고 VALUES 부분에 앞에서 적은 컬럼 순서에 맞쳐 입력할 값을 적어주면 됩니다.

INSERT INTO startdb.TestWhere (Id1      ,Id2)
                        VALUES('1000'   ,1000);


위 INSERT 문은 에러없이 정상 실행됩니다. 그런데 좀 이상한 점이 있지 않나요?
무엇이 이상한지 테이블 생성(CREATE)문과 비교해 가면서 고민해 보기 바랍니다.

Id1은 숫자 값을 저장할 수 있는 INT 자료형입니다. 그런데 VALUES에 입력하는 값은 '1000'으로 문자 형태로 입력을 했습니다. 이 경우 DBMS가 자동으로 문자 '1000'을 테이블의 자료형인 숫자 형태로 "자동형변환"을 수행해 입력을 처리합니다.
Id2의 경우는 반대입니다. 테이블의 컬럼은 문자를 담는 VARCHAR 자료형이지만, 입력하는 값은 1000 이라는 숫자 형태로 입력을 했습니다. 마찬가지로 DBMS가 자동으로 숫자 1000을 테이블의 자료형인 문자 형태로 자동형변환을 수행해 입력을 처리합니다. 그러므로 위 SQL은 에러없이 잘 작동합니다. 이와 같은 "자동형변환"은 DBMS마다 적용 규칙이 다르거나 허용하지 않는 경우도 있습니다.

아래 SQL은 어떻게 될까요? 아래 SQL은 에러가 발생합니다.
숫자형인 Id1에 문자로 'C001'을 입력했기 때문에, 'C001'의 'C'를 숫자로 자동 변환할 수 없어 에러가 납니다.

INSERT INTO startdb.TestWhere (Id1      ,Id2)
                        VALUES('C001'   ,'C001');

 

이번에는 아래 SQL을 살펴볼까요. Id1과 Id2에 '0100'이란 문자열을 저장하고 있습니다.

INSERT INTO startdb.TestWhere (Id1      ,Id2)
                        VALUES('0100'   ,'0100');


위 SQL은 에러없이 실행됩니다. 입력한 값을 SELECT도 해보죠.

SELECT SQL의 결과를 살펴보면, Id1에 방금 입력한 값이 0100이 아니라 100인 것을 알 수 있습니다.
앞에서 설명한 것처럼 문자열 '0100'은 입력되면서 Id1의 자료형인 숫자로 자동형변환이 됩니다.
일반적인 숫자 값은 0으로 시작하는 것을 허용하지 않기 때문에, 가장 앞의 0은 제거되고 100이란 숫자만 입력이 된 것입니다.

SELECT  *
FROM    startdb.TestWhere;

Id1   Id2   
----  ----  
1000  1000  
100   0100


이처럼, 테이블에 설정한 컬럼의 자료형에 따라 입력한 값이 원래의 의도와는 다른 값이 입력될 수 있습니다. 그러므로 항상 우리가 사용하는 테이블의 자료형을 확인하는 습관을 가져야 합니다.

 

이번에는 입력된 데이터를 다양한 조건으로 조회해봅니다. 조건 값에 따라 의도하지 않은 값이 나오는 경우도 있습니다.

-- [SQL-1]
-- 숫자 자료형인 Id1에 문자 '100'을 조건으로 입력
-- 문자 조건인 '100'이 숫자로 자동형변환되어 SQL이 처리됩니다.
-- 이러한 자동형변환은 DBMS마다 다를 수 있으며, 허용하지 않을 수도 있습니다.
SELECT  *
FROM    startdb.TestWhere
WHERE   Id1 = '100';

Id1  Id2   
---  ----  
100  0100  


-- [SQL-2]
-- 문자 자료형인 Id2에 문자 '100'을 조건으로 입력
-- 문자열은 앞 문자부터 차례대로 크기 비교 처리가 됩니다.
-- 조건값 '100'과 정확히 일치하는 Id2 값이 없으므로 조회되지 않습니다.
-- Id2에는 '1000'과 '0100'만 있습니다.
-- 같다 조건을 만족하려면 문자열의 모든 값이 완전히 일치해야 합니다.
SELECT  *
FROM    startdb.TestWhere
WHERE   Id2 = '100';


-- [SQL-3]
-- 문자 자료형인 Id2에 숫자 100을 조건으로 입력
-- 이 경우 Id2의 값을 모두 숫자로 변환한 후에 숫자 조건 값 100과 비교 처리가 됩니다.
-- 그러므로 앞의 SQL과 다르게 Id2가 '0100'인 데이터가 조회됩니다.
-- '0100'의 앞의 '0'이 제거된 100이란 숫자로 자동 변환되기 때문입니다.
SELECT  *
FROM    startdb.TestWhere
WHERE   Id2 = 100;

Id1  Id2   
---  ----  
100  0100

 

이처럼 조건 값을 숫자로 사용했는지, 문자로 사용했는지, 테이블의 원래 컬럼 자료형인지 숫자인지, 문자인지에 따라 조회되는 결과가 다른 것을 알 수 있습니다.

 

실제 운영되는 시스템들의 데이터들을 보면, 컬럼에 저장된 값 자체는 숫자로만 구성되어 있지만, 실제 컬럼의 자료형을 살펴보면 문자인 경우가 있습니다. 이 경우 조건 값을 테이블의 자료형과 같은 문자로 구현하지 않으면 정확한 데이터가 조회되지 않을 수 있습니다.

SQL로 데이터를 다루기 전에, 항상 다루고자 하는 데이터를 구성한 테이블의 컬럼 자료형을 살펴보시기 바랍니다. 보다 정확히 데이터를 다룰 수 있습니다.

끝으로 다음 실습에 혼선이 없도록 만든 테이블을 DROP 하고 마무리하겠습니다.

DROP TABLE startdb.TestWhere;

 

 


SQL을 배우는 과정에 조금 지루한 이야기를 하게 된거 같습니다.

하지만 이 부분을 명확히 알고 있어야, 다양한 형태의 데이터를 혼선 없이 다룰 수 있답니다.

이상입니다.


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

 

 

AND와 OR를 혼합해서 사용할 때는 반드시 괄호를 사용하자.

AND와 OR

WHERE 절에는 AND나 OR를 사용해 여러 조건을 연결해서 사용할 수 있습니다.

AND

AND는 "그리고"란 의미를 같습니다. WHERE 절에 두 조건이 AND로 연결되어 있다면, 두 조건이 모두 만족하는 레코드(로우)만 SELECT 결과에 참여하게 됩니다.

아래 SQL은 Item(상품) 테이블에서 ItemCat(상품카테고리)가 COF(커피)이면서, ItemSizeCd(상품사이즈코드)가 BIG인 상품만 조회하고 있습니다. AND를 사용해 ItemCat에 대한 조건과 ItemSizeCd에  대한 두 조건을 연결하고 있습니다.

SELECT  ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM    startdb.Item
WHERE   ItemCat = 'COF'
AND     ItemSizeCd = 'BIG';

ItemId  ItemNm               ItemCat  ItemSizeCd  
------  -------------------  -------  ----------  
AMB     아메리카노(B)        COF      BIG         
CLB     카페라떼(B)          COF      BIG         
IAMB    아이스아메리카노(B)  COF      BIG         
ICLB    아이스카페라떼(B)    COF      BIG

 

위 SQL은 아래 그림과 같이 하나의 레코드가 두 개의 조건을 만족한 경우만 결과 집합에 포함됩니다. 하나의 조건만 만족한 데이터는 결과 집합에 포함될 수 없습니다.



아래 SQL은 조건을 세 개 사용하고 있습니다. 조건들이 AND로 연결되었으므로 세 개의 조건 모두를 만족하는 레코드(로우)만 조회 결과에 포함됩니다.

 

 

OR

OR는 "또는"이란 의미를 가지고 있습니다.

WHERE 절에 두 조건이 OR로 연결되어 있다면, 한 건의 데이터(레코드)가 두 조건 중에 하나라도 만족하면 결과에 참여할 수 있습니다.
아래 SQL을 살펴보시죠. ItemCat(상품종류)가 COF(커피)이거나 ItemSizeCd는 BIG인 상품을 조회하고 있습니다. 두 조건 중에 하나라도 만족하면 결과에 포함되는 것을 알 수 있습니다.

 

AND와 OR 동시 사용​

AND에 대해 되짚어 보면 다음과 같습니다.

  • (20>10) AND ('A'='A'): 참 AND 참이므로 결과는 참입니다.
  • (20>10) AND ('A'='B'): 참 AND 거짓이므로 결과는 거짓입니다.
  • (20>90) AND ('A'='B'): 거짓 AND 거짓이므로 결과는 거짓입니다.

이번에는 OR에 대해 되짚어보죠. 아래와 같습니다.

  • (20>10) OR ('A'='A'): 참 OR 참이므로 결과는 참입니다.
  • (20>10) OR ('A'='B'): 참 OR 거짓이므로 결과는 거짓입니다.
  • (20>90) OR ('A'='B'): 거짓 OR 거짓이므로 결과는 거짓입니다.

AND는 연결된 비교 조건이 모두 만족해야 전체가 참이되며, OR는 연결된 비교 조건중에 하나만 만족해도 전체가 참이됩니다. AND와 OR 연결자를 각각 따로 사용하는 것은 전혀 어렵지 않을겁니다.

 

하지만 두 연결자를 동시에 사용할때는 주의할 점이 있습니다. AND와 OR를 동시에 사용할 때는 반드시 괄호를 사용해 별도로 처리될 조건들을 묶어주어야 합니다. 아래는 "거짓 AND 거짓 OR 참"에 괄호를 어디에 사용했는지에 따라 결과가 달라지는 것을 보여줍니다.

  • 거짓 AND (거짓  OR  참) =  거짓  AND (참) = 거짓
  • (거짓 AND  거짓) OR  참  = (거짓) OR   참  = 참

 

동일하게 "거짓 AND 거짓 OR 참"이 사용되었지만, 괄호 위치에 따라 최종 결과가 달라지는 것을 알 수 있습니다.

그러므로 AND와 OR가 동시에 사용된다면, 반드시 괄호를 적절한 위치에 사용해야 합니다.

만약에 아래와 같이 AND와 OR가 사용되는데 괄호가 없다면, 최종 결과는! 알수가 없습니다.

  • 거짓 AND  거짓  OR  참 = ?

특정 기준에 따라 앞에서부터 순차적으로 조건 처리를 할 수도 있으며, 뒤에서부터 조건을 처리할 수도 있습니다. SQL이 복잡해질 수록 명확해지지 않으므로 AND와 OR가 동시에 사용된다면 반드시 적절하게 괄호를 사용해야 합니다.

여러분이 개발한 SQL에 AND와 OR를 동시에 사용했는데, 괄호를 빼먹었다면, 잘못 작성한 SQL일 확률이 높습니다. 또는 괄호가 없이 지금 당장 결과에 이상이 없더라도 나중에 조건이 추가되거나 변경되면서 잘못된 결과가 나올 수도 있습니다.

현업에서 아래와 같은 데이터를 요청했습니다.

  • ItemCatCD가 BEV(음료) 중에(AND) ItemSizeCd가 BIG 이거나(OR) HotColdCd가 COLD인 데이터를 조회

위 SQL은 아래와 같이 작성해야 합니다. OR 조건을 별도로 괄호로 처리해야 요구한 의미의 데이터를 정확히 추출할 수 있습니다.

SELECT  ItemId ,ItemNm ,ItemCat ,ItemSizeCd ,HotColdCd
FROM    startdb.Item
WHERE   ItemCat = 'BEV'
AND     (ItemSizeCd = 'BIG' OR HotColdCd = 'COLD');

-- 결과
ItemId  ItemNm         ItemCat  ItemSizeCd  HotColdCd  
------  -------------  -------  ----------  ---------  
CITR    유자에이드(R)  BEV      REG         COLD       
HCHB    핫초코(B)      BEV      BIG         HOT        
LEMR    레몬에이드(R)  BEV      REG         COLD       
ZAMB    자몽에이드(R)  BEV      REG         COLD

 

만약에 괄호를 사용하지 않았다면, 아래와 같이 의도하지 결과가 출력되게 됩니다.

SELECT  ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM    startdb.Item
WHERE   ItemCat = 'BEV'
AND     ItemSizeCd = 'BIG' OR HotColdCd = 'COLD';

-- 결과
ItemId  ItemNm               ItemCat  ItemSizeCd  
------  -------------------  -------  ----------  
BMFR    블루베리머핀(R)      BKR      REG         
CITR    유자에이드(R)        BEV      REG         
CMFR    초코머핀(R)          BKR      REG         
HCHB    핫초코(B)            BEV      BIG         
IAMB    아이스아메리카노(B)  COF      BIG         
IAMR    아이스아메리카노(R)  COF      REG         
ICLB    아이스카페라떼(B)    COF      BIG         
ICLR    아이스카페라떼(R)    COF      REG         
IEINR   아이스아인슈페너(R)  COF      REG         
IFLTR   아이스플랫화이트(R)  COF      REG         
LEMR    레몬에이드(R)        BEV      REG         
ZAMB    자몽에이드(R)        BEV      REG


​AND와 OR를 동시에 사용할 때는 반드시 괄호를 사용하시기 바랍니다. 보통은 OR가 사용된 조건을 괄호로 따로 묶어야 하는 경우가 보통입니다.

 

이제 SQL을 배우고 있다면, 반드시 SQL을 직접 입력해 연습해보시기 바랍니다.

쉬운걸 연습해놓지 않는다면, 나중에 어려운 문제를 풀기는 더더욱 어려워집니다.

아래는 실습 환경을 구성하는 방법입니다.

https://sweetquant.tistory.com/561

 

[StartUP SQL BOOK]실습 환경 구성하기

StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.현재 블로그에 전체 교육 슬라이드 무료로 오픈되어 있습니

sweetquant.tistory.com

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
  • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.

 

 

 

WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다.


SELECT 기초 - WHERE 절 기본 사용법

SELECT SQL의 FROM 절에는 조회할 대상 테이블을 지정합니다. 그리고 테이블에서 원하는 데이터만 조회하기 위해 WHERE 절을 사용할 수 있습니다.
예를 들어, Item(상품) 테이블에서 ItemId(상품ID)가 'AMB'에 해당하는 상품만 조회하고 싶다면 아래와 같이 SQL을 작성하면 됩니다.
SELECT  ItemId ,ItemNm
FROM    startdb.Item
WHERE   ItemId = 'AMB';

-- 결과
ItemId  ItemNm         
------  -------------  
AMB     아메리카노(B)
위 SQL과 같이 WHERE 절은 FROM 절 다음에 사용합니다.
WHERE 절은 <테이블 컬럼명> <조건 연산식> <조건 값> 의 형식으로 사용합니다.
  • <테이블 컬럼명>에는 당연히 FROM 절에 사용한 테이블의 컬럼만 사용할 수 있습니다.
  • <조건 연산식>에는 <테이블의 컬럼명>과 <조건 값>을 어떤 조건으로 비교할지 정의합니다.
    • <조건 연산식>에는 아래와 같은 비교연산자를 기본적으로 사용할 수 있습니다.
    • =, !=, >, >=, <, <=
      • ItemId = 'AMB': ItemId에 저장된 값이 AMB인 경우 조회
      • ItemId != 'AMB': ItemId에 저장된 값이 AMB가 아닌 경우 조회
      • ItemId > 'Z': ItemId에 저장된 값이 'Z'보다 큰 경우 조회
      • ItemId < 'Z': ItemId에 저장된 값이 'Z'보다 작은 경우 조회
      • ItemId >= 'X': ItemId에 저장된 값이 'X'보다 크거나 같은 경우 조회
      • ItemId <= 'X': ItemId에 저장된 값이 'X'보다 작거나 같은 경우 조회
  • <조건 값>에는 <테이블 컬럼명>과 비교할 값을 입력합니다.

<조건 값>에는 일반적으로 문자 또는 숫자 형태로 조건 값을 지정할 수 있습니다. 문자로 조건 값을 줄때는 싱글따옴표(')로 조건 값을 감싸서 처리해야 합니다. 위의 예제 SQL에서 'AMB'처럼 조건을 처리한것처럼 말이죠. 조건 값을 숫자로 처리해야 한다면 싱글따옴표를 제거하면 됩니다.

 

WHERE 절을 어떻게 사용하는지 알았으니, 이제 Item(상품) 테이블에서 ItemNm(상품명)이 '아이스카페라떼(B)'인 데이터를 조회하는 SQL을 작성해보죠. 아래와 같습니다. 전혀 어렵지 않죠?

SELECT  ItemId ,ItemNm
FROM    startdb.Item
WHERE   ItemNm = '아이스카페라떼(B)';

-- 결과
ItemId  ItemNm             
------  -----------------  
ICLB    아이스카페라떼(B)
 
WHERE 절은 FROM 절의 테이블에서 조건에 맞는 데이터만 조회되도록 해줍니다.
테이블에서 필요한 데이터는 아래 그림과 같이 찾아낸다고 생각하면 됩니다. 왼쪽의 SQL을 먼저 보면 Item 테이블에서 ItemCat(상품종류)가 'BKR'(베이커리)인 데이터만 조회하고 있습니다. 이 경우, 오른쪽 그림과 같이 Item 테이블의 데이터를 한 건씩 확인해 ItemCat가 'BKR'인 레코드(로우)만 찾아서 결과로 내보내 줍니다. 아래 SQL의 경우에는 SELECT 절에서 ItemId, ItemNm, ItemCat만 사용했기 때문에, 세 개의 컬럼만 보여줍니다. 만약에 SELECT 절에 *를 사용했다면 조건에 해당하는 레코드(로우)의 모든 컬럼을 보여주게 됩니다.

 

 

위 그림은 WHERE 절 처리의 이해를 돕기 위해 테이블 전체를 순차적으로 SCAN하는 것으로 설명을 했습니다. 실제로는 테이블의 조회를 돕는 인덱스라는 객체의 존재 여부에 따라 다른 방법으로 데이터를 찾아내기도 합니다. 이러한 부분은 SQL을 완전히 익히고 나서, SQL 성능 관련한 부분을 공부해보면 아시게 됩니다.
 
 

WHERE 절에 따른 데이터 집합의 변화

WHERE 절 사용법보다 중요한걸 하나 설명드리겠습니다. 바로 우리가 사용한 SQL에 따라 데이터 집합이 어떻게 변하는지에 대해서입니다.
아래 그림을 살펴보시죠. 왼쪽과 같이 테이블에 저장된 데이터 집합은 WHERE 절을 거치면  오른쪽과 같이 데이터 집합의 높이가 낮아지게 됩니다. 
 
위 내용을 간략하게 그려보면 다음과 같습니다.
 

그리고 SELECT 절에 일부 컬럼만 적었다면, 데이터 집합은 어떻게 변할까요? 아래와 같이 넓이도 줄어들게 됩니다.

 

WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킵니다. SQL을 작성할때 이와 같이 데이터 집합이 변한다는 걸 기억해주시기 바랍니다.

아마도, 이전에 SQL을 공부해보신 분이라면 "이렇게 WHERE 절을 복잡하게 설명한다고?"라고 생각되시는 분들이 있지 않을까 싶습니다. "WHERE 절은 조건에 맞는 데이터를 테이블에서 찾아낸다."라고 간단하게 설명하고 넘어가도 될 내용을 이처럼 그림까지 그려가며 길게 설명한 이유는 SQL 문법이 아닌 제대로 데이터를 다루는 법을 알려드리고 싶기 때문입니다. 단순히 SQL 문법을 익히는게 아니라, 우리가 사용한 SQL에 따라 데이터 집합이 어떻게 변하는지 잘 알고 있어야, 나중에 조인이나 GROUP BY, 분석함수를 사용할 때 거침없이 사용할 수 있으며, 그래야만 데이터 집합을 효과적으로 자유자재로 다룰 수 있습니다.

 

오늘 준비한 내용은 여기까지입니다.

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

 

 

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
  • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.

 

MySQL 테이블 레이아웃 확인하기

 

DESC

DESC 명령어를 사용하면 테이블에 어떤 컬럼들이 있으며 어떤 자료형으로 설정되어 있는지 확인할 수 있습니다.

이미 말했듯이, 우리가 사용 할 데이터를 이해하는 것은 SQL 실력 향상에 도움이 됩니다. DESC 명령어를 통해 테이블의 컬럼과 컬럼의 자료형을 살펴보는 것도 데이터를 이해하는데 도움이 됩니다.


아래와 같이 DESC startdb.Item을 실행해봅니다.

DESC startdb.Item;


-- 결과
Field       Type          Null  Key  Default  Extra  
----------  ------------  ----  ---  -------  -----  
ItemId      varchar(40)   NO    PRI  None            
ItemNm      varchar(100)  YES        None            
ItemCat     varchar(40)   YES   MUL  None            
ItemSizeCd  varchar(40)   YES        None            
HotColdCd   varchar(40)   YES        None            
LaunchDt    date          YES        None


컬럼과 자료형을 확인할 수 있습니다. 대부분의 컬럼이 VARCHAR로 되어 있습니다. LaunchDt라는 컬럼만 DATE로 설정되어 있습니다.

 

이번에는 DESC startdb.Ord를 실행해봅니다. Ord(주문) 테이블은 주문 정보가 담겨져 있습니다. 아직 사용해본적은 없지만 앞으로 SQL을 배우면서 자주 사용하게 될 테이블입니다.

DESC startdb.Ord;

-- 결과
Field           Type             Null  Key  Default  Extra  
--------------  ---------------  ----  ---  -------  -----  
OrdNo           bigint unsigned  NO    PRI  None            
OrdDtm          datetime         YES        None            
PrepareCompDtm  datetime         YES        None            
PickupDtm       datetime         YES        None            
MemberId        varchar(40)      YES   MUL  None            
ShopId          varchar(40)      YES   MUL  None            
OrdSt           varchar(40)      YES        None            
OrdAmt          decimal(18,3)    YES        None            
PayTp           varchar(40)      YES        None

 

OrdNo는부호가 없는(UNSIGNED) 큰 정수(BIGINT)로 설정되어 있습니다.
OrdDtm(주문일시), PrepareCompDm(준비완료일시), PickupDtm(픽업일시)는 DAETIME 자료형입니다.
MySQL은 년, 월, 일만 저장할 때는 DATE 자료형을, 년, 월, 일과 함계 시분초를 저장하기 위해서는 DATETIME을 사용합니다. OrdAmt(주문금액)는 DECIMAL(18,3)으로 전체 18자리에 소수점 세 자리를 저장할 수 있도록 되어 있습니다.

DESC로 살펴본 Item과 Ord 테이블의 ERD를 표현해보면 다음과 같습니다.




여러분들이 현재 MySQL을 업무에서 사용하고 있다면, DESC로 주로 사용하는 테이블ㅇ르 한 번씩 확인해보시기 바랍니다.

INFORMATION_SCHEMA

DESC 명령어 외에도, 테이블의 구조를 확인하는 추가 방법이 있습니다.

바로 메타 테이블을 조회하는 것입니다.
메타 테이블은 데이터베이스에 만들어진 오브젝트 정보를 관리하는 별도의 시스템 테이블입니다.
대부분의 DBMS가 메타 테이블을 제공합니다. MySQL은 INFORMATION_SCHEMA라는 스키마 영역에 메타 테이블이 존재합니다.


아래 SQL로 Item의 테이블 구조를 확인할 수 있습니다.

SELECT  T1.TABLE_SCHEMA DB ,T1.TABLE_NAME Tab
        ,T1.COLUMN_NAME Col ,T1.COLUMN_COMMENT Cmt
        ,T1.ORDINAL_POSITION Pos ,T1.COLUMN_TYPE Typ
        ,T1.IS_NULLABLE Null_YN ,T1.COLUMN_KEY Ky
FROM    INFORMATION_SCHEMA.COLUMNS T1
WHERE   T1.TABLE_NAME = 'Item'
AND     T1.TABLE_SCHEMA = 'startdb'
ORDER BY pos ASC;

-- 결과
DB       Tab   Col         Cmt                 Pos  Typ           Null_YN  Ky   
-------  ----  ----------  ------------------  ---  ------------  -------  ---  
startdb  item  ItemId      상품ID              1    varchar(40)   NO       PRI  
startdb  item  ItemNm      상품명              2    varchar(100)  YES           
startdb  item  ItemCat     상품카테고리        3    varchar(40)   YES      MUL  
startdb  item  ItemSizeCd  상품사이즈코드      4    varchar(40)   YES           
startdb  item  HotColdCd   아이스/HOT구분코드  5    varchar(40)   YES           
startdb  item  LaunchDt    출시일자            6    date          YES

 

이처럼 메타 테이블을 사용하면 자신이 원하는 형태로 조회가 가능합니다.
또한, 메타테이블에는 DESC에서는 보여주지 않는 추가적인 정보들이 더 있습니다.
이 중에 SQL 작성(데이터 이해)에 많은 도움이 되는 것은 아마도 COMMENT 부분일 것입니다.
COMMENT를 통해 각 컬럼이 어떤 의미인지 확인할 수 있습니다. 물론 ERD가 있어, ERD로 확인한다면 더 좋습니다.


아래와 같이 TABLE_NAME에 대한 조건 값을 변경해 Ord 테이블의 구조도 확인해 봅니다.

SELECT  T1.TABLE_SCHEMA DB ,T1.TABLE_NAME Tab
        ,T1.COLUMN_NAME Col ,T1.COLUMN_COMMENT Cmt
        ,T1.ORDINAL_POSITION Pos ,T1.COLUMN_TYPE Typ
        ,T1.IS_NULLABLE Null_YN ,T1.COLUMN_KEY Ky
FROM    INFORMATION_SCHEMA.COLUMNS T1
WHERE   T1.TABLE_NAME = 'Ord'
AND     T1.TABLE_SCHEMA = 'startdb'
ORDER BY pos ASC;

-- 결과
DB       Tab  Col             Cmt           Pos  Typ              Null_YN  Ky   
-------  ---  --------------  ------------  ---  ---------------  -------  ---  
startdb  ord  OrdNo           주문번호      1    bigint unsigned  NO       PRI  
startdb  ord  OrdDtm          주문일시      2    datetime         YES           
startdb  ord  PrepareCompDtm  제조완료일시  3    datetime         YES           
startdb  ord  PickupDtm       픽업일시      4    datetime         YES           
startdb  ord  MemberId        회원ID        5    varchar(40)      YES      MUL  
startdb  ord  ShopId          매장ID        6    varchar(40)      YES      MUL  
startdb  ord  OrdSt           주문상태      7    varchar(40)      YES           
startdb  ord  OrdAmt          주문금액      8    decimal(18,3)    YES           
startdb  ord  PayTp           지불유형      9    varchar(40)      YES


​​

MySQL에서 테이블의 구조를 확인하는 방법을 알아봤습니다.

적을 알고 나를 알면?... 백전백승이라는 말이 있죠.

마찬가지로 데이터를 알고 SQL을 작성하면, 백전백승은 아니지만, 좀 더 효율적으로 SQL 작성할 수 있습니다.

항상, 무턱대고 SQL 문법을 외워서 사용하는게 아니라, 자신이 사용할 대상 테이블의 구조와 데이터를 먼저 이해할 수 있도록 노력해보시기 바랍니다.

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com


[StartUP Tuning]

  • SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육
  • 2024년 5월 주말 오프라인 교육 과정을 모집중: https://cafe.naver.com/dbian/7717
 

StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문

「StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문」 < 일정 > 5/12(일), 5/19(일), 5/26(일) 오전 9시 ~ 오후 5시 (...

cafe.naver.com

 

  • ​StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
  • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.

 

MySQL의 DATA TYPE

데이터 자료형(Data Type)에 대해 간단히 이해하고 넘어가도록 하겠습니다.
데이터 자료형이란 데이터가 가질 수 있는 값의 종류입니다.

데이터 자료형은 테이블을 구성하는 컬럼(속성)별로 지정이 가능합니다. 한 테이블에서 하나의 컬럼이 로우마다 다른 자료형을 가질 수는 없으며, 테이블을 생성할 때 컬럼별로 반드시 자료형을 지정해 주어야 합니다.

앞에서 살펴본 Item(상품) 테이블의 ItemNm(상품명)은 문자 형태의 데이터 자료형으로 되어 있습니다.

아직 다루진 않았지만, 뒤에서 다루게 될 Ord(주문) 테이블의 OrdAmt(주문금액)에는 숫자 데이터 자료형이 설정되어 있습니다.


​데이터 자료형은 일반적으로 DBMS(MySQL)에서 제공하는 것 중에 골라서 사용합니다.
주요 자료형에는 문자 자료형, 숫자 자료형, 날짜 자료형이 있습니다.
MySQL은 문자 값을 저장하기 위해 CHAR와 VARCHAR라는 문자 자료형을 제공합니다.
숫자 값을 저장하기 위해서는 INT(=Integer), BIGINT, DECIMAL이라는 숫자 자료형을 제공합니다.
날짜 자료형에는 DATE와 DATETIME, TIMESTAMP가 있습니다.
아래 그림과 같이 간단하게 요약해 볼 수 있습니다.

MySQL의 대표 자료형



문자, 숫자, 날짜는 다른 DBMS도 공통적으로 제공하는 데이터 자료형입니다.
다만, DBMS마다 약간씩 다른 이름으로 되어있거나 기능의 차이가 있을 수 있습니다.
문자, 숫자, 날짜 외에도 매우 많은 다양한 자료형들이 존재합니다.

MySQL에는 어떤 데이터 자료형이 있는지는 아래의 공식 레퍼런스를 참고해보시기 바랍니다.
공식 레퍼런스의 자료형을 외우실 필요는 없습니다. 필요할 때 찾아보실 수 있으면 됩니다.

위에서 살펴본 자료형에 대해 조금 더 살펴보도록 하겠습니다.

  • CHAR와 VARCHAR: 문자형 데이터를 저장합니다.
    • 괄호를 이용해 저장 가능한 문자열의 길이를 지정
    • CHAR(10): 고정 문자형 데이터 저장
      • 'ICE'와 같이 세 글자만 저장해도 내부적으로 10자리의 공간을 사용
    • VARCHAR(10): 가변 문자형 데이터 저장
      • 'ICE'와 같이 세 글자만 저장하면 그에 맞는 저장 공간만 사용
    • 공간 절약을 위해서는 일반적으로 VARCHAR를 사용합니다.
    • 일반적으로 코드성 데이터나 ID와 같이 저장될 문자 길이가 일정할 때만 CHAR를 사용하는 편입니다.
  • INT와 BIGINT: 정수를 저장하기 위해사용
    • BIGINT는 INT보다 더 큰 범위의 정수를 저장할 수 있습니다.
    • INT와 BIGINT에 UNSIGNED를 추가로 지정하면 양수만 저장이 가능합니다.
  • DECIMAL: 실수를 저장하기 위해 사용합니다.
    • 괄호안에 (10,3)과 같이 전체 자릿수와 소수점 자릿수를 지정합니다.
    • DECIMAL(10,3): 총 10자리 숫자를 저장할 수 있으며, 그 중에 세 자리는 소수점 자릿수입니다.
  • 날짜 자료형은 나중에 별도로 설명합니다.

Tip. 거거익선?

거거익선이란 말이 있습니다. TV를 살때 크면 클수록 좋다는 것을 재밌게 표현한 말입니다.

그렇다면 데이터 자료형에는 어떨까요? BIGINT는 INT보다 큰 숫자를 저장할 수 있습니다.

그러므로 앞으로 확장성을 고려하면 INT보다는 BIGINT가 더 좋을 수 있습니다. 하지만 BIGINT는 INT보다 조금 더 많은 디스크 공간을 사용합니다. 결론적으로 디스크 용량의 낭비가 발생할 수 있습니다.

VARCHAR 자료형은 어떨까요? 예를 들어 전화번호를 저장하기 위해 VARCHAR 자료형을 사용하고 허용 자릿수를 1000으로 설정할 수 있습니다. VARCHAR는 가변 자료형이기 때문에 VARCHAR(1000)으로 설정해놓고 전화번호에 해당하는 11자리만 입력해서 사용하면 공간 낭비는 없습니다. VARCHAR 특징상 어차피 11자리 공간만 할당해서 사용하기 때문입니다. 하지만 더 큰 문제가 있습니다. DB상으로 1,000자리를 허용하기 때문에 프로그램 오류나, 데이터 클린징 실수로 실제 1,000 자리의 글자가 입력될 가능성이 존재합니다. 이러한 데이터가 발생하게 되면 데이터 품질의 이슈가 발생합니다.

데이터 품질의 이슈는 데이터 활용과도 직결되는 중요한 문제입니다. 그러므로 테이블 컬럼에 자료형의 크기를 정할 때는 단순히 확장성을 고려한 거거익선이 아닌, 확장성과 실용성, 데이터 품질까지 고려한 중간 지점을 찾아야 합니다. 물론, 이 작업은 매우 어려운 일입니다. 경험치와 많은 고민이 필요하며, 고민의 결과가 답이 아닐 가능성도 있습니다. 다만, 거거익선은 아니라는 점을 기억하고 테이블의 컬럼 길이를 선정해야 합니다.


오늘 준비한 내용은 여기까지입니다.

 

 



[StartUP SQL]

데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육

교육용 슬라이드 전체 무료 오픈: https://sweetquant.tistory.com/497

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

[StartUP Tuning]

SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육

2024년 5월 주말 오프라인 교육 과정을 모집중: https://cafe.naver.com/dbian/7717

 

StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문

「StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문」 < 일정 > 5/12(일), 5/19(일), 5/26(일) 오전 9시 ~ 오후 5시 (...

cafe.naver.com

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
  • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.

 

SELECT SQL 맛보기

 

SQL을 배울 때 가장 먼저 배우고 가장 많이 사용하게 되는 것이 바로 SELECT SQL입니다.

SELECT SQL은 말 그대로 테이블에 저장된 데이터를 조회하는 SQL입니다.

SELECT SQL의 기본적인 사용법은 다음과 같습니다.

  • SELECT SQL은 일반적으로 FROM 절과 같이 사용된다.
  • FROM 절 뒤에 조회할 대상 테이블을 적는다.
    • 대상 테이블을 조회할 때 해당 테이블이 저장된 스키마(데이터베이스)를 지정할 수 있다.
    • Ex) FROM startdb.Item
  • SELECT 절에는 조회 컬럼을 적는다.
    • 조회할 컬럼이 여러 개면 콤마(,)로 구분해서 나열한다.
    • SELECT 절에 *을 사용하면 FROM 절에 정의한 테이블의 모든 컬럼을 조회한다.

앞에서 구성한 MySQL 실습환경 데이터베이스(startdb)에 접속해,

(실습환경 구성법: https://sweetquant.tistory.com/561 )

위의 사용법에 맞게 아래와 같이 SELECT SQL을 작성하고 실행해보시죠.

아래는 startdb 스키마(데이터베이스)에 존재하는 Item(상품) 테이블에서 ItemId(상품Id)와 ItemNm(상품명)을 조회한 SQL입니다.

SELECT  ItemId ,ItemNm
FROM    startdb.Item;

-- 결과
ItemId  ItemNm               
------  -------------------  
AMB     아메리카노(B)        
AMR     아메리카노(R)        
BGLR    베이글(R)            
… 생략 …

 

이번에는 Item 테이블의 모든 컬럼을 조회해보도록 하겠습니다. 아래와 같이 SELECT절에 특정 컬럼이 아닌 *을 적어주시면 됩니다.

SELECT  *
FROM    startdb.Item;

-- 결과
ItemId  ItemNm               ItemCat  ItemSizeCd  HotColdCd  
------  -------------------  -------  ----------  ---------  
AMB     아메리카노(B)        COF      BIG         HOT        
AMR     아메리카노(R)        COF      REG         HOT        
BGLR    베이글(R)            BKR      REG         HOT        
… 생략 …

 

우리는 FROM 절에 Item이란 테이블을 지정했습니다. Item은 아래와 같이 설계된 테이블입니다. Item 테이블에는 상품ID, 상품명, 상품카테고리, 사이즈코드, Hot/Cold구분, 출시일자와 같은 정보가 담겨져 있습니다. 현재 우리가 실습하는 커피 프랜차이즈 데이터베이스에서 판매하는 상품의 마스터 정보를 관리하는 테이블입니다.

 

지금까지 SQL 교육을 진행해보니 데이터 자체를 이해하고 있는 사람(업무적으로 해당 데이터와 관련이 있는 사람)이 좀 더 빠르고 정확하게 SQL을 익히는 것을 경험했습니다. 그러므로 단순히 SQL 문법을 익히는 것이 아니라 SQL을 사용해 어떤 데이터를 어떻게 다루는지 이해하는 것도 SQL 실력 향상에 매우 중요하다 할 수 있습니다.

StartUP SQL 교육 슬라이드의 거의 모든 곳에 테이블 설계 구조를 같이 붙여 놓은 이유입니다. (저는 얼마나 번거로웠는지 모릅니다.) 단순히 SQL 문법을 보고 타이핑하고 실행만하는 것이 아니라, 우리가 사용한 데이터가 어떤 정보를 담고 있는지 이해하기 위해 노력해보기 바랍니다. 좀 더 빠르게 SQL 실력을 끌어 올릴 수 있습니다.

 

앞에서는 두 줄로 나누어서 SELECT SQL을 작성했습니다. SQL 세계에서 SQL 하나의 문장은 세미콜론(;)으로 구분됩니다. 세미콜론으로 SQL이 구분되므로 아래와 같이 하나의 SQL을 여러 줄에 나누어서 사용해도 상관없습니다. 세미콜론으로 SQL만 정확히 구분해주시면 됩니다. 아래는 모두 같은 SQL입니다.

 

간단한 SELECT 맛보기였습니다.

오늘도 즐거운 하루 되시기를!

 


[StartUP SQL]

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

[StartUP Tuning]

  • SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육
  • 2024년 5월 주말 오프라인 교육 과정 모집중: https://cafe.naver.com/dbian/7717
 

StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문

「StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문」 < 일정 > 5/12(일), 5/19(일), 5/26(일) 오전 9시 ~ 오후 5시 (...

cafe.naver.com

 

 

 

 

 

  • StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다.
  • StartUP SQL이란? 데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육입니다.

 

실습 환경 구성하기

StartUP SQL은 이론으로만 SQL을 설명하지 않습니다. 풍부한 예제를 직접 실습해볼 수 있는 환경과 직접 풀어볼 수 있는 문제를 수록하고 있습니다.

SQL 실력 향상을 위해서는, SQL을 직접 실행해보고 그에 따라 테이블의 데이터가 어떻게 데이터가 조회되는지 살펴볼 필요가 있습니다. 그리고 배운 것을 자신의 것으로 완전히 만들기 위해 그에 따른 응용 문제도 풀어볼 필요가 있습니다. 이러한 연습을 위해서는 자신의 개인 PC에 실습 환경을 구성해야 합니다.

StartUP SQL은 MySQL을 활용해 SQL을 연습합니다. MySQL은 무료 DB로서 최근에 많은 스타트업 기업들이 애용하는 DBMS입니다. 설치도 쉬우며, 사용하기도 비교적 편합니다.

 

실습 환경 구성은 다음과 같은 과정을 거칩니다.

1. 완성된 실습환경

2. MySQL 다운로드

3. MySQL 설치(Workbench라는 SQL 툴이 같이 설치됨)

4. Workbench 실행

5. Workbench 설정 변경(연습과 실습을 위해 몇 가지 설정을 바꿔 놓는 것이 좋습니다.)

6. DBeaver 설치 및 실행

7. DBeaver 설정 변경

8. 데이터베이스 IMPORT

 

 

먼저 완성된 실습 환경은 아래 그림과 같습니다.

StartUP SQL 실습 환경

 

개인 PC에 MySQL 8(윈도우즈, 맥 모두 가능)을 설치하고 startdb라는 데이터베이스를 구성합니다.

startdb는 제가 직접 만들어 공유 드리는 다양한 테이블과 데이터를 담고 있는 실습용 데이터베이스입니다. 개인적으로 이런 실습용 데이터베이스를 무료로 공개하는 것은 아쉽지만, 많은 분들이 좀 더 데이터와 SQL을 잘 배울 수 있었으면 하는 바램으로 무료로 공개하게 되었습니다.

 

MySQL 다운로드 및 설치

MySQL을 다운로드하고 설치하는 과정은 아래 글을 보시고 차분히 따라해보십시오. 생각보다 어렵지 않게 해내실 수 있을 겁니다.

https://sweetquant.tistory.com/501

 

2-1~2-3. MySQL 설치

실습환경을 준비하기 위해 MySQL을 설치합니다.실습을 하지 않는다면, SQL 실력은 전혀 늘지 않습니다.        이전 교육 슬라이드: https://sweetquant.tistory.com/500 다음 교육 슬라이드: https://swee

sweetquant.tistory.com

 

 

Workbench로 MySQL 접속해보기

MySQL을 설치한 후에는 MySQL을 설치할때 같이 설치된 Workbench라는 SQL 툴을 실행해봅니다.

Workbench라는 툴을 통해 MySQL의 데이터베이스에 접속해서 SQL을 실행할 수 있습니다. 이와 함께 Workbench의 몇 가지 옵션을 변경합니다. 그리고 DBeaver라는 툴도 추가로 설치합니다. 사실 DBeaver는 설치 안해도 상관없습니다. 하지만 최근의 많은 스타트업 기업들이 SQL 무료 툴로 DBeaver를 사용하고 있으므로 사용해보시길 권장합니다. 사실, SQL 툴은 MySQL만 지원한다면 아무거나 사용해도 상관없습니다. 다만, 이후 실습 데이터베이스 구성을 위해 DATA IMPORT 작업을 해야 하는데 이때는 Workbench를 꼭 사용해야 합니다. 지금까시 설명한 과정은 아래 글을 참고해주시면 됩니다.

https://sweetquant.tistory.com/502

 

2-4~2-5. MySQL접속해보기:Workbench와 DBeaver

데이터를 강력하게 다루는 SQL.SQL을 배우기 위한 최적의 시작점, StartUP SQL! 설치한 MySQL에 접속하기 위한 SQL 툴에 대한 설명입니다.MySQL을 설치하면 Workbench는 자동설치됩니다.Workbench만 사용해도 S

sweetquant.tistory.com

 

 

실습 데이터베이스 구성하기

마지막으로 실습용 데이터베이스를 IMPORT 할 차례입니다. 첨부로 올려드린 DUMP 파일을 다운로드 한 후에, Workbench에 접속해 DATA IMPORT 작업을 수행합니다. 과정이 복잡하지 않지만, 좀 더 이해가 쉽게 하도록 영상으로 과정을 만들어 올려드렸습니다. DUMP 파일 다운과 데이터베이스 IMPORT 과정은 아래 글을 참고해주세요.

https://sweetquant.tistory.com/503

 

2-8. 실습 데이터베이스 구성하기

실습을 위한 데이터베이스를 구성할 차례입니다.해당 과정을 진행하기 전에 MySQL 8이 설치되어 있어야 합니다. (MySQL 8.0.35 추천)아래 파일을 압축을 푼후 MySQL Workbench에서 IMPORT 작업을 해주시면

sweetquant.tistory.com

 

여기까지 완료하시면, 자신의 컴퓨터에 SQL 교육과 실습을 위한 startdb라는 멋진 데이터베이스가 만들어집니다.

이제 본격적으로 SQL을 연습을 하러 가시면 됩니다.

책 형태로 SQL을 설명드리기에는 많은 시간이 걸리므로, 우선은 교육 슬라이드를 보고 하나씩 따라해보시기 바랍니다.

 

자신이 SQL이란걸 해본적이 전혀 없다면, SELECT SQL부터: https://sweetquant.tistory.com/504

그래도 SELECT SQL은 좀 배웠다면 GROUP BY 부터: https://sweetquant.tistory.com/514

GROUP BY까지 배웠다면 JOIN 부터: https://sweetquant.tistory.com/521

JOIN까지 다 배웠다면, 분석함수만 살펴보시죠!: https://sweetquant.tistory.com/545

 

오늘 준비한 내용은 여기까지입니다. 시간 나는대로 다음 내용도 준비해보도록 하겠습니다.

감사합니다.

 


[StartUP Tuning]

SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육

2024년 5월 주말 오프라인 교육 과정을 모집중: https://cafe.naver.com/dbian/7717

 

StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문

「StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문」 < 일정 > 5/12(일), 5/19(일), 5/26(일) 오전 9시 ~ 오후 5시 (...

cafe.naver.com

 

 

 

 

- StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다. -

 

DATABASE

 

데이터베이스(DATABASE)는 한 조직이나 시스템 운영에 필요한 데이터 집합(SET)을 모아 놓은 것입니다.
무턱대고 데이터 집합을 모아놓는 것이 아니라, 효율적으로 사용할 수 있도록 구조화해서 모아 놓습니다.
아마도 스타벅스의 데이터베이스에는 매장, 메뉴(상품), 주문, 회원과 같은 데이터 집합이 있을 것입니다.
넥플릭스의 데이터베이스는 시청, 컨텐츠, 회원과 같은 데이터 집합이 있을 것입니다.


​데이터베이스에는 관계형 데이터베이스, 계층형 데이터베이스, 객체지향형 데이터베이스가 있습니다.
이 중에 가장 대표적인 데이터베이스는 관계형 데이터베이스입니다.
20년 넘게 IT 일을 하면서 계층형 데이터베이스나 객체지향형 데이터베이스를 사용하는 곳은 본적이 없습니다.
우리가 중점적으로 공부 할 데이터베이스가 바로 관계형 데이터베이스란 뜻이죠.
그리고 관계형 데이터를 다루는 가장 강력한 언어가 바로 우리가 배울 SQL입니다.

 


Tip. NoSQL은?
2010년 초반에는 빅데이터의 출현과 함께 NoSQL(Not Only SQL)이라는 새로운 데이터베이스도 각광받기 시작했습니다.
빅데이터는 3V란 특징을 가지고 있습니다. 3V는 Volume(양), Velocity(속도), Variety(다양성)를 뜻합니다.
쉽게 말하면 엄청난 양(Volume)의 데이터가 매우 빠른 속도(Velocity)로 매우 다양한(Variety) 형태의데이터를 이야기합니다.
이러한 3V 특징의 빅 데이터를 효율적으로 다루기 위해 사용하는 것이 바로 NoSQL 데이터베이스입니다.
관계형 데이터베이스는 정교하고 정확한 업무 처리에 강점이 있습니다. 반면에 NoSQL은 대규모 데이터를 ​


 

 

데이터베이스


StartUP SQL 교육 슬라이드 전체 목차: https://sweetquant.tistory.com/497

 

StartUP SQL 소개 및 목차

데이터를 강력하게 다루는 SQL! SQL을 배우기 위한 최적의 시작점 StartUP SQL! '평생 필요한 데이터 분석', 'SQL BOOSTER' 저자의 모두를 위한 SQL 입문 교육 개인 PC에 MySQL을 설치한 실습 위주 교육 티스토

sweetquant.tistory.com

 

 

 

 

 

- StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다. -

 

DATA

데이터란 전통적으로 "컴퓨터를 사용해 처리할 수 있는 자료"로 정의됩니다. 하지만 이러한 사전적 의미는 현대 사회의 복잡하고 다양한 데이터 활용을 완전히 설명하기에는 부족합니다.

오늘 날, 우리의 거의 모든 활동은 데이터를 만들어내고 있습니다.

예를 들어, 스타벅스 앱으로 커피를 주문하면, 이 정보는 스타벅스의 데이터베이스에 저장되고 해당 매장으로 전달됩니다.
이와 같은 커피 주문이 단순하게 데이터의 생성과 저장으로만 그치지 않습니다. 쌓여진 주문 데이터는 고객의 선호와 행동 패턴을 분석하는 귀중한 정보가 됩니다.
마찬가지로, 대중교통 이용, 병원 예약과 진료, 소셜 미디어 활동, 온라인 쇼핑 등 일상의 수많은 활동들이 데이터를 생성하고, 이 데이터는 다양한 방식으로 활용됩니다.
소비자는 데이터를 생산하고, 기업은 이를 수집하고 분석해 다시 소비자를 위한 상품과 서비스를 제공합니다.
이처럼 현대 사회에서 데이터는 소비자와 생산자(기업) 간의 순환을 만들어주는 핵심 고리입니다.

데이터는 기업과 기관의 생존과 성장을 위한 중요 자원입니다. 데이터를 통해 수요를 예측하고, 리스크를 감지하며, 새로운 상품과 서비스를 개발합니다.

데이터의 중요성은 더 많은 기업들이 데이터 과학자와 데이터 분석가라는 직책을 만들어 가고 있는 현상에서도 드러납니다. 링크드인을 살펴보면, 데이터 과학자, 데이터 분석가, 데이터 엔지니어와 같은 직책을 달고 있는 전문가들이 생각보다 많습니다. 고전적인 데이터 관련 직군인 DBA나 데이터 아키텍쳐보다 훨씬 많은 느낌입니다.

이와 같은 상황은 기업들이 데이터 활용에 많은 고민과 투자를 하기 시작했다는 증거라 생각됩니다.


결론을 맺자면, '데이터'는 단순히 "컴퓨터를 사용해 처리할 수 있는 자료"라는 사전적인 의미를 넘어서,
기업의 발전, 사회의 변화, 개인의 일상에 필수적인 자원으로 자리 잡았습니다.
데이터는 현대 사회에서 더 이상 선택이 아닌 필수적인 자원이 되었습니다.
이 데이터를 다루기 위해, 적극적으로 활용하기 위해, 우리는 SQL이란 언어를 공부해야 합니다.

DATA란?


​​


StartUP SQL 무료 교육 슬라이드 전체 목차: https://sweetquant.tistory.com/497

- StartUP SQL 교육 슬라이드를 책으로 작성 중인 페이지입니다. -

 

ERD

StartUP SQL에서 여러분께 가장 먼저 보여드릴 것은 바로 ERD(Entity Relationship Diagram)입니다.
ERD는 데이터베이스의 설계도입니다. SQL을 배우는데 왜 데이터베이스 설계도를 알아야 할까요?
그냥 빠르게 SQL 문법만 알려주면 되는 거 아닌가 하는 생각이 드는 분도 있을 것입니다.

SQL은 관계형 데이터를 다루는 언어입니다.
다시 말해, SQL을 배우는 목적의 근본은 관계형 데이터를 다루기 위함이며, 더 나아가서 데이터를 분석하고 활용하기 위함입니다. 데이터를 분석하고 활용하는 단계에 이루기 위해서는 SQL로 활용할 데이터 구조를 충분히 이해하고 있어야 합니다.

SQL을 배우는 과정에서 ERD를 계속해서 들여다보는 습관을 갖다보면, 자연스럽게 ERD와 데이터구조가 머릿속에서 빠르게 매핑이 되며, 보다 쉽게 SQL을 작성하고 배울 수 있게 될 것입니다.

 

이 책에서 SQL을 배우기 위해 사용할 데이터베이스의 설계도(ERD)는 다음 그림과 같습니다. 

 

 

 

두 개의 ERD를 보여드렸는데, 하나는 논리(Logical) ERD이고 다른 하나는 물리(Physical) ERD입니다. SQL 입문자에게는 ERD 자체가 생소할 것입니다. 걱정할 필요 없습니다. ERD를 이해하기 위해서, 지금은 아래 내용만 이해하면 됩니다.

 

각각의 네모 하나 하나가 데이터 집합입니다.

  • 네모의 가장 위에는 데이터 집합의 이름이 표시되어 있습니다.
  • 네모 안에는 해당 데이터 집합이 갖고 있는 정보들이 나열되어 있습니다.
  • 네모를 연결하는 선들이 있는데, 네모 간에 관계가 있다는 뜻으로만 이해하면 됩니다.
  • 논리(Logical)는 우리가 쉽게 이해할 수 있는 언어로 작성된 설계도입니다.
  • 물리(Physical)는 실제 데이터베이스에 구현된 실제 명칭을 사용한 설계도입니다.

 

위 내용을 토대로 논리 ERD를 간단히 읽어보면 다음과 같습니다.

  • 매장, 주문, 회원, 주문상세, 상품과 같은 데이터 집합이 있구나.
  • 매장 데이터집합에는 매장ID, 매장명, 매장면적, 매장운영유형과 같은 정보가 있구나.
  • 주문에는 주문번호, 주문일시, 회원ID, 매장ID와 같은 정보가 있구나.
  • 매장과 주문간에 선이 있는 것을 보니 관계가 있구나.

 

이런식으로 논리ERD를 한번씩 쭉 읽어 보시기 바랍니다. 그리고 논리ERD의 각각 명칭들이 물리ERD에 표시된 이름으로 데이터베이스에 구현된다는 정도만 알고 넘어가시면 됩니다.

 

물리ERD는 데이터베이스에 구현될 데이터 집합의 실제 명칭을 사용한 설계도입니다. 물리ERD에 사용한 용어는 다음 그림과 같은 명명규칙(Naming Rule)을 사용했습니다. 물리ERD의 이해를 위해 참고하시기 바랍니다.

 

 

우리는 SQL 연습을 위해, 여기서 보여드린 ERD와 같은 데이터베이스를 각자 PC에 만들 것입니다. 자신만의 연습용 데이터베이스를 구성해 마음껏 SQL을 연습하고 활용해보시기 바랍니다.

 

 


StartUP SQL 교육 슬라이드 전체 목차: https://sweetquant.tistory.com/497

 

StartUP SQL 소개 및 목차

데이터를 강력하게 다루는 SQL! SQL을 배우기 위한 최적의 시작점 StartUP SQL! '평생 필요한 데이터 분석', 'SQL BOOSTER' 저자의 모두를 위한 SQL 입문 교육 개인 PC에 MySQL을 설치한 실습 위주 교육 티스토

sweetquant.tistory.com

 

 

+ Recent posts