Day6-2.SQL
포스트
취소

Day6-2.SQL

[DAY6-2] SQL

0. SQL 이란?


SQL : Structured Query Language

  • 관계형 데이터베이스에 있는 데이터(테이블)를 질의하거나 조작해주는 언어
  • 1970년대 초반에 IBM이 개발한 구조화된 데이터 질의 언어이다.
  • 두 종류의 언어로 구성
    • DDL(Data Definition Language)
      :테이블의 구조를 정의하는 언어
    • DML(Data Manipulation Language)
      :테이블에서 원하는 레코드를 읽어오고 레코드를 추가/삭제/갱신해주는데 사용하는 언어**


이러한 SQL은 빅데이터 세상에서 중요하다

  • 구조화된 데이터를 다루는 한 SQL은 데이터 규모와 상관없이 쓰인다.
  • 모든 대용량 데이터 웨어하우스는 SQL기반이다.
    • ex. Redshift, Snowflake, BigQuery, Hive
  • Spark나 Hadoop도 SparkSQL과 Hive라는 SQL언어가 지원된다.
  • 백엔드/프론트엔드/데이터 분야 모두에서 반드시 필요한 기본 기술이다.

1. SQL의 단점


구조화된 데이터를 다루는데 최적화가 되어있다. (= 비구조화된 데이터를 다루기 어렵다.)

  1. 정규표현식을 통해 비구조화된 데이터를 어느 정도 다루는 것은 가능하나 제약이 심하다.
  2. 많은 관계형 데이터베이스들이 플랫한 구조만 지원한다. (no nested like JSON)
    • 구글 BigQuery는 nested structure를 지원한다.
  3. 비구조화된 데이터를 다루는데 Spark, Hadoop과 같은 분산 컴퓨팅 환경이 필요해졌다.
    (즉 SQL만으로는 비구조화 데이터를 처리하지 못한다.)
  4. 관계형 데이터베이스마다 SQL문법이 조금씩 상이하다.

2. schema의 종류


Star schema

  • Production DB용 관계형 데이터베이스에서 보통 사용한다.
  • 데이터를 논리적 단위로 나눠 저장하고 필요시 조인한다.
  • 스토리지 낭비가 덜하고 업데이트가 쉽다.

Denormalized schema

  • NoSQL이나 데이터웨어하우스에서 사용하는 방식
    • 단위 테이블로 나눠 저장하지 않음으로 별도의 조인이 필요없는 형태
  • Star schema 보다 스토리지를 더 사용하지만 조인이 필요없기 때문에 더 빠른 계산이 가능하다.

3. SQL의 기본


  • 다수의 SQL문은 세미콜론으로 분리한다.
    ex. SQL문1; SQL문2; SQL문3;
  • SQL 주석
    • ”–” : 인라인 한줄짜리 주석 (자바의 //)
    • ”/* – */ : 여러줄에 걸쳐 사용 가능한 주석
  • SQL 키워드는 대문자를 사용한다던지 하는 나름의 포맷팅이 필요하다.
    ex. 팀 프로젝트라면 팀에서 사용하는 공통 포맷이 필요
  • 테이블 / 필드이름의 명명규칙을 정하는 것이 중요하다.
    • 단수형 vs 복수형 : User vs Users
    • _ vs CamelCasing : user_session_channel vs UserSessionChannel

4. 테이블 필드의 중요 속성


PRIMARY KEY

테이블에서 레코드의 유일성을 정의하는 필드이다.
ex. 사용자 테이블에서 이메일, 주민등록번호

  • Composite primary key : primary key가 두개이상 필드로 정의되는 경우
  • Primary key로 지정된 필드가 있는 경우 데이터베이스단에서 중복된 값을 갖는 레코드가 생기는 것을 방지할 수 있다.
    primary key uniqueness constraint

Foreign key

테이블의 특정 필드가 다른 테이블의 필드에서 오는 값을 갖는 경우

NOT NULL

필드의 값이 항상 존재해야하는 경우

DEFAULT value

필드에 값이 주어지지 않은 경우 기본값을 정의 해주는 역할

  • timestamp 타입 : CURRENT_TIMESTAMP를 사용하면 현재 시간으로 설정된다.

5. SQL DDL (테이블 구조 정의 언어)


CREATE TABLE

table 생성

  • Primary key 속성을 지정할 수 있다.
    (Primary key uniqueness : 유일키를 보장하여 동일한 키가 존재하지 않는다.)
  • 성능향상을 위해 인덱스를 지정할 수 있다.
1
2
3
4
5
CREATE TABLE raw_data.user_session_channel (
    userid int,
    sessionid varchar(32) primary key,
    channel varchar(32)
);

DROP TABLE

table 삭제

  • DROP TABLE table_name;
    • 없는 테이블을 지우려고 할땐 에러가 난다.
    • DROP TABLE IF EXISTS table_name;
  • vs. DELETE FROM : 조건에 맞는 레코드들만 지운다.

ALTER TABLE

새로운 컬럼 추가 / 기존 컬럼 이름 변경 / 기존 컬럼 제거 / 테이블 이름 변경

  • 새로운 컬럼 추가
    ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
  • 기존 컬럼 이름 변경
    ALTER TABLE 테이블이름 RENAME 현재필드이름 to 새필드이름;
  • 기존 컬럼 제거
    ALTER TABLE 테이블이름 DROP COLUNM 필드이름;
  • 테이블 이름 변경 ALTER TABLE 현재테이블이름 RENAME to 새테이블이름;

SELECT

레코드 질의 언어 (앞으로 자세히 공부하며 포스팅할 예정입니다.)

  • SELECT FROM : 테이블에서 레코드와 필드를 읽어오는데 사용한다.
  • WHERE를 사용해서 레코드 선택조건을 지정한다.
  • GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용하기도 한다.
    • DAU, WAU, MAU 계산은 GROUP BY를 필요로 한다.
  • ORDER BY를 사용해서 레코드 순서를 결정하기도 한다.
  • 보통 다수의 테이블에 조인해서 사용한다.

그 밖의 키워드

  • 레코드 추가 : INSERT INTO
  • 레코드값 수정 : UPDATE FROM
  • 레코드 삭제 : DELETE FROM (vs. TRUNCATE)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Day6-1.Database

Day7.MySQL

Comments powered by Disqus.