2025-03-07

Suhyeon Lee·2025년 3월 7일

출처: 쏭즈캠퍼스

정리

1과목

DBMS(Database Management System)

  • data

    • 실생활의 많은 data는 비정형 data
      • 인스타그램 사진, 통화 내역, 카카오톡 등
      • 양이 방대하고 많음
      • 데이터를 처리하기 어려움
    • 비정형 data → 정형 data로 구조화하여 관리
      • 데이터를 처리하기 위함
      • 방대한 양의 데이터를 효과적으로 관리 및 분석할 수 있음
    • 정형 data == table의 형식을 가진 data
    • 정형 data를 structured data(구조화된 data)라고도 함
    • structerd data에서 파생된 언어 → structured data를 관리하기 위한 언어: SQL
      🡆 구조화된 데이터에 대해 명령문을 작성 & 결과를 얻도록 하는 언어 == SQL
  • database

    • 물리적인 데이터가 저장되어 있는 공간
      • 현대 기업에서는 정말 큰 데이터들을 저장해야 하기 때문에 데이터 센터를 따로 두고 있음
    • 기업에서 업무를 하는 수많은 사람들이 공유해야 하는 환경
      • 한 명 한 명에게 기업에 있는 모든 데이터를 줄 수 없기 때문
      • 한정된 자원을 많은 사람들이 나눠 쓸 수 있게 하고 여러 개의 작업을 하나의 컴퓨터에서 할 수 있도록 멀티프로그래밍 혹은 멀티유저 시스템을 발전시켜 나간 게 컴퓨터 과학
    • 데이터베이스라고 하는 방대한 데이터 공간에 수많은 사람들이 접속해 자신이 원하는 데이터를 추출하고 작업하고 조작하는 여러 가지 업무를 수행할 수 있도록 고안됨
  • DBMS

    • 수많은 사람들이 한정된 리소스에 접근하기 위해서 기술적으로 최대한 효율적으로 데이터를 다루고 처리할 수 있도록 만든 시스템
  • DBMS의 구조

    • CLIENT-SERVER 시스템
      • 클라이언트(CLIENT): 데이터베이스를 이용하는 프로그램
      • RDBMS(서버): RDBMS 데이터베이스를 처리하는 프로그램
      • 데이터베이스(DB/DATABASE): 하드디스크 등에 데이터를 보관하고 있음
    • 수많은 클라이언트들이 서버에 접속하고 서버는 데이터베이스에 있는 데이터들을 미리 준비
      • 여러 가지 연산도 쉽게 할 수 있도록 메모리 분배도 함
    • SQL을 통해 명령을 보내고 거기에 맞는 결과를 받게 됨
  • OBJECT

    • 데이터베이스는 구조화된 오브젝트들의 모임
    • 대표적인 오브젝트는 '테이블'
      • 지도 형식의 테이블에서 유저들은 각자 자신이 원하는 테이블에 접근해 데이터 관리 & 조작
    • DBMS(Database Management System, 데이터베이스 관리 시스템)에서 "오브젝트"는 데이터베이스 내에 존재하는 다양한 유형의 항목
      • DBMS는 오브젝트의 집합이라고도 이해할 수 있음
    • 테이블, 뷰, 인덱스 등이 있음
      • 뷰: SQL 명령문으로 구성
      • 인덱스: 테이블에 쉽게 접근하기 위한 것

데이터 모델링

: 기업의 복잡한 시스템을 구조화된 데이터로 옮기는 것

소프트 개발 방법론

  • 구조적 방법론
    • 업무 활동 중심의 방법론
    • 정형화된 절차, 도형 중심의 도구를 사용하여 사용자 요구 사항 파악, 문서화하는 기법
    • 단점: 각자 사용하는 업무 범위가 달라 자신이 쓰는 데이터만 관리 → 데이터 품질 저하 및 중복 데이터, 비일관적이고 비유연적인 데이터가 나옴
  • 데이터 중심 방법론 → RDBMS
    • 구조적 방법론 단점 보완
      • 원하는 데이터를 알아서 찾아 조작할 수 있도록 만듦
    • 지하철 노선도 같은 것
      • 지하철 시스템을 하나의 공유 가능한 형태의 지도로 표현한 것
      • 자신이 원하는 경로를 검색하며 따라갈 수 있음(자기 목적에 맞게 사용)
    • 데이터에 중심적인 방법론
    • 업무 절차, 환경 변화에 매우 유연
    • '정보 공학 방법론'이라고도 불림
  • 객체 지향 방법론
    • 객체를 중심으로 시스템을 분석하고 설계하는 방식

데이터모델링의 특징 ★★★

  • 단순화(Simplification)
    • 누구나 쉽게 이해할 수 있도록 표현 → 지하철 노선도!
  • 추상화(Abstraction) <모형화, 가설적>
    • 현실세계를 간략히 표현
  • 명확화(Clarity)
    • 명확하게 의미가 해석되어야 하고 한 가지의 의미를 가지면 됨

데이터 모델링의 세 가지 관점

1) 데이터 관점: 어떤 데이터들이 업무와 얽혀 있는지, 데이터 간에는 어떤 관계가 있는지 → 데이터에 집중
2) 프로세스 관점: 업무가 실제로 "처리"하고 있는 것이 무엇인지
3) 데이터와 프로세스의 상관 관점: 프로세스의 흐름에 따라서 데이터가 어떤 영향을 받는지 → 관계에 따른 영향

데이터모델링 단계별 특징 ★★★

  • 개념 데이터 모델링
    • 가장 높은 수준의 추상화, 포괄적이고 전사적인 모델링
    • 핵심 엔터티를 추출해서 만들어 내는 것(핵심 엔터티 도출)
  • 논리 데이터 모델링
    • 정규화, 데이터 표준화를 시행하는 단계
    • 재사용성이 높다.
    • 구체적인 지도를 짜는 과정
      • 정규화
      • 관계 설정
  • 물리 데이터 모델링
    • 가장 구체적인 모델링
      • 구체적인 데이터들이 어디에, 어떻게 저장이 될지
    • 데이터 개체, 속성, 제약조건 등 전반적으로 정의
    • 성능, 보안성, 가용성을 고려하여 구축

요리 recipe에 비유해 생각해본다면:
핵심 재료 선정 → 개념 데이터 모델링
논리적인 순서대로 행동 배치 → 논리 데이터 모델링
구체적인 사실 정의 → 물리 데이터 모델링
: 어느 정도로 데이터를 정의할지(단위, 제약 조건 등)

데이터모델링의 중요성

  • 파급 효과(Leverage)
    • 시스템 구축이 완성되어가는 시점에서 데이터 모델을 변경하게 되면 시스템 구축 프로젝트에 큰 위험요소가 된다.
      → 데이터 모델링을 잘못 짜면 나중에 큰 오류가 생긴다
  • 간결한 표현(Conciseness)
    • 정보 요구 사항과 한계가 정확하고 간결하게 표현되어야 하므로 데이터 모델이 필요하다.
  • 데이터 품질(Data Quality)
    • 데이터 구조의 문제로 인해 데이터 품질의 문제가 발생한다.
    • 예를 들면 중복데이터의 미정의, 데이터 구조의 비즈니스 정의의 불충분, 동일한 성격의 데이터를 분리하여 데이터 불일치 등이 있다.

데이터 품질과 관련된 유의점

  • 중복(Duplication)
    • 데이터 모델은 같은 데이터를 사용하는 사람, 시간, 그리고 장소를 파악하는데 도움을 준다.
    • 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다.
  • 비유연성(Inflexibility)
    • 데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무 변화에 대해서도 데이터 모델이 수시로 변경된다면 유지보수의 어려움을 가중시킬 수 있다.
  • 비일관성(Inconsistency)
    • 데이터의 중복이 없더라도 비일관성은 발생한다.
    • 데이터 모델링 시, 데이터와 데이터 간 상호 연관 관계에 대한 명확한 정의가 요구된다.

데이터모델링의 필수요소 ★★★

  1. 업무가 관리하고자 하는 복수의 대상(엔터티, Entity)
  2. 대상들이 갖는 속성(Attribute)
  3. 대상들 간의 관계(Relationship)

엔터티

  • 업무에서 저장되고 관리되어야 하는 데이터들의 집합
  • 테이블과 유사한 개념
    • 데이터 모델링에서 테이블에 대한 용어 == 엔터티
  • 인스턴스들의 집합

엔터티의 특징 ★★★

  1. 식별 여부
    • 엔터티(Entity)는 식별자(Identifier)에 의해서 식별이 가능하다.
      • 주민등록정보에서 주민등록번호가 식별자
      • 택배 정보에서 운송장이 식별자
    • 엔터티는 유일한 식별자(Unique Identifier)를 필수로 한다.
  2. 인스턴스들의 집합
    • 엔터티는 최소 2개 이상의 인스턴스가 존재해야한다.
  3. 속성
    • 엔터티는 반드시 속성(변수)를 가지고 있어야 한다.
    • 각각의 엔터티에는 속성을 2개 이상 갖는다.
    • 하나의 인스턴스는 각각의 속성들에 대해 한 개의 속성값만을 갖는다.
  4. 업무
    • 엔터티는 업무에서 관리되어야 하는 집합이다.
    • 업무에 반드시 필요한 정보
  5. 관계
    • 엔터티는 다른 엔터티와 최소한 한 개 이상의 관계를 가진다.
    • 예외로 통계를 위한 엔터티, 코드를 위한 엔터티, 시스템 처리시 내부적인 필요를 위한 엔터티는 관계가 없을 수 있다.

엔터티 이름을 정할 때 유의사항

1) 업무에 실제로 사용되는 용어 사용
2) 다른 엔터티와 중복 불가
3) 테이블, 뷰, 컬럼을 비롯한 모든 식별자들은 소문자로 작성, 한글 약어 사용 X
4) 단수 명사 표현 & 띄어쓰기 X

엔터티, 인스턴스, 속성, 속성값 관계

엔터티 생성(발생) 시점에 따른 분류 ★★★

  • 기본 엔터티(Fundamental Entity)
    • 업무에 원래 존재하는 정보이다.
      • 인터넷 서점: 도서 정보, 출판사, 출판일, 저자 → 서점 업무가 생기기 이전부터 존재
    • 다른 엔터티와의 관계에 의해 생성되지 않고 독립적으로 생성이 가능하고 엔터티의 부모역할을 하게 된다.
  • 중심 엔터티(Main Entity)
    • 기본 엔터티로부터 발생되고 업무에 있어서 중심적인 역할을 한다.
      • 인터넷 서점: '주문' 행위 → 주문 테이블
  • 행위 엔터티(Active Entity)
    • 두 개 이상의 부모 엔터티로부터 발생되고 내용이 자주 바뀌거나 데이터 양이 증가된다.
      • 인터넷 서점: 주문 내역, 환불 내역

엔터티 형태에 따른 분류 ★★★

  • 유형 엔터티(Tangible Entity)
    • 물리적 형태가 있는 엔터티이다. 형태가 있으므로 안정적, 지속적인 특징이 있다.
      • 사원 정보 테이블 → 사원: 사원은 물리적 형태가 있음
  • 개념 엔터티(Conceptual Entity)
    • 물리적 형태가 없는 엔터티이다. 개념적 정보의 엔터티이다.
      • 사원 정보 테이블 → 부서: 형태가 존재하지 않는 개념.(업무가 같은 사람들을 모아놓은 개념)
  • 사건 엔터티(Event Entity)
    • 업무를 수행함에 따라 발생하는 엔터티이다. 정보의 발생량이 많다는 특징이 있다.
      • 여러 가지 내역 정보, 주문 정보
    • 계속해서 데이터가 삽입/삭제/수정되고 많은 트랜잭션을 발생

속성

  • 업무상 분석해야 하는 대상의 성질, 특징을 의미한다.
    • 인스턴스들의 어떤 성질들을 속성이라고 정의
  • 업무상 인스턴스로 관리하고자 하는 더 이상 분리되지 않는 최소의 데이터 단위이다.
    • 더 이상 분리되지 않는 == 원자성
  • 속성은 한 개의 속성값을 가짐

속성의 특성에 따른 분류 ★★

  • 기본 속성(Basic Attribute)
    • 업무로부터 추출된 모든 속성이다.
    • 엔터티에 가장 일반적이고 많이 존재하는 속성이다.
  • 설계 속성(Designed Attribute)
    • 기본 속성 외, 업무를 규칙화하기 위해 새로 만들어지거나 기존 속성을 변형하여 만들어지는 속성이다.
      • 예: 서점 도서 분류 체계 → 한국십진분류법
  • 파생 속성(Derived Attribtue)
    • 다른 속성에 영향을 받아 발생하는 속성이다. 보통 계산된 값들이 해당된다.
      • 예: 서적의 총 수, 서적 구매 금액의 총합 등

식별자의 대표성 여부에 따른 분류

도메인: 각 속성의 가질 수 있는 값의 범위 (데이터 타입, 크기, 제약사항 등)
식별자(Identifiers): 엔터티 내에서 인스턴스들을 구분할 수 있는 구분자이다.

  • 주 식별자
    • 엔터티 내에서 각 인스턴스들을 구분할 수 있다.
    • 데이터 모델링시 대표성을 지니게 된 식별자
  • 보조 식별자
    • 엔터티 내에서 각 인스턴스들을 구분할 수 있다.
    • 다만, 대표성을 가지지 못하는 식별자
      • 직원 정보 테이블에 직원 번호, 주민등록번호 두 개의 식별자가 존재 → 주 식별자로 이 중에 직원 번호를 주 식별자로 지정하게 되면 주민등록번호는 보조 식별자의 지위를 가지게 됨
    • 주 식별자들만 타 엔터티에 외부식별자를 생성하여 참조관계를 형성할 수 있다.

식별자의 스스로 생성 여부에 따른 분류

  • 내부식별자
    • 엔터티 내부에서 스스로 만들어지는 식별자
  • 외부식별자
    • 타 엔터티와의 관계를 통해 타 엔터티로부터 받아오는 식별자
    • 일반적으로 외부식별자는 물리 데이터 모델링 시 외래 키(Foregin Key)로 구성된다.

식별자의 속성의 수에 따른 분류

  • 단일 식별자
    • 하나의 속성으로 구성된 식별자
  • 복합 식별자
    • 둘 이상의 속성으로 구성된 식별자

식별자의 대체 여부에 따른 분류

  • 본질 식별자
    • 업무에 의해서 만들어지는 식별자
  • 인조 식별자
    • 업무에 의해서 만들어지지는 않으나, 기존 식별자가 복잡한 구성을 가지고 있어 인위적으로 만들어낸 식별자
      • '운송장 번호'가 대표적인 예시: 수하인, 수취인, 핸드폰 번호, 집하 지점, 대리점 등의 정보가 모여 식별자로 구성 시 하나의 택배 사실을 지칭하기 어려움 → 택배를 보낸 사실 하나를 지칭하기 편하게 하기 위해 식별자를 인위적으로 만든 것

관계 ★★★

관계명

  • 여러 개의 엔터티들이 연결될 때 관계를 어떻게 정의하는지에 대한 이름
    • '부서는 사원을 "포함한다."'
    • '사원은 부서에 "소속된다."'
  • 관계 시작점(The Beginning)
    • 엔터티의 관점에서 관계가 시작되는 부분
  • 관계 끝점(The End)
    • 관계를 받는 부분

관계명 기술 규칙

  • 애매한 동사를 피해야 한다.
  • 현재형으로 표현해야 한다.

관계차수 (Degree / Cardinality)

  1. 1:1 관계

  2. 1:M 관계

  3. M:M 관계

관계 정의시 점검할 사항

  • 관계 연결에 대한 규칙이 서술되어 있는지 여부
  • 관계 연결이 ‘동사(Verb)’로 이루어져있는지 여부
  • 두 개의 엔터티 사이에 연관 규칙이 존재하는지 여부
  • 엔터티 사이에 정보의 조합이 발생하는지 여부

식별자관계 / 비식별자 관계 ★★★

  • 식별자 관계(Identifying Relationship)

    • 부모 엔터티의 주식별자(Primary Key)가 자식 엔터티의 주식별자로 상속된 경우이다.
  • 식별자 관계는 '강한 관계'로 규정됨

    • 과도한 식별자 관계는 SQL 구문을 복잡하게 하고 오류가능성을 증가시킨다.
      • 식별자 관계가 많아지면 데이터에 식별자로 기능하는 속성들이 많아져 SQL 구문을 복잡하게 만들 가능성이 있음

      • ER 다이어그램(ERD)의 IE(international engineering) 표기법에 따르면 실선으로 표기
        더 알아보기
  • 비식별자 관계(Non-Identifying Relationsihp)

    • 부모 엔터티의 주식별자(Primary Key)가 자식 엔터티의 일반 속성으로 상속된 경우이다.
  • 비식별자 관계는 '약한 관계'라고 정의

    • 과도한 비식별자 관계는 불필요한 조인을 유발시킨다.

ERD(Entity Relationship Diagram) 표기법

  1. 엔터티 표기법

    • I/E
      • 네모 상자
      • 엔터티 명을 박스 바깥에 표기
    • Barker
      • soft box(둥근 사각형)
      • 엔터티 명을 박스 안쪽에 표기
  2. 속성 표기법

    • I/E
      • 주식별자를 선 위에 정의
      • 일반 속성을 밑에 정의
    • Barker
      • 여러 가지 속성들을 제약 조건을 같이 써서 표기
        (*: Null을 허용하지 않음)
  3. 식별자 표기법

    • I/E
      • 중간 선을 기준으로 위쪽에 배치된 속성은 주식별자로 기능을 함
      • 두 개 이상의 속성이 있으면 복합 식별자라는 뜻
    • Barker
      • 샵(#)으로 표기
  4. 관계 표기법

    • 관계명 표기법
      • 관계명은 엔터티의 기준에서(엔터티가 주어가 됐을 때의 기준으로) 시작점(the beginning)에 표기
    • 관계 차수 표기법
      • crow foot 사용
    • 관계선택사항 표기법 ★★★

      → '부서가 사원을 포함하지 않을 수 있다' & '사원은 부서에 반드시 포함된다'는 의미임!
      • 끝점 동그라미: 선택 사항(optional)에 대해서 표시
      • 동그라미가 없으면 강제적(mandatory)인 것
      • barker 표기법의 경우 끝점이 아닌 시작점에 표기
    • 식별자/비식별자 관계 표기법 ★★★
      • I/E: 식별자 관계는 강한 실선, 비식별자 관계는 점선
      • barker: 관계의 끝점에 bar 표시(UID)
      • I/E 표기법에서는 관계의 선이 실선이면 식별자 관계, 점선이면 비식별자 관계를 표현한다.
    • 바커 표기법에서는 식별자 관계에서 관계의 끝점(The End)에 UID Bar 수직선을 그어준다. 비식별자 관계에서는 UID Bar가 존재하지 않는다.

ERD 그리는 순서 ★★

ERD를 작성하는 방법은 순서가 있다.
① 엔터티를 그린다.
② 엔터티를 적절하게 배치한다.
③ 엔터티 간의 관계를 설정한다.
④ 관계명을 기술한다.
⑤ 관계의 참여도를 기술한다.
⑥ 관계의 필수 여부를 기술한다.

3단계 스키마 구조

예시: 지하철

지하철 노선도 → 개념 스키마
지하철을 이용하는 사람들의 화면(모든 사람들이 자기 자신의 화면을 확인) → 외부 스키마
실제 지하철과 실제 지하철 역 → 내부 스키마

  • 'ANSI SPARK 3단계 구조'라고도 불림
    → 데이터 독립성에 관한 이야기: 외부/개념/내부 스키마가 각각 독립적으로 구성되어야 함!
    (개념 스키마에 문제가 생겼을 때 외부 스키마에 영향을 미치지 않음)
    (내부 스키마에 문제가 생겼을 때 개념&외부 스키마에 영향을 미치지 않음)
  1. 외부 스키마 (External Schema)
    • 데이터베이스의 사용자 관점이다.
    • 데이터베이스에서 사용자에게 필요한 부분만을 보여주고, 불필요한 부분은 보여주지 않는다.
    • 전체 데이터베이스의 논리적인 부분이므로 서브 스키마(Sub Schema)라고도 한다.
    • 하나의 데이터베이스 시스템에는 여러 개의 외부 스키마가 존재한다.
      • 지하철을 사용하는 사람이 매우 많은 거라고 생각하면 됨
    • 일반 사용자는 SQL 명령문을 이용해 데이터를 얻을 수 있다.
    • 프로그래머는 다른 언어를 사용하여 데이터베이스에 접근할 수 있다.
  2. 개념 스키마(Conceptual Schema)
    • 데이터베이스의 관리자(DBA, 데이터베이스 관리자) 관점이다.
    • 데이터베이스 전체가 어떻게 구성되어 있고 어떤 데이터가 저장되어 있는지, 데이터들 간의 상호 관계는 어떠한지 알려주는 단계이다.
      • 모든 사람들이 공유하는 지도 형식을 가진다고(개념적인 지도) 생각하면 됨
    • 데이터베이스의 전체적인 논리적 구조를 보여준다.
    • 스키마(Schema)라고 하면 개념 스키마를 지칭하는 경우가 많다.
  3. 내부 스키마(Internal Schema)
    • 데이터베이스의 시스템 설계자 관점이다.
    • 데이터가 실제로 물리적 데이터베이스에 어떻게 저장되어 있는지 알려준다.
      • 지하철 역이 어디에 있는지, 개찰구가 몇 개인지, 언제 몇 호선이 도착하는지, 전화번호는 무엇인지와 같은 물리적 속성을 정의한 스키마

데이터 독립성(Data Independency)의 종류

  • 데이터 독립성
    • 하위 단계의 데이터 구조가 변경되더라고 상위 단계에 영향을 미치지 않는 속성
  • 논리적 독립성
    • 개념 스키마가 변경되어도 외부 스키마에는 영향을 미치지 않는다.
    • 통합 논리적 구조가 변경되어도 응용프로그램에는 이상이 없다.
  • 물리적 독립성
    • 내부 스키마가 변경되어도 외부/개념 스키마에는 영향을 미치지 않는다.
    • 저장장치의 구조변경은 응용프로그램과 개념스키마에 영향이 없다.

더 알아보기: 데이터 독립성

  • 파일 시스템의 종속성 문제 해결
  • 하위 스키마를 변경하더라도 상위 스키마가 영향을 받지 않는 특성
  1. 논리적 데이터 독립성 (응용 인터페이스 독립성 유지)
    • 개념 스키마가 변경되어도 외부 스키마가 영향을 받지 않음
    • 개념 스키마가 변경되면 관련된 외부/개념 사상만 정확하게 수정해주면 됨
  2. 물리적 데이터 독립성 (저장 인터페이스 독립성 유지)
    • 내부 스키마가 변경되어도 개념 스키마는 영향을 받지 않음
    • 내부 스키마가 변경되면 관련된 개념/내부 사상만 정확하게 수정해주면 됨

이상현상(Anomaly)

: 정규화를 통해 해소 가능

  • 삽입이상
    • 행 정보(Row) 삽입 시 지정되지 않은 속성 값이 NULL을 가지는 경우를 의미
      • 상품과 고객 분리 필요성
  • 갱신이상
    • 행 정보(Row) 갱신시 일관성이 유지되지 않는 경우
  • 삭제이상
    • 행 정보(Row) 삭제 시 연쇄 삭제가 발생하는 현상

정규화

: 큰 테이블을 여러 개의 작은 테이블로 쪼개는 것
→ 단점: 과도한 JOIN 유발할 수 있음

  • 제1 정규화
    • 테이블의 모든 속성은 반드시 하나의 값을 가져야 하고, 테이블의 행(Row)들은 서로 간에 식별 가능해야 한다.
    • 테이블 속성의 원자성을 확보하고 주식별자를 설정
      • 어떤 사람이 서점에서 책을 여러 권 구매했다고 해서 도서명에 여러 권의 책 이름을 넣게 되면 원자성이 깨진 것 → 하나의 책 당 하나의 구매 내역으로 관리
  • 제2 정규화
    • 주식별자가 2개 이상의 속성으로 이루어진 경우 부분 함수적 종속을 제거하는 과정
      • 두 개 이상의 속성이 식별자로 기능하고 하나가 결정자로 기능할 때(어느 하나과 종속된 다른 하나의 속성이 있다고 했을 때) 두 개 이상의 종속된 사이에서 하나의 종속성을 제거하는 것
  • 제3 정규화
    • 엔터티의 일반 속성들 간에는 서로 종속적이지 않는다.
    • 주식별자를 제외한 컬럼 간의 종속성인 이행 함수 종속성을 제거하는 과정
      • X → Y → Z(x가 y에 대한 결정자, y가 z의 결정자일 때 테이블을 X → Y, Y → Z로 나눌 수 있음

2과목

SQL 명령어

  • SQL – Structured Query Language
    • 비정형 데이터가 정형화되었을 때 그 정형 데이터를 다루는 언어
    • 표에 대해서 원하는 데이터를 찾고 조작하고 조회할 수 있는 언어
  1. DML
    • 행을 다루는 언어
      • 테이블 안에 있는 row에 대한 언어
    • SELECT, INSERT, UPDATE, DELETE
  2. DDL
    • 테이블과 같은 object를 생성하고 구조를 변경하고 삭제하고 이름을 변경하는 언어
    • CREATE, ALTER, DROP, RENAME
  3. DCL
    • 데이터베이스의 객체 혹은 시스템에 대한 권한을 부여하고 그 권한을 철회하는 언어
    • GRANT, REVOKE
  4. TCL
    • 트랜잭션 관리 언어
    • COMMIT, ROLLBACK
      • 커밋: 트랜잭션을 확정적으로 디스크에 반영
      • 롤백: 트랜잭션을 취소

테이블

  • 행 == row == tuple == observation
  • 열 == column == attribute
  • column header
    • 각 속성의 이름

데이터의 유형(oracle)

  • CHAR(s) : 고정 길이 문자열 정보.
    • 빈칸이 있으면 그 공간을 사용할 수 없다는 특징
  • VARCHAR2(s) : 가변 길이 문자열 정보.
    • 공간이 남게 되면 다른 데이터가 와서 그 공간을 채울 수 있음
    • 공간 절약적 측면에서는 좋지만 데이터 조회 성능적 측면에서는 CHAR가 더 좋음
      • 길이가 일정한 건 char로, 주소 같은 건 varchar2로
  • NUMBER : 정수, 실수 등 숫자 정보
  • DATE : 날짜와 시각 정보

SELECT

  • SELECT 문장을 사용함으로, 원하는 변수와 원하는 행(ROW)을 선택적으로 조회가 가능하다.
    • SELECT * FROM EMP;
    • SELECT EMPNO, ENAME FROM EMP;
      • select 뒤 column header → 세로의 묶음을 가지고 오는 개념
        (가로로 원하는 행을 가지고 오는 건 where)

CONCAT

: 여러 개의 문자열을 합치는 연산자

  • ORACLE: ||
    <문자열 혹은 컬럼명> || <문자열 혹은 컬럼명>
  • MS-SQL SERVER: +, concat
    <문자열 혹은 컬럼명> + <문자열 혹은 컬럼명>
    CONCAT(<문자열 혹은 컬럼명>, <문자열 혹은 컬럼명> )
  • 예시
    SELECT ‘ABC’ || ’DEF’ FROM EMP;
    → 실행 결과: ABCDEF

DISTINCT

  • DISTINCT 연산자
    • 로우(row) 정보들 중에서 중복되는 값을 제거하여 하나만 남기는 집약 기능을 한다.
  • 두 개 이상의 인수를 사용하는 경우

    → 중복을 순서쌍으로 제거(두 개가 동시에 일치하는 정보들을 다 삭제해서 중복 제거)

ALIAS 연산자의 사용

SELECT <컬럼명> AS <Alias 컬럼명> 
SELECT <컬럼명> AS<Alias 컬럼명>SELECT <컬럼명>  <Alias 컬럼명> 
SELECT <컬럼명><Alias 컬럼명>

※ ALIAS 는 COLUMN HEADER 을 변경하는 기능을 한다. (기출)

  • 공백을 포함한 별칭
    • “"(쌍따옴표) 는 문자열이 공백을 포함하는 경우 사용된다.
      • SELECT empno AS "직원 번호"
    • 공백이 없으면 그냥 따옴표 없이도 사용 가능하다.
    • “"(쌍따옴표) 는 문자열이 특수문자를 포함하는 경우에도 사용된다.
      • SELECT empno AS "#직원"

WHERE

→ SQL 명령문에서 원하는 행을 가지고 올 때 '필터 연산 방식'에 대해 알고 있으면 좋음
(필터 연산 방식: 행을 하나하나 내려가면서 출력 대상이 되는지 안 되는지를 판단하는 방식)

  • WHERE 절은 테이블의 각각의 행(개체)에 대해서 개체 조건을 만족하는지 여부를 판단한다.
    -해당 행이 조건을 만족시키면 출력한다.
  • 조건이 ‘참(TRUE)’ 이면 출력하고 거짓(FALSE)’ 이면 출력하지 않는다

비교연산자

  • <
  • >
  • <=
  • >=
  • =
  • "같지 않다" 3가지 꼭 알아두기: <> , !=, ^=

논리연산자

: 여러 가지 조건식을 중첩할 때 사용

  • <조건식1> AND <조건식2>
    • 좌우 조건식이 모두 참일 경우 참
  • <조건식1> OR <조건식2>
    • 좌우 조건식 중 하나만 참일 경우 참
  • NOT <조건식>
    • 조건식의 결과를 부정

연산자 우선순위 ★★★

  1. =, !=, <, >, <=, >=
  2. IS NULL, LIKE, BETWEEN, IN, EXISTS
  3. NOT
  4. AND
  5. OR

※위에 있는 연산자일수록 먼저 연산이 이루어진다.

SQL에서는 NULL 값을 =, <> 같은 비교 연산자를 이용해 비교할 수 없다.
NULL은 특정 값이 아니라 값의 부재에 대한 표시이기 때문에 NULL에 대해 연산자를 사용해도 NULL이 반환된다. 여기서 헷갈리면 안되는 부분은, 어떤 연산자를 사용하든 항상 NULL이 된다는 뜻이 아니라는 점이다.(oracle에서 select NULL or true;는 1을 반환한다.)

SQL 연산자

BETWEEN

  • BETWEEN <최소값> AND <최대값> : 범위 조건
    • 100 BETWEEN A AND B100>=A and 100<=B

IN

  • IN(<값1>, <값2>, … ): 여러 개 값들 중 같은 것이
    있는 경우 참
    • DEPTNO IN(10, 20, 30)DEPTNO=10 or DEPTNO=20 or DEPTNO=30
  • <값1> IN (<값2>, <값3>, <값4>) 의 의미: <값1> = <값2> OR <값1> = <값3> OR <값1> = <값4>
    <값1> NOT IN (<값2>, <값3>, <값4>)의 의미 :
    <값1> ≠ <값2> AND <값1> ≠ <값3> AND <값1> ≠ <값4>

LIKE 연산자 ★★★

  • 문자열 칼럼에 저장되어 있는 값이 특정 문자열을 포함하고 있는지 볼 때, like를 사용한다.
    • _: 특정 미지의 글자 하나를 의미한다.
    • _A_: (아무거나 1글자 + A + 아무거나1 글자) A 앞뒤로 어떤 글자가 와도 상관 없지만 개수는 같다.
      예) _A_: “WAY”, “MAY”, "HAT", ….
    • %: 미지의 글자 0개 이상을 의미한다.
    • %A%: 앞뒤로 어떤 글자가 와도 상관없고 몇 글자가 와도 상관이 없다. A 문자열이 포함되어 있으면 참이다.
      예)H%: “H”, “He”, “Hi”, “Hello”

ESCAPE 연산자

  • 찾고자 하는 와일드카드에 _, %가 포함된 문자열을 지정하는 경우 사용
    • 와일드카드가 아닌 진짜 문자열(특수기호)인 경우
      • 문자열이 'A_45', '35%' 등 와일드카드로 쓰는 기호를 포함하고 있을 때

ENAME LIKE ‘A_#%’ ESCAPE ‘#’
: # 기호 뒤의 %는 와일드카드가 아니라 특수문자이다.

SQL에서 ESCAPE는 주로 LIKE 연산자와 함께 사용되며, 특수 문자나 와일드카드 문자(예: % 또는 _)를 포함하는 패턴 검색 시에 사용됩니다. ESCAPE를 사용하여 특수 문자를 이스케이프(escape)하면 이 문자를 문자열 그대로 처리할 수 있습니다.

SELECT column_name
FROM table_name
WHERE column_name LIKE '%\%' ESCAPE '\'; 

column_name 열에서 % 문자를 검색합니다: 이때 \ 문자가 ESCAPE로 설정되었으므로, % 문자는 와일드카드가 아니라 문자 그대로 검색됩니다. 결과로 % 문자가 포함된 모든 레코드가 반환됩니다.

TOP-N 쿼리 (가상컬럼)

: 오라클과 SQL 서버에서 가장 큰 차이를 보이는 부분

  • 하나의 테이블에 존재하는 다른 컬럼 값들을 이용해서 만들어진 임시 컬럼
  • ORACLE에서 행의 번호를 나타내는 가상 컬럼은 ROWNUM
    • ROWNUM은 where절에 구성을 하거나 select절에 들어갈 수 있음
    • where절에 구성을 하게 되면 ROWNUM을 이용해 몇 개의 데이터를 출력할지(처음 상위 몇 개의 데이터를 출력할지) 지정할 수 있음
    • 최신 oracle은 limit 지원함
SELECT <컬럼명>  
FROM <테이블명>
WHERE <ROWNUM 조건식> 
  • MS-SQL SERVER에서 상위 행을 출력하는 함수는 TOP 함수
    (MySQL은 limit: TOP-N과 LIMIT)
SELECT TOP (<반환할 행의 숫자>) <컬럼 리스트> 
FROM <테이블명> ; 

Oracle: ROWNUM Pseudo Column

  • WHERE 절에서 행의 갯수를 제한
  • WHERE과 ORDER BY를 같이 쓰면 WHERE가 먼저 순서이므로, 무작위 데이터 3개 중 정렬된 데이터가 출력됨.
    (상위 몇개를 뽑는 Top N 쿼리가 아님)
  • ROWNUM으로 Top N 쿼리를 만드려면 인라인뷰로 처리할 것
SQL> SELECT ENAME, SAL
     FROM (SELECT ENAME,SAL FROM EMP
           ORDER BY SAL DESC)
     WHERE ROWNUM <=3;
# 실행결과 (EMP 테이블의 봉급 상위 3명)
ENAME             SAL
----------------------
John                4000
Keya                3000
Hodor              2500
  • WHERE 조건문의 ROWNUM은 반드시 ROWNUM=1인 값을 포함해야 하고 목표값까지 1씩 증가해야 한다.
SELECT EMPNO,ENAME  
FROM EMP  
WHERE ROWNUM>1;  → 오류 발생 
  • TOP (<반환할 행의 숫자>)<컬럼 리스트> WITH TIES
    ※WITH TIES : 동일한 데이터가 있을 경우 함께 출력된다. 사용하기 위해서는 ORDER BY 절이 반드시 필요하다. ORDER BY 절 뒤의 컬럼이 동일한 데이터 여부를 판단하는 기준이다.

DUAL 테이블

  • 오라클 설치 시 자동적으로 생성되는 오라클의 표준 테이블
  • 오직 하나의 행(Row)에 하나의 컬럼만 가지고 있는 Dummy 테이블
    • 1x1 table
  • Dual 테이블은 일시적인 가상테이블로서 숫자 연산, 날짜 연산을 위해서 쓰이는 것이 일반적

단일행 함수

  • SQL에서 기본 제공되는 함수를 내장 함수(Built – in
    Function)라 한다.
  • 단일 행 함수는 하나의 행을 입력했을 때, 결과가 하나의 행으로 나오는 것이다.
    • xxf(x)f(x)yy
      cf. 복수 행 함수: x1x_1, x2x_2, x3x_3, … → f(x)f(x)yy
      🡆 sum, avg, max, min 등

단일행 숫자 함수

  • ABS (<숫자>) : 절대값을 구해주는 함수이다.
  • SIGN (<숫자>) : 부호를 출력해주는 함수이다.
  • FLOOR (<숫자>) : 소수점을 모두 버리는 함수이다. ★★
  • CEIL (<숫자>) : 소수점을 모두 올리는 함수이다. ★★
    • (※ SQL SEVER) CEILING (<숫자>)
  • MOD (<숫자1>, <숫자2>) : <숫자1>/<숫자2>의 나머지를 구하는 함수이다.
  • ROUND (<숫자>,<자리수>) : 반올림 함수이다. ★★★
  • TRUNC (<숫자>,<자리수>) : 내림 함수이다. ★★★
    ※ 자리수에 아무것도 쓰지 않으면 기본값은 0이다

ROUND 함수

단일행 문자열 함수

  • LOWER (<문자열>) : 대문자를 소문자로 바꾸는 함수
  • UPPER (<문자열>) : 소문자를 대문자로 바꾸는 함수
  • INITCAP (<문자열>) : 첫 글자를 대문자로, 나머지를 소문자로 바꾸는 함수
  • CONCAT (<문자열1>,<문자열2>) : 두 개의 문자열을 합쳐서 출력해주는 함수 ★
    • 오라클 concat은 딱 두 개만 됨
      SELECT CONCAT(COUNTRY_ID, COUNTRY_NAME) FROM COUNTRIES;
      SELECT CONCAT(CONCAT(COUNTRY_ID, ' '), COUNTRY_NAME) FROM COUNTRIES;
    • || 쓰면 더 편해서 concat은 잘 안 씀
      SELECT COUNTRY_ID||' '||COUNTRY_NAME FROM COUNTRIES;
  • LENGTH (<문자열>) : 문자의 개수를 출력해주는 함수
  • LENGTHB (<문자열>) : 문자의 바이트를 출력해주는 함수
  • SUBSTR (<문자열>,<숫자>) : <숫자>번째 글자를 포함하여 이후의 문자열을 가져온다. ★★★
    • SUBSTR('JONES', 3) → NES
  • SUBSTR (<문자열>,<숫자1>,<숫자2>) : <숫자1>번째 글자를 포함하여 <숫자1>부터 <숫자2>까지의 문자열을 가져온다. ★★★
    • SUBSTR('JONES', 2, 3) → ONE
    • SUBSTR('JONES', -3, 3) → NE
  • LPAD (<문자열1>,<숫자>,<문자열2>) : <문자열1> 을 출력한 뒤, 남은 <숫자> 바이트의 문자열만큼 좌측으로 <문자열2>을 추가한다.
  • RPAD (<문자열1>,<숫자>,<문자열2>) : <문자열1> 을 출력한 뒤, 남은 <숫자> 바이트의 문자열만큼 우측으로 <문자열2>을 추가한다.
  • LTRIM(<문자열1>, <문자열2>) : <문자열1> 좌측에서부터 <문자열2>가 나타나면 다른 문자가 나올 때까지 제거한다.
  • RTRIM(<문자열1>, <문자열2>) : <문자열1> 우측에서부터 <문자열2>가 나타나면 다른 문자가 나올 때까지 제거한다.

SUBSTR

단일행 날짜 함수

  • 날짜 연산(X일 이후/이전)
  • SYSDATE 이외에도 컬럼명으로도 연산 가능

형변환 함수 ★★★

  • ORACLE

CASE 함수

CASE 
  WHEN <조건식1> THEN <반환값1> 
  WHEN <조건식2> THEN <반환값2>END
  • <조건식1> 에 만족하면, <반환값1> 을 출력하고, <조건식2>에 만족하면, <반환값2>을 출력한다.

ELSE 사용

CASE
  WHEN <조건식1> THEN <반환값1> 
  WHEN <조건식2> THEN <반환값2>ELSE <반환값>
END 
  • ELSE 절을 사용하는 경우 : <조건식1> 에 맞는 경우, <조건식2>에 맞는 경우를 제외한 경우 ELSE의 <반환값> 이 반환된다.
  • ELSE 절을 사용하지 않는 경우 : <조건식1> 에 맞는 경우, <조건식2>에 맞는 경우를 제외한 경우 NULL이 반환된다.

DECODE

: 조건식이 등호로만 구성

DECODE (<컬럼명>, <1>, <반환값1>, 
  <2>, <반환값2>, 
  <3>, <반환값3>,)  
  • <컬럼명>이 <값1>이면 <반환값1>을 가져오고, <값2>이면 <반환값2>를 가져오고 <값3>이면 <반환값3>를 가져온다.
  • <컬럼명> 이 <값1>, <값2>, <값3> 모두 같지 않는 경우에는 NULL 이 반환된다.


NULL

  • 데이터의 값이 알려져 있지 않거나 의미가 없는 경우에 NULL을 사용한다. 즉, NULL은 값의 부재 혹은 모르는 값

NULL 산술연산

  • NULL 과의 산술연산은 모두 NULL로 출력된다.
SELECT NULL+2, NULL-2, NULL/2, 2/NULL  
FROM DUAL;  

NULL과의 비교연산

  • 일반적인 비교연산(>, <, =)을 사용하면 논리 구조가 FALSE나 TRUE가 아닌 UNKNOWN이라고 하는 특이한 논리 구조로 모두 처리됨 – TRUE나 FALSE값을 얻고 싶다면 IS NULL / IS NOT NULL을 사용해야 함!
    • NULL=1UNKNOWN
    • NULL<2UNKNOWN
    • UNKNOWN: 조건식을 알 수 없다는 논리. 사실상 결과물이 출력되지 않음 → where절 입장에서는 false처럼 기능을 한다고 볼 수 있는데 큰 차이점 하나가 존재 🡆 NOT 연산자
      • NOT(FALSE)는 TRUE이지만 UNKNOWN은 NOT 연산자에 들어갔을 때 그대로 UNKNOWN으로 나옴
      • 이것 때문에 결과값이 NULL이 리턴되는 상황에서 NOT IN vs NOT EXISTS 사이 차이가 발생함

NOT IN → NULL값이 포함된 컬럼이라면, NULL과의 비교연산은 항상 UNKNOWN 값을 반환하게 된다. 따라서 WHERE 절 이하가 TRUE가 아니므로 해당 레코드가 출력되지 않게 된다
NOT EXISTS → NOT IN과 같이 NULL에 대한 비교연산은 항상 UNKNOWN 값을 반환하므로 해당 쿼리의 결과가 존재하지 않게 되고, 이에 따라서 레코드가 출력된다.

SELECT EMPNO, COMM FROM EMP WHERE 
COMM IS NULL; 
SELECT EMPNO, COMM FROM EMP WHERE 
COMM IS NOT NULL; 

NULL 관련 함수 ★★★

  • NVL(값1,값2) : 값1의 값이 NULL 이면 값2 출력. NULL이 아니면 값1 출력.

  • NVL2("값", "지정값1", "지정값2") : NULL이 아닌 경우 지정값1을 출력하고, NULL인 경우 지정값2를 출력

    • NVL2 함수를 사용할 때 NULL이 아닌경우 자신의 값을 그대로 출력할 수도 있다.(NVL2(comm, comm, '보너스없음'))
    • 더 알아보기
  • NULLIF(값1,값2) : 값1이 값2와 같으면 NULL을 아니면 값1을 출력

  • COALESCE(값1,값2) : NULL이 아닌 최초의 표현식, 모두 NULL이면 NULL 반환

    • NULL이 아닌 첫 번째 값을 출력
      e.g. COALESCE(NULL, NULL, ‘abc’) -> ‘abc’

NULL의 특징 ★★★

  1. 기본적인 의미는 값의 부재, 모르는 값을 의미한다.
  2. 정렬에서는 무한대의 의미를 가진다. (Oracle)
    • 오라클에서는 내림차순 정렬 시 NULL이 맨 앞에 온다.
  3. 정렬에서는 최소의 값이라는 의미를 가진다. (SQL Server)
    • SQL 서버에서는 내림차순 정렬 시 NULL이 맨 마지막에 온다.
  4. NULL/2 , 2/NULL, NULL+NULL, NULL-2 모두 NULL값으로 출력된다.
  5. (SELECT 절에서) NULL = 3 등의 비교연산 시, UNKNOWN(알수 없음) 이 반환되어 오류가 발생한다. (WHERE 절에서) NULL = 3 등의 비교연산 시, UNKNOWN(알수 없음)이 조건절(WHERE)에 들어가서
    거짓(FALSE)의 결과와 같은 결과가 반환된다.

SQL 작성 순서와 연산 순서

  • 작성 순서
select
from
where
group by
having
order by
limit
  • 연산 순서: FROM – WHERE – GROUP BY – HAVING – SELECT – ORDER BY
    1. FROM : 어떤 테이블을?
    2. WHERE : 어떤 ROW를?
    3. GROUP BY : 어떤 그룹으로?
    4. HAVING : 어떤 조건의 그룹을?
    5. SELECT : 어떤 컬럼들을?
    6. ORDER BY : 어떻게 정렬을?
    7. LIMIT : 최종 출력할 ROW중 어떤 ROW를?
      → 일단 데이터를 전부 가져오고(1. FROM) 점점 데이터를 좁혀 나간 뒤(2~4) 고르고(5. SELECT), 정리(6. ORDER BY)
      → 정렬 작업이 리소스를 많이 잡아먹기 때문에(big-O notation 참고)

이 순서를 이해하면 ALIAS를 쓸 수 있는 절과 아닌 절을 구별할 수 있다. 대표적으로 GROUP BY는 SELECT보다 먼저 실행 되기 때문에 ALIAS를 쓸 수 없지만 ORDER BY의 경우 SELECT 이후에 실행 되기 때문에 써도 된다.
서브쿼리의 활용도도 이해할 수 있다. 컬럼과 컬럼을 활용해 새로운 컬럼을 만드는 경우(EX) 매출과 고객수를 활용해 객단가 컬럼 생성) 해당 컬럼을 다른 SELECT에서 바로 쓰고 싶어도 바로 쓸 수 없다. 아래처럼 CUS_PER_BUY를 바로 활용하려 하면 에러가 뜬다.

SELECT 
	BUY_TOTAL
    ,CUSTOM_NUM_TOTAL
    ,BUY_TOTAL/CUSTOM_NUM_TOTAL AS CUS_PER_BUY
    ,CASE
    	WHEN CUS_PER_BUY < 10000 THEN '우량 고객'
        ELSE '그냥 고객'
     END
FROM PD_DE
;

아래처럼 고치면 쓸 수 있고, 더 깔끔하게 볼 수 있다. 만약 컬럼간의 연산한 생성된 컬럼이 많거나 CASE WHEN의 경우의 수가 더 많을수록 효과가 더 크다.

SELECT 
	BUY_TOTAL
    ,CUSTOM_NUM_TOTAL
    ,CUS_PER_BUY
    ,CASE
    	WHEN CUS_PER_BUY < 10000 THEN '우량 고객'
        ELSE '그냥 고객'
     END
FROM (SELECT *, BUY_TOTAL/CUSTOM_NUM_TOTAL AS CUS_PER_BUY FROM PD_DE;)
;

ORDER BY

  • SELECT 문을 통해 얻어온 결과를 특정 컬럼을 기준으로 오름차순 혹은 내림차순으로 정렬할 수
    있다.
  • WHERE, ROWNUM 등과 함께 쓸 수 있다.
  • 숫자, 문자열, 날짜 등 모든 타입의 데이터를 정렬할 수 있다.
  • ORDER BY 의 정렬 시점은 모든 실행이 끝난 이후, 데이터 출력 전이다.
  • ORDER BY 는 데이터 베이스의 메모리를 많이 사용한다. (성능 저하의 요인이 된다.)
    • CPU를 많이 쓰거나 메모리 공간을 많이 잡아먹는 특징이 있음
SELECT <컬럼명>
FROM <테이블명> 
ORDER BY <컬럼명> [ ASC | DESC ]; 

ASC : 오름차순 (생략가능), DESC : 내림차순

컬럼 번호를 이용한 정렬

SELECT EMPNO, ENAME, SAL
FROM EMP 
ORDER BY 3 ASC; 
  • 출력되는 결과의 컬럼의 번호를 기준으로 정렬하는 것이 가능하다.
    • SELECT EMPNO, ENAME, SAL에서 첫 번째로 나온 EMPNO가 1, ENAME가 2에 각각 대응
  • 하지만, 출력되는 결과의 컬럼 숫자보다 큰 값을 이용하여 정렬하면 오류가 발생한다.
    • SELECT에 3개의 컬럼뿐인데 ORDER BY 4 ASC;라고 작성하면 오류 발생

출력 되지 않는 컬럼을 이용한 정렬

SELECT EMPNO,ENAME,DEPTNO 
FROM EMP 
ORDER BY SAL DESC; 
  • EMP 테이블을 FROM에서 가지고 오면 일단 메모리 위에 테이블을 통으로 올림
  • 따라서 EMP 테이블에서 출력 대상이 아닌 컬럼(원하지 않은 정보)에 대해서도 정렬 가능

복수 컬럼을 이용한 정렬

SELECT ENAME, SAL,COMM 
FROM EMP 
ORDER BY SAL DESC, ENAME ASC; 
  • 먼저 SAL 내림차순으로 정렬하고 SAL가 같다면 ENAME 오름차순으로 정렬한다.
  • 선행 컬럼이 같을 경우에 후행 컬럼을 기준으로 정렬하겠다는 뜻

정렬의 특징

  • 숫자, 문자열, 날짜 등 모든 타입의 데이터를 정렬할 수 있다.
  • ORDER BY 의 정렬 시점은 모든 조회(SELECT)가 끝난 이후이다
  • ORDER BY 는 데이터 베이스의 메모리를 많이 사용한다. (데이터 조회 성능 저하의 요인이 된다.)

집계함수

  • SUM (<컬럼명>) : 컬럼 값들의 총합을 구한다
  • AVG (<컬럼명>) : 컬럼 값들의 평균을 구한다
  • COUNT (<컬럼명>) : 컬럼 값들의 총 개수를 구한다
  • MAX (<컬럼명>) : 컬럼 값들의 최대값을 구한다
  • MIN (<컬럼명>) : 컬럼 값들의 최소값을 구한다

집계함수와 NULL의 관계

  • (원칙) : 집계 함수는 NULL을 제외하고 연산하는 것이 원칙이다.
  • (예외) : COUNT(*) 는 행의 수를 센다. → NULL을 포함하여 연산


① 4

COL1+COL2+COL3+COL4
4
NULL
NULL
NULL

※ 하나라도 NULL 있으면 연산 결과 NULL임
NULL+1+NULL+NULL=NULL
3+NULL+3+3=NULL
NULL+4+NULL+4=NULL

② 4+6+4+8=22
SUM(COL1) → 4
SUM(COL2) → 6
SUM(COL3) → 4
SUM(COL4) → 8

집계함수 WHERE 절에 사용 불가

  • 집계함수는 WHERE 절에 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE절이 먼저 수행된다.)
    • 집계 처리는 그룹화 시점에서 실행되므로 group by 실행 이후부터 집계 함수 사용이 가능하다.
    • group by 실행부터 그룹 속성이 나오고 집계 처리가 되므로 그 이전인 where에서는 집계함수를 사용할 수 없음
SELECT EMPNO,ENAME, SAL 
FROM EMP 
WHERE SAL>AVG(SAL)
[오류발생] 

집계함수 ORDER BY 절 사용 가능

SELECT DEPTNO, MAX(SAL) 
FROM EMP 
GROUP BY DEPTNO 
ORDER BY MAX(SAL); 

GROUP BY

: 관문 역할

  • 데이터들을 기준컬럼에 따라서 원하는 그룹으로 나눌 수 있다.
  • 개체 속성들은 GROUP BY를 기점으로 그룹 수준의 속성들이 된다.
    • group by 후에는 개체에 대한 정보가 그룹 수준의 속성(통계값)으로 바뀜
  • GROUP BY를 사용하면 개체 수준의 속성이 그룹 수준의 속성으로 바뀐다
    • 그룹 수준의 속성이 가지는 정보로 다 집약됨
      • 1반 개개인 수학 점수(여러 개) → 1반 전체 수학 점수 평균(1개)
SELECT  
FROM  
WHERE 
GROUP BY <컬럼명> 

HAVING

  • 그룹 수준 속성들의 조건절에 해당

GROUP BY NULL

  • 전체 행들을 하나의 그룹으로 보겠다는 의미
  • SELECT SUM(SAL) FROM EMP;라는 쿼리는 사실 GROUP BY NULL이 생략되어 있는 것
SELECT SUM(SAL) 
FROM EMP  
GROUP BY NULL; 

그룹함수

  • 여러 가지 GROUP BY의 결과들을 합치는 역할을 하는 함수
    • GROUPING SETS
    • CUBE
    • ROLLUP

GROUP BY

ROLLUP (인수 한 개)

  • 제품분류에 대한 group by과 총합을 같이 출력

GROUPING SETS

  • GROUPING SETS는 각 인수들의 GROUP BY 결과를 합친 결과이다.
    • 여러 가지 group by의 조합을 표현해 주는 함수
      • GROUP BY GROUPING SETS(JOB,DEPTNO)GROUP BY JOBGROUP BY DEPTNO 두 개를 합쳐서(union all) 출력해 주는 것
      • 총합까지 출력하고 싶다면 GROUP BY GROUPING SETS(JOB,DEPTNO,NULL)
  • GROUPING SETS(()) 혹은 GROUPING SETS (NULL) 은 전체에 대한 총합 행을 출력시킨다는 사실을 반드시 기억하자.
  • GROUPING SETS(A,B,C,D) 의 결과값은 GROUPING SETS(A) + GROUPING SETS(B) + GROUPING SETS(C) + GROUPING SETS(D) 와 동일한 결과를 출력한다.

ROLLUP : 인수가 두 개 이상인 경우 ★★★

  • ROLLUP(A,B) 로 인수가 두 개인 경우에는 ROLLUP의 결과값을 다음과 같이 구할 수 있다.




ROLLUP(A,B)
= GROUPING SETS((A,B))+ GROUPINGS SETS(A) + GROUPING SETS(NULL)
= GROUP BY A, B + GROUP BY A + 총합 행

  • 예시
    • 다음의 결과값을 보고 어떻게 SQL 명령문을 구성할지 예상해보자. (단, ROLLUP을 사용한다.)
      • 가장 먼저 그룹 함수로 인해 생긴 NULL을 확인해야 함

        → 빨간 네모 NULL은 MGR 값이 NULL인 것(그룹 함수로 인해 생긴 게 아님)
      • 다음으로 group by 기준이 몇 개 있는지 확인(같은 수준의 group by 묶기)

        → 첫 번째: 파란색, 두 번째: 라임색, 세 번째: 하늘색
    • 쿼리 작성하기: ROLLUP(MGR,DEPTNO)
      1. 파란색: GROUPING SETS((MGR,DEPTNO))
      2. 라임색: GROUPINGS SETS(MGR)
      3. 하늘색: GROUPING SETS(NULL)

정리 : 그룹함수 인수 2개인 경우 ★★★

  • GROUP BY 그룹함수 (A,B)
  • ROLLUP : GROUP BY A,B + GROUP BY A + GROUP
    BY NULL
  • CUBE : GROUP BY A,B + GROUP BY A + GROUP BY
    B + GROUP BY NULL
  • GROUPING SETS : GROUP BY A + GROUP BY B

그룹함수의 특징

  • ROLLUP

    • ROLLUP의 인수는 계층구조이므로 인수 순서가 바뀌면 수행 결과도 바뀐다.
      ROLLUP(DEPTNO,MGR) ≠ ROLLUP(MGR,DEPTNO)
  • CUBE

    • 다차원 집계 함수이므로, 시스템 부하가 ROLLUP 보다 크다
    • CUBE의 인수들은 평등한 관계이므로, 순서는
      무관하다.
      CUBE(DEPTNO,MGR) = CUBE(MGR, DEPTNO)
  • GROUPING SETS

    • GROUPING SETS의 인수들은 평등한 관계이므로, 순서는 무관하다.
      GROUPING SETS(DEPTNO,MGR) = GROUPING SETS(MGR, DEPTNO)

윈도우 함수

  • 개별 데이터들에 대한 연산 결과를 출력해주는 분석 함수(Analytical Function)

  • PARTITION BY

    • GROUP BY 와 비슷한 역할, 기준컬럼에 따라서 윈도우 함수 처리 범위를 모으는 역할
  • ORDER BY

    • 정렬 작업으로 행과 행간의 관계를
      정의해주는 역할
  • WINDOWING 절

    • 값의 처리 범위를 정의

순위 함수 ★★★

집계함수

  • 윈도잉(WINDOWING) 처리 범위 결정
    • 필터 연산 방식: 어떤 행에 대해 정보 처리를 할 때 테이블 위에서부터 아래로 하나씩 내려가면서 데이터 처리
      • unbounded preceding: 최초 행
      • unbounded following: 최후 행
      • currunt row는 최초 행에서 최후 행으로 내려가는(움직이는) 개념
    • 내려갈 때마다 윈도우 함수 처리를 함
      • currunt row 기준 앞쪽에 있는 행: PRECEDING
      • currunt row 기준 앞쪽에 있는 행: FOLLOWING
<집계함수> (<집계 대상 컬럼명>) OVER (
  PARTITION BY <집계할 대상의 범위> 
  ORDER BY <정렬 기준 컬럼 > 
  ROWS <행의 수> PRECEDING
) 
<집계함수> (<집계 대상 컬럼명>) OVER (
  PARTITION BY <집계할 대상의 범위> 
  ORDER BY <정렬 기준 컬럼 > 
  ROWS BETWEEN <행의 수1> AND <행의 수2>
) 
<집계함수> (<집계 대상 컬럼명>) OVER (
  PARTITION BY <집계할 대상의 범위> 
  ORDER BY <정렬 기준 컬럼 > 
  RANGE <>  PRECEDING
) 
<집계함수> (<집계 대상 컬럼명>) OVER (
  PARTITION BY <집계할 대상의 범위> 
  ORDER BY <정렬 기준 컬럼 > 
  RANGE BETWEEN <1> AND <2>
)  

행 순서 함수

  • FIRST_VALUE (<값>)
    • 윈도우에서 가장 처음에 나오는 값을 구한다.
  • LAST_VALUE (<값>)
    • 윈도우에서 가장 나중에 나오는 값을 구한다.
    • 여러 가지 파티션을 나눴을 때 의도한 대로 값이 안 나오는 경우가 있음
      • WINDOWING절의 디폴트 값이 RANGE BETWEEN unbounded preceding AND currunt row이기 때문
      • currunt row라는 개념이 어떤 파티션의 마지막에 있는 개념이 아니라 계속 내려감 → 내려갈 때마다 최후 행이 계속 바뀌기 때문에 LAST_VALUE를 실행하게 되면 값의 처리 범위가 '현재의 값'이 나오는 것을 확인할 수 있음
      • 의도한 대로 사용하려면 RANGE BETWEEN unbounded preceding AND unbounded following으로 쓸 것
  • LAG (<값>, <숫자1>, <숫자2>)
    • 파티션에서 <값>에 대하여 현재행 이전 <숫자1>행의 값을 구한다. 그 값이 없다면 <숫자2>를 반환한다.
    • LAG → 현재 행이 늦다 → 현재 행보다 앞에 있는 값을 출력한다!
  • LEAD (<값>, <숫자1>, <숫자2>)
    • 파티션에서 <값> 에 대하여 현재행 이후 <숫자1>행의 값을 구한다. 그 값이 없다면 <숫자2>를 반환한다.

비율 관련 함수

  • RATIO_TO_REPORT
    • 파티션 내 전체 SUM(컬럼)값에 대한 행별 칼럼 값의 백분율을 소수점으로 구할 수 있다.
  • CUME_DIST
    • 파티션 전체 건수에서 동일한 할당을 나누었을 때, 누적 백분율을 조회한다. (누적 분포상
      위치를 0~1사이 값을 가진다.)
  • PERCENT_RANK
    • 파티션에 제일 먼저 나온 것을 0으로 제일 늦게 나온 것을 1로 하여, 값이 아닌 행의 순서별 위치 백분율을 조회한다. <중위값, Q1,Q2,Q3>
  • NTILE(n) → 조 편성 함수 ★★★
    • 파티션 별로 N등분하여 조를 나눈다. 이때
      나머지는 상위 조에게 순서대로 배정되게 한다.
      - 딱 떨어지지 않는 경우는 나머지를 위에서부터 한 명씩 밀어넣는다.

조인(JOIN) : 수평결합 ★★★

테이블의 결합 두 가지
→ 수평 결합: 조인(JOIN)
→ 수직 결합: 집합 연산자(Set Operator)

CROSS JOIN

  • 조건 없이 2개의 테이블을 하나로 조인하는 것이다.
  • 카테시안 곱(Cartesian Product)이 발생한다.
    • 가능한 모든 조합의 수를 만듦
SELECT  
  A.EMPNO
  , A.ENAME
  , B.DEPTNO
  , B.DNAME  
FROM 
  EMP  A
  , DEPT B
;  

INNER JOIN

  1. comma 사용 & where절 조건
    • inner join의 결과를 억지로 만들어 줌
SELECT
  A.EMPNO
  , A.ENAME
  , B.DEPTNO
  , B.DNAME  
FROM
  EMP  A
  , DEPT B  
WHERE
  B.DEPTNO = A.DEPTNO 
;   
  1. 조인 구문 사용
    • on절을 사용해 조인 조건절을 기술
    • INNER JOIN 대신 JOIN만 써도 됨
SELECT
  A.EMPNO
  , A.ENAME
  , B.DEPTNO
  , B.DNAME  
FROM
  EMP A  
  INNER JOIN DEPT B  
  ON B.DEPTNO = A.DEPTNO 
;  

NATURAL JOIN의 특징

SELECT 
  EMPNO
  , SAL   
FROM 
  EMP 
  NATURAL JOIN EMP2
  1. USING, ON, WHERE 절로 조인 조건 절을 서술할 필요가 없다.
  2. 공통 컬럼을 자동적으로 찾아서 조인한다. & 맨 앞에 나옴
  3. OUTER JOIN 에서도 사용 가능하다.

외부조인 (OUTER JOIN)

  • OUTER JOIN은 선행 테이블(좌측 테이블) 혹은 후행 테이블(우측 테이블)을 기준으로 조인 조건에
    만족하지 않는 행들을 포함하여 출력한다.

  1. LEFT JOIN
SELECT 
FROM 
  <테이블 명 1> 
  LEFT OUTER JOIN <테이블 명 2> 
  ON <조인 조건식> 
SELECT 
FROM <테이블 명 1>, <테이블 명 2>
WHERE <테이블 명1 컬럼> = <테이블명2 컬럼>(+)  

→ NULL이 붙는 컬럼에 (+)를 붙여 주면 left join으로 처리됨

  1. RIGHT JOIN
SELECT 
FROM
  <테이블 명 1>
  RIGHT OUTER JOIN <테이블명 2> 
  ON <조인 조건식> 
SELECT 
FROM <테이블 명 1>,<테이블 명 2> 
WHERE <테이블 명1 컬럼> (+) = <테이블명2 컬럼> 

셀프조인(SELF JOIN)

: 같은 테이블을 조인하는 것. 계층형 데이터가 있을 때 주로 사용.

  • 부모노드(root)에서 부터 자식노드(leaf)까지 데이터들을 전개하는 것을 순방향 전개라고 한다.
  • 셀프 조인에서는 두 개 이상의 동일한 테이블을
    이용해서 조인이 이루어지는데, 동일 테이블 각각의 역할이 다르다.
SELECT
  A.EMPNO
  , A.ENAME
  , B.EMPNO
  , B.ENAME
FROM
  EMP A
  , EMP B
WHERE
  A.EMPNO = B.MGR
;

→ A의 직원 번호는 B의 상사 번호다: A가 상사고 B가 부하

SELECT
  A.EMPNO
  , A.ENAME
  , A.MGR
  , B.EMPNO
  , B.ENAME
FROM
  EMP A
  , EMP B
WHERE
  A.MGR = B.EMPNO
;

→ A의 상사 번호가 B의 직원 번호다: A가 부하고 B가 상사

계층형 질의 ★★★

  • 부모와 자식, 상사와 부하와 같은 구조를 계층형 구조라고 부른다.
  • ORACLE에서는 이러한 계층형 데이터를 분석하기 위한 기능을 제공한다. 이를 계층형 질의라고 한다.
    ※ 계층형 질의는 SQL SERVER에서 지원하지 않는다
SELECT 
  EMPNO
  , ENAME
  , MGR
  , CONNECT_BY_ISLEAF
  , LEVEL 
FROM EMP 
WHERE 
  <조건절> 
  START WITH MGR IS NULL 
  CONNECT BY PRIOR EMPNO=MGR
; 

→ 해석 순서
① START WITH → level = 1 찾기
② CONNECT BY: level 1의 empno가 level 2의 mgr이다.
③ WHERE절 순서

  • START WITH
    • 계층 구조 전개의 시작위치 (루트 데이터, 부모 데이터의 정보)
  • CONNECT BY
    • 다음에 전개될 자식데이터를 지정한다.
    • 계층형 전개의 조건식으로, 자식 데이터는 CONNECT BY 절에 주어진 조건을 만족해야 한다.
  • PRIOR
    • CONNECT BY 절에 사용되며, 이전 레벨 데이터를 지칭할 때 쓴다.
  • WHERE
    • 모든 전개 수행 후에, 지정된 조건을 만족하는 데이터만을 추출한다.
      ※ 계층 데이터 형성 후 가장 마지막에 적용되는 조건이다.
  • CONNECT BY PRIOR 자식컬럼 = 부모컬럼
    🡆 부모에서 자식으로 트리 그리기 : 순방향 전개

더 알아보기

예시 1: 순방향 쿼리

SELECT LEVEL, 사원이름, 직속상관, 직급
FROM 사원
START WITH 직속상관 IS NULL
CONNECT BY PRIOR 사원이름 = 직속상관 ;


예시 2: 역방향 쿼리

SELECT LEVEL, 사원이름, 직속상관, 직급
FROM 사원
START WITH 사원이름 = '경래'
CONNECT BY PRIOR 직속상관 = 사원이름 ;

가상컬럼

  • LEVEL
    • 루트 데이터면 1 하위 데이터이면 2이다.
    • 리프(Leaf) 데이터까지 1씩 증가한다.
  • CONNECT_BY_ISLEAF
    • 전개 과정에서 해당 데이터가 리프 데이터이면 1, 그렇지 않으면 0이다. - SYS_CONNECT_BY_PATH(<컬럼명>, ‘<경로분리자>’)
    • 루트 데이터부터 현재 전개할 데이터까지의 경로를 표시한다.
  • CONNECT_BY_ROOT(<컬럼명>)
    • 현재 전개할 데이터의 루트 데이터를 표시한다.
      ※ CONNECT_BY_ROOT에서 최상위 관리자 본인의 이름도 등장한다.

서브쿼리

  • 쿼리문(메인쿼리) 안에 들어가는 쿼리문(서브쿼리)
  • 쿼리문 작성 시 사용되는 값을 다른 쿼리에서 구해야 할 경우 사용한다.

반환 결과에 따른 서브쿼리 분류

INLINE VIEW (인라인뷰)

  • FROM 구에 SELECT문을 사용하여 가상의 테이블을 만드는 효과가 있다.
    • 서브 쿼리의 결과가 하나의 테이블로 기능

상호연관 서브쿼리

SELECT 
  A.ENAME
  , A.SAL
  , A.DEPTNO 
FROM 
  EMP A 
WHERE
  A.SAL > (
    SELECT 
      AVG(B.SAL) 
    FROM 
      EMP B 
    WHERE 
      A.DEPTNO = B.DEPTNO
  )
; 

  • 하나하나 내려가면서 출력 대상인지 여부를 판단
    • SMITH에 대해 판단: 메인 테이블 A에 있는 A.DEPTNO가 20으로 고정됨
      • 20번 부서의 평균 급여보다 SMITH의 급여가 큰지 판단
    • ALLEN에 대해 판단: A.DEPTNO가 30으로 고정됨
  • 행 하나당 쿼리가 하나씩 돌아감
    • 14개 생이 있으면 서브 쿼리가 14번 돌아가는 것
      • 메인 쿼리 하나당 여러 개의 서브 쿼리가 있기 때문에 서브쿼리는 메인쿼리의 컬럼을 참조할 수 있지만 서브쿼리의 컬럼을 메인쿼리에서 참조하는 것은 안 됨

다중행 서브쿼리 연산자

  • IN
    • 서브쿼리의 결과 중 하나라도 일치하면 조건은 TRUE
      • 등호와 OR 조건을 합친 결론
  • ANY,SOME
    • 서브쿼리의 결과와 하나 이상 일치하면 조건은 TRUE
      • OR 조건을 합친 결론
  • ALL
    • 서브쿼리의 결과와 모두 일치해야 조건이 참이 된다.
      • AND 조건을 합친 결론
  • EXISTS
    • 데이터의 존재 여부를 확인하는 쿼리에 해당한다. (만족하는 값이 없으면 공집합을 반환)
      • 있으면 1 없으면 0

exists, any 같은 경우 서브쿼리로 사용을 하더라도 '세미 조인'이라고 하는 특이한 조인의 모양을 만들어 줌 + 안티 조인

집합연산자 (수직결합)

  • UNION : 합집합 <중복된 것 배제, 정렬의 의미를
    포함>
  • UNION ALL : 합집합, 중복된 데이터를 모두 가져온다.
    <정렬 없음>
  • INTERSECT : 교집합 <중복된 것 배제>
  • MINUS : 차집합 <MS SQL에서는 EXCEPT>, <중복된
    것 배제>

테이블명, 컬럼명 명명 규칙

  • 테이블블명과 컬럼명은 반드시 문자로 시작해야한다.
  • A-Z,a-z,0-9
  • 특수문자는 _, $, #만 사용 가능

제약조건

  • 목적 : 데이터의 무결성 유지
    • UNIQUE KEY(고유키) : 고유키 정의
    • NOT NULL : NULL 값 입력금지
    • PRIMARY KEY(기본키) : UNIQUE & NOT NULL
    • CHECK : 입력 값 범위 제한
    • FOREIGN KEY(외래키) : NULL 가능 → 다른 테이블에 있는 PK를 상속

DDL(Data Definition Language)

CREATE: 테이블 생성

CREATE TABLE 테이블명 (컬럼명 데이터유형 제약조건);

ALTER: 테이블 구조 변경

  • 컬럼 추가 : ALTER TABLE 테이블명 ADD(컬럼명 데이터유형);
  • 삭제 : ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
  • 수정 : ALTER TABLE 테이블명 MODIFY (컬럼명 데이터유형 제약조건);

테이블 구조 변경

제약조건 삭제 : DROP CONSTRAINT 제약조건명;
제약조건 추가 : ADD CONSTRAINT 제약조건명 조건
테이블명 변경 : RENAME 변경전 테이블명 TO
변경후 테이블명;
테이블 삭제 : DROP TABLE 테이블명;
테이블 데이터 삭제 : TRUNCATE TABLE 테이블명;
컬럼명 변경 : RENAME COLUMN 변경전 컬럼명 TO
변경 후 컬럼명

INSERT

  • DML 중 하나
INSERT INTO TABLE (<컬럼명1>,<컬럼명2>,…) 
VALUES(<값1>,<값2>,…); 
  • VALUES의 로우 정보값
    • 문자열일 경우, ‘’를 붙여서 입력
    • 숫자일 경우, ‘’ 없이 입력
  1. 데이터의 추가
    INSERT INTO EXAMPLE (EMPNO,ENAME,JOB) VALUES(1000,’김강민’,’인사’);
  2. 컬럼목록을 생략하는 경우 데이터의 추가
    INSERT INTO EXAMPLE VALUES(1001, ‘이성우’ ,’영업’);
    • 하나라도 비면 오류 발생
  3. 컬럼 목록에 모든 컬럼이 있지 않는 경우
    INSERT INTO EXAMPLE (EMPNO,ENAME) VALUES(1002,’김영희’);
    • 나머지는 NULL로 출력
      • NOT NULL 조건이 있다면 insert에 오류 발생

UPDATE

UPDATE <테이블명>  
SET <컬럼1>=<1>,WHERE <조건문>;
  • where절로 데이터를 찾고 그 데이터를 삭제하고 삽입하는 과정을 거침(데이터 변경)

DELETE

DELETE FROM <테이블명> 
WHERE <조건절>;
  • 데이터를 찾고 삭제

TCL(트랜잭션 관리 언어)

  • COMMIT
    • 트랜잭션을 완료하고 디스크에 반영한다.
    • COMMIT 후, 복구는 불가하다.
  • ROLLBACK
    • 트랜잭션을 취소한다.
    • 마지막 COMMIT 지점으로 돌아간다.
  • SAVEPOINT
    • ROLLBACK 시 돌아가는 저장포인트를 지정한다.
      (세이브포인트 동일 이름 지정 시 덮어쓰기됨)

ORACLE COMMIT

  • DML(INSERT, UPDATE, DELETE) 는 사용자가 반드시
    커밋 해주어야 데이터베이스에 반영된다.
  • DDL(CREATE, ALTER, DROP, TRUNCATE) 는 사용시
    자동적으로 커밋이 이루어진다.

SQL SERVER COMMIT

  • AUTO COMMIT OFF : DML, DDL 모두 커밋 요함
  • AUTO COMMIT ON : DML, DDL 모두 자동 커밋

DELETE VS TRUNCATE

  • delete는 dml이고 truncate는 ddl임
  • DELETE : ROLLBACK 으로 복구 가능
  • TRUNCATE : 시스템 활용의 측면에서 TRUNCATE
    시스템 부하가 적음
    • truncate는 ddl이라 자동으로 커밋이 이루어짐 → 이전으로 복구하기 어렵지만 기존에 있던 모든 로그 데이터를 삭제해 버리기 때문에 시스템 활용 측면에서 조금 재사용성이 높다는 특징이 있음

트랜잭션의 특성(ACID)

  • 원자성(Automicity) : 트랜잭션에서 정의된 연산들은 모두
    성공적으로 실행되던지 아니면 전혀 실행되지 않은
    상태로 남아있어야 한다.
  • 일관성(Consistency) : 트랜잭션이 실행되기 전의 데이터베이스
    내용이 잘못 되어있지 않다면 트랜잭션이 실행된
    이후에도 일관성 있는 데이터베이스를 유지한다.
  • 고립성(Isolation) : 트랜잭션이 실행되는 도중에 다른
    트랜잭션의 영향을 받아 잘못된 결과를 만들어서는
    안된다.
  • 지속성(Durability) : 트랜잭션이 성공적으로 수행되면 그
    트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로
    저장된다.

DCL(Data Control Language)

: 크게 객체 권한과 시스템 권한이 존재

  • GRANT
    • 데이터베이스 사용자에게 두 가지 권한을 부여하는 것이다.
    • 데이터베이스의 사용을 위해 데이터의 연결, 수정, 입력, 삭제, 조회 등을 하게 해준다.
  • REVOKE
    • 데이터베이스 사용자에게 부여된 권한을 회수한다.

GRANT <권한명> ON <객체명> TO <유저명>
REVOKE <권한명> ON <객체명> FROM <유저명>

ROLE

  • 사용자에게 허가할 수 있는 권한들의 집합
  1. ROLE을 이용하면 권한 부여와 회수를 쉽게 할 수 있다. (권한 묶음)
  2. ROLE은 CREATE ROLE 권한을 가진 USER에 의해 생성된다.
  3. 한 사용자가 여러 개의 ROLE을 가질 수 있고, 여러 사용자에게 동일한 ROLE을 부여할 수 있다.
  4. GRANT 와 REVOKE로 사용자에게 ROLE을 부여하고 취소도 가능하다.
  5. 사용자는 ROLE에 ROLE을 부여하는 것도 가능하다.

뷰(VIEW)

  • 뷰는 데이터베이스에서 제공하는 가상의 테이블을 의미한다.
    • 테이블에서 파생된 오브젝트
  • 뷰를 사용하면 복잡한 쿼리문을 대신할 수 있기 때문에 개발의 용이성을 가진다.
  • 뷰는 뷰를 만들 때 사용한 쿼리문을 저장하는 것이며, 뷰를 조회할 때는 뷰를 만들 때 사용한 쿼리문이 동작한다.

이론상 뷰의 장점(빈출) <독.편.보>

  • 독립성
    • 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다.
  • 편리성
    • 복잡한 질의를 뷰로 생성함으로서 관련 질의를 단순하게 작성할 수 있다.
  • 보안성
    • 숨기고 싶은 정보가 있다면 뷰를 생성할 시에 해당 컬럼을 빼고 생성하여 사용자에게 정보를 감출 수 있다.

SQLD 자격증 2시간 집중강의

기출문제 풀어보기

profile
2 B R 0 2 B

0개의 댓글