반응형

데이터 모델링?

주어진 개념으로 부터 논리적인 데이터 모델을 구성하는 작업. 

 

설계 순서 

1. 요구사항 파악 -> 2. 개념적 데이터 모델 설계 (ERD 작성) -> 3. 논리 모델링 -> 물리 모델링

 

모델링 3가지 요소

1. 업무가 관여하는 어떤 것(Things)

2. 어떤 것이 가지는 성격(Attributes)

3. 업무가 관여하는 어떤 것 간의 관계(Relationship)

 

좋은 데이터 모델의 요소 

1. 완전성

2. 중복배제 

3. 업무규칙

4. 데이터 재사용

5. 의사소통

6. 통합성

 

데이터 모델링 용어

논리 모델 물리 모델
엔티티(Entity) 테이블(Table)
속성, 어트리뷰트(Attribute) 컬럼(Column)
관계, 릴레이션(Relation) 관계, 릴레이션(Relation)
키 그룹(Key group) 인덱스(Index)

 

논리 모델링

  • 어떤 정보를 객체화 할 것인가에 대한 규정(엔티티, 엔티티타입, 관계 정의)
    • (EX) 업무를 분석하여 그에 대한 데이터 집합/ 관계를 중점적으로 표현하는 것

 

물리 모델링 

  • 실제 DBMS에서 생성될 테이블을 설계.
  • 논리 모델링에서 도출된 각 엔티티 관계에 의해 나올 수 있는 테이블을 설계하거나
    • (EX) many to many 관계에서 도출되는 table, super-sub 관계에서 도출되는 테이블 등)
  • 관계에 대한 정의 (cascade 등등), index, 컬럼별 데이터 타입 및 제약 조건 등의 속성 정의 하여 정규화 실행

 

 

결과적으로는 모델링의 각종 이슈를 반영한 ERD를 포워딩 했을때 정확하게 데이터베이스가 생성되는 것을 보통 설계가 끝났다고 표현합니다.

 

 

ERD

:Entity Relationship Diagram / 데이터들의 관계 도표

 

ERD 규칙

 

- 엔티티(Entity) : 정보가 저장될 수 있는 사람, 장소, 사물, 사건 등 독립적인 존재. 즉, 테이블(학생, 과목, 수강, 사원, 부서)

     

- 두 개체의 관계 _선

 

- A 테이블의 PK 를 B테이블이 소유하면 -> A : 부모 / B : 자식

- 실선 : 부모 테이블의 PK를 자식 테이블이 가지고 있으며, 자식 테이블의 PK로 사용 시 

- 점선 : 부모 테이블의 PK를 자식 테이블이 가지고 있으나, 자식 테이블의 PK로 미사용 시

 

 

Address 개체에서 address_id가 PK로 설정이 되어있는데 Store 개체가 address_id를 가지려 한다면,

 

이 때 식별자 관계에서는 FK를 PK로 설정(🔑)을 했고,

비식별자 관계에서는 일반 속성(🔹)으로 가지고 온 것을 확인 가능

 

참고로, FK를 PK로 지정할 때의 

하나의 예시로 자식 테이블에서 할아버지/할머니 테이블을 참조할 때가 있을 수 있음.

상황에 따라 필요할 수도 있고 필요 없을수도?

 

 

 

- 속성(Attribute) : 엔터티의 성질, 분류, 수량, 상태 특성을 구체적으로 나타내는 세부 항목. 즉, 물리적 모델의 컬럼(열)을 말함.

※관계스키마 : 과목(과목코드, 과목내용, 과목명)

학생(이름, 학번, 주소, 전공, 취미)

 

 

 

     (1) 속성유형

     - 단순 속성(Simple Attribute)  : 더 이상 작은 구성원소로 분해 할 수 없는 속성

     - 복합 속성(Composite Attribute) : 몇 개의 기본적인 단순 속성으로 분해 할 수 있는 속성

 

     - 다중 값 속성(Multivate Attribute) : 다중 값 속성은 한 엔터티에 대해서 여러 개의 값을 갖는 것으로써, 취미 속성

 

 

     - 유도된 애트리뷰트(Derived Attribute) : 실제 값이 저장되어 있는 것이 아니라 저장된 값으로부터 계산해서                                                                    얻은 결과 값을 사용하는 애트리뷰트를 말한다.

 

 

     (2) 주 식별자 / 비 식별자

     - 주 식별자 : 식별 할 수 있는 유일한(Primary Key) 제약 조건을 갖는속성

       ERD에서 실별자는 속성에 밑줄을 그어서 표현

     

     예제) ERD

 

 

※ 관계스키마 : 사원(사원번호(PK), 이름, 주소, 주민번호)

취미

부서(부서코드(PK), 부서명)

 

   

     (3) 관계 (Relation)

 

     - 엔터티 사이의 연관성을 표현하는 개념

     - 두 개의 엔터티 타입 사이의 업무적인 연관성을 논리적으로 표현

     - ERD에서 엔터티들 사이에 관계

     - 타입은 마름모를 사용하여 표현한 후 그 관계에 연관된 엔터티에 선으로 연결하여 표시

 

     예제) ERD

 

      - 소속 관계

    - 수강 관계

 

 

     (4) 유형

     1. 카디날리티(Cardinality) : 관계의 대응 엔터티 수라고도 함

     2. 카디날리티 표현방법 : 일대일(1:1), 일대다(1:N), 다대다(N:M)

 

 

- 두 개체의 관계 - 선의 끝Cardinality

Cardinality(차수)는 한 개체에서 발생할 수 있는 발생 횟수를 정의하며,

다른 개체에서 발생할 수 있는 발생 횟수와 연관.

1대1관계, 1대N관계, N대N 관계가 있음.

 

 

 

✔️  One-to-One Cardinality

 

1:1 관계에서는 아래와 같이 표기합니다.

One-to-One Cardinality

 

 

 

✔️  One-to-Many Cardinality

 

1:N 관계에서는 아래와 같이 표기합니다.

 

 

 

✔️  Many-to-Many Cardinality

N:M 관계에서는 아래와 같이 표기합니다.

 

 

Many-to-Many Cardinality

 

 

 

필수참여 조건

'|' 표시가 있는 곳은 반드시 있어야 하는 개체, 'O' 표시가 있다면 없어도 되는 개체

 

 

inventory 개체가 없어도 store 개체는 있을 수 있고, store 개체가 없다면 inventory 개체도 있을 수 없음.

 

 

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]LOCK이란?  (0) 2020.06.02
[SQL]Join VS Union  (0) 2020.05.26
[MySQL] CASE, COALESCE, IFNULL NULL 처리  (1) 2020.03.11
[MySQL]프로그래머스_입양 시각 구하기(2) (UNION/변수선언)  (2) 2020.03.10
[Oracle DB]Join 종류  (0) 2020.01.06
반응형

 

 

 

 

 

 

 

 

 

 

- 정의 : 데이터의 일관성을 보장하기 위한 방법 (= 잠금 / 데이터를 동시에 사용하게 해주는 기능)
- 유형

  • Shared Lock(= 공유 Lock / Read Lock) : 다른 사용자가 같이 읽는 것을 허용하지만 변경하는 것은 허용하지 않음

    • Select

  • Exclusive Lock(= 배타적 Lock / Write Lock) : 다른 사용자가 읽는 것, 변경하는 것 모두를 허용하지 않음

    • Insert / Update / Delete

- Lock 단위

  • RID : 하나의 행

  • KEY : 인덱스가 있을 때 행

  • PAGE : 8KB 데이터 페이지 또는 인덱스 페이지

  • EXTENT : 인접한 8개의 데이터 페이지 또는 인덱스

  • TABLE : 데이터와 인덱스가 포함된 전체 테이블

  • DB : 데이터베이스

- Lock 종류

  • SHARED(S)

    • 트랜잭션이 데이터를 읽기 동안에만 잠금

    • 공유잠금(S) 를 사용시, 여러 트랜잭션이 동시에 하나의 개체를 읽을 수 있다. 즉, 공유 잠금끼리는 서로 충돌되지 않는다

    • 공유잠금(S) 를 사용시, 다른 트랜잭션이 데이터를 변경할 수 없다.

    • 다음 행을 읽을 때, 현재 행의 공유 잠금을 해제한다.

      • 예외 사항

        • 트랜잭션 고립수준 : REPEATABLE 레벨 이상 설정 시

        • LOCK HINT 써서, 해당 공유잠금을 트랜잭션 끝까지 유지

        • SELECT * FROM EMP(HOLDLOCK)

  • EXCLUSIVE(X)

    • 트랜잭션이 데이터를 변경할 때 단독 잠금

    • 단독잠금이 걸린 데이터는 다른 트랜잭션이 공유 잠금, 단독 잠금 또한 걸 수 없다.

    • 오직 하나의 트랜잭션만이 데이터에 대한 단독 잠금을 걸 수 있다.

      • 예외 사항

        • 트랜잭션 격리 수준사용해서 단독 잠금 걸린 데이터를 다른 트랜잭션이 읽게 할 수 있다.

  • UPDATE(U)

    • 트랜잭션이 변경할 데이터를 찾으면 거는 락

    • 나중에 데이터를 변경할 때 까지 데이터가 변경되지 않았음을 확신하기 위해 건다.

    • 한 번에 한 트랜잭션에만 업데이트 잠금을 얻을 수 있기 때문에 교착상태(deadLock)이 방지된다.

    • U 잠금이 걸린 데이터에는 다른 트랜잭션이 U잠금이나 X잠금을 걸 수 없지만, S잠금은 걸 수는 있다.

  • INTENT(I)

    • 트랜잭션이 대상 데이터에 잠금을 걸 수 있을지 없을지를 신속히 판단할 수 있게 도와주는 잠금

    • ex ) 의도적 공유 잠금 (IS) 를 테이블 수준에서 설정 = 해당 트랜잭션이 해당 테이블의 페이지 또는 행에 대해 공유 잠금을 설정

    • 직접 테이블의 모든 행, 페이지 잠금을 확인할 필요가 없기 때문에 성능이 향상된다.

    • 종류

      • IX (= 의도적 배타저 잠금) : 잠금을 걸려는 트랜잭션이 각 리소스 계층 (테이블, 페이지, 행) 에 대해 X 잠금 설정하여 계층의 아래쪽 일부 리소스 수정

      • SIX (= 공유 및 의도적 배타적 잠금) : 잠금을 걸려는 트랜잭션이 각 리소스 계층에 대해 IX 잠금을 설정하여 계층의 아래쪽에 있는 모든 리소스에 대해서는 읽기 작업 / 일부 리소스는 수정 작업 / 최상위 수준 리소스에서는 동시 IS 잠금 허용

  • SCHEMA (Sch)

    • Sch-M (Schema Manipulation)

      • DDL(스키마 변경) 문 실행 시, Schema 자체에 대해서 건다.

      • 모든 잠금에 대해 배타적, 어떤 작업도 허용하지 않음.

    • Sch-S (Schema Stability)

      • 쿼리문 컴파일 시 발생한다

      • S or X와 호환된다

      • 다른 트랜잭션 잠금을 차단하지 않 cl는다.

      • DDL 작업은 수행할 수 없다.

Lock 옵션 (WITH ~)

  • 테이블 힌트

    • 쿼리문 작성 시 FROM 절에 오는 테이블 이름 다음에 WITH 구문으로 옵션 작성

    • 사용시 사용자가 원하는 형태로 강제 판단할 수 있음.

  • 테이블 힌트 종류
    • NOLOCK ( = READUNCOMMITED) 
      • 배타적잠금 걸린 대상에 대해 공유잠금(S)를 설정할 수 없어 차단 발생 시,
      • 공유 잠금이 걸린 대상에 배타적잠금을 설정하는 경우 
        => 차단 현상이 발생하는 문제 발생 
      • 해결책 : SELECT 쿼리를 할 때 공유잠금을 설정하지 않고 데이터를 읽음 / 커밋되지 않은 결과를 미리 읽어오는 것
      • 예제 

 

    • ROWLOCK
      • 기본적인 행 단위 잠금을 사용하지만, 내부적 기준 따라 더 상위 단위(페이지, 테이블) 대상에 대해서 잠금 설정하려면 페이지 , 테이블 잠금을 자동적으로 승격하여 사용 
      • 해결책 : 사용자가 이를 통제하여 행단위잠금을 강제하기 위해서 사용하는 옵션
    • READPAST
      • 다른 트랜잭션이 잠근 행을 읽지 않음
    • XLOCK
      • 단독 잠금을 걸고 트랜잭션이 끝날 때 까지 유지
    • UPLOCK
      • SELECT 하는 대상에 대해 곧바로 배타적 잠금 설정 예정일 경우사용
      • SELECT 하는 대상에 다른 세션에서 배타적 잠금을 설정하지 못하도록 통제하기 위해서 사용 
      • 예시
1) SPID 51 : SELECT * FROM 테이블 WITH(UPDLOCK)
2) SPID 52 : UPDATE 테이블 SET...
3) SPID 51 : UPDATE 테이블 SET...


->  52번 업데이트 작업이 51번에서 설정된 UPLOCK 으로 인해 차단, 3번 UPDATE 작업은 계속하여 진행

 

 

- Lock 레벨

  • 아래 레벨 외에 인덱스(key)에 로우 레벨 lock 거는 경우 있음

  • locking level이 낮을 수록 동시성은 좋지만, 관리해야할 Lock 개수가 증가하기 때문에 더 많은 리소스 소비
  • locking level이 높을 수록 적은 양의 lock 리소스를 사용하지만 하나의 lock 으로 수많은 레코드를 한꺼번에 locking 하기 때문에 동시성은 나빠짐
  • Lock Level
로우 레벨 변경하려는 로우(실제로는 RID)에만 Lock을 설정하는 것
페이지 레벨 변경하려는 로우가 담긴 데이터 페이지(또는 인덱스 페이지)에 Lock을 설정하는 것
같은 페이지에 속한 로우는 진행 중인 변경 작업과 무관하더라도 모두 잠긴것과 같은 효과가 나타남.
익스텐트 레벨 익스텐트 전체가 잠김.
SQL Server의 경우, 하나의 익스텐트가 여덟 개 페이지로 구성되므로 8개 페이지에 속한 모든 로우가 잠긴 것과 같은 효과가 나타남.
테이블 레벨 테이블 전체 그리고 관련 인덱스까지 모두 잠김.
데이터베이스 레벨 데이터베이스 전체가 잠긴다.
보통 데이터베이스를 복구하거나 스키마를 변경할 때 일어 남.

 

 

- Blocking 

  • Lock들의 경합(Race condition) 이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태
    ->  먼저 Lock 을 설정한 트랜잭션을 기다려야하기 때문에, 이런 현상 반복시 빠른 서비스를 제공할 수 없다.
  • 공유 Lock - 배타적 Lock / 배타적 Lock - 배타적 Lock 끼리 블로킹 발생할 수 있음
  • 해결 방법 : Transaction commit 또는 Rollback
    1. SQL 문장에 가장 빠르게 실행되도록 리펙토링 하는 것
    2. 트랜잭션을 가능한 짧게 정의하면 경합 줄일 수 있음
    3. 동일한 데이터를 동시에 변경하는 작업을 하지 않도록 설계 
      / 트랜잭션이 활발한 주간에는 대용량 갱신 작업 수행하면 안됨
    4. 대용량 작업이 불가피할 경우
      작업 단위를 쪼개거나  / lock_timeout 설정하여 해당 lock 최대 시간 설정
set lock_timeout 3000

 

- DeadLock

  • 트랜잭션간의 교착상태 
  • 두 개의 트랜잭션 간에 각각의 트랜잭션이 가지고 있는 리소스 Lock 획득시 , 발생
  • 해결책 : 한쪽 트랜잭션 처리를 강제 종료 (비용이 적은 트랜잭션의 처리 강제 종료)

1. 첫번째 deadlock 예시

  • 1번 트랜잭션에서 2번 리소스의 잠금 획득 
  • 2번 트랜잭션에서 1번 리소스 잠금 획득

    -> 이 때, 동시에 상대방 데이터를 액세스하려고 할 때, 기존의 Lock 이 해제될 때 까지 기다리는 상황

 

2. 두번째 deadlock 예시

  • 1번 트랜잭션이 공유 Lock 설정하고 -> Sleep 
  • 2번 트랜잭션이 배타적 Lock 설정하려고 할 때, 무기한 기다리게 되는 교착상태에 빠짐

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

 

 

Join 과 Union 공통점 : 하나 이상의 테이블의 데이터 결합

 

Join 과 Union 차이점 : 데이터가 결합되는 방식

 

ex)

A테이블

col1  |  col2

-----------

A      |  1

B      |  1

C      |  2

C      |  2

D      |  3

 

B테이블

col1 |   col2

-----------

A     |  가

A     |  나

B     |  나

C     |  나

D     |  다

 

- Join : 새로운 열로 결합 (수평결합)

   -> 두 개의 테이블 결합 시, 첫 번째 테이블의 데이터는 동일한 행의 두 번째 테이블 열과 함께 한 열 세트에 표시

SELECT A.col1, A.col2, B.col2
FROM A
INNER JOIN B
ON A.col1 = B.col1;

 

결과)

A.col1    A.col2    B.col2

-----------------------

A          1            가

A          1            나

B          1            나

C          2            나

C          2            나

D          3            다

 

 

 

- Union : 새로운 행으로 결합(수직결합)

  -> 두 개의 테이블 결합 된 경우, 첫번째 테이블의 데이터는 한 행 세트에 있고 / 두 번째 테이블 데이터는 다른 세트에

  -> select 에 컬럼 수는 맞춰서 진행해야 한다.

SELECT col1, col2
FROM A
UNION
SELECT col1, col2
FROM B;

결과)

col1     col2

-----------

A        1

B        1

C        2

D        3 

A       가

A       나

B       나

C       나

D       다

 

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[RDB]데이터모델링  (2) 2021.08.19
[SQL]LOCK이란?  (0) 2020.06.02
[MySQL] CASE, COALESCE, IFNULL NULL 처리  (1) 2020.03.11
[MySQL]프로그래머스_입양 시각 구하기(2) (UNION/변수선언)  (2) 2020.03.10
[Oracle DB]Join 종류  (0) 2020.01.06
반응형

NULL 값은 더하거나 빼거나 곱하거나 나눌 수 없는 값

=> 필요에 따라 NULL 값을 '0' 또는 '원하는값'으로 변경할 수 있어야 한다. 

 

위의 테이블과 같이 컬럼이 비어있는 것을 "No Name"으로 채워서 처리하고 싶을 때  여러가지 방법이 있다.

 

1. CASE

: True / False를 판단하여 조건식에 맞게 값을 변환할 때 사용

사용 예시)
CASE WITH 조건식1 THEN 식1
            [WHEN 조건식2 THEN 식2 ...
              ELSE  식3]
END

 

//실제 사용예시
SELECT 
    ANIMAL_TYPE,
    CASE
        WHEN NAME IS NULL THEN "No name"
        else NAME

    END AS NAME,
    SEX_UPON_INTAKE
FROM ANIMAL_IN

 

2. COALESCE

: 입력받은 여러 개의 인자 중 NULL이 아닌 값을 반환

사용 예시)
SELECT COALESCE(ID, VALUE)
FROM 테이블

- 주의 사항 

   1. ELSE 문 꼭 사용 -> 기재하지 않으면 NULL 값

   2. NULL 값 체크 시 " = " 을 사용하지 않는다. 

 

SELECT
    ANIMAL_TYPE,
    COALESCE(NAME, "No NAME") AS NAME,
    SEX_UPON_INTAKE

FROM ANIMAL_INS

 

3. IFNULL()

: 해당 필드의 값이 NULL 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수 

  하나의 필드 값 뿐 아니라, 연속적으로도 활용할 수 있다.

 

사용 예시)
SELECT IFNULL(필드명, "대체할 값") FROM 테이블명; 
SELECT
    ANIMAL_TYPE,
    IFNULL(NAME, "No name") as NAME,
    SEX_UPON_INTAKE
from ANIMAL_INS
반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]LOCK이란?  (0) 2020.06.02
[SQL]Join VS Union  (0) 2020.05.26
[MySQL]프로그래머스_입양 시각 구하기(2) (UNION/변수선언)  (2) 2020.03.10
[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
반응형

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

 

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

 

HOUR COUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

다른 문제들과 달리 레벨4 라 조금 어려웠고, 새로운 이론도 알 수 있었던 문제였다.

 

방법 1. UNION  함수 사용

- UNION 이란?

  • 2개 이상의 쿼리를 결합할 때 사용
    • UNION : 결합 시 중복 제거 
    • UNION ALL : 결합 시 중복 제거 X

- 해결 방법

 

  • 0~23시 모든 시간에서, 
    해당 시각에 입양된 기록이 없어도(NULL 이어도) COUNT 0으로 출력하는 것이 관건

  • UNION으로 0~23 모든 시간을 가진 TABLE을 생성 후
    여기에 LEFT JOIN과 IFNULL을 사용해 문제 해결

SELECT H1.HOUR, IFNULL(OUTS.COUNT,0) AS COUNT 
FROM ( 
    SELECT 0 AS HOUR 
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 
    UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
    UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
     UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 
     UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 
     UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 ) H1 
     LEFT JOIN ( 
         SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' 
         FROM ANIMAL_OUTS 
         GROUP BY HOUR) AS OUTS ON H1.HOUR = OUTS.HOUR

 

 

 

 

방법 2. 변수 사용

- 0 ~ 23 시 모든 HOUR을 출력하기 위해 변수 사용

 

- MySQL 변수 선언 방법

  • SET @변수명 = '값';   => " = " : MySQL에서 대입연산자, 비교연산자 로 사용됨(SET 명령어에서만 대입 연산자로 인식)

  • SET @변수명 := '값';  => " := "

  •  

  • SET을 제외한 다른 쿼리문(SELECT 등)은 '=' 를 비교연산자(comparison operator)로 인식하기 때문에, SET이 아닌 쿼리문에서는 반드시 대입 연산자(assignment operator) ':='을 사용

- 해결 방법

  • SET으로 HOUR_LIST라는 변수 선언하고 +1 씩 하며 0 ~ 23시 까지 모든 시간에 대한 COUNT 출력

SET @HOUR_LIST = -1; 
SELECT 
(@HOUR_LIST := @HOUR_LIST + 1) AS 'HOUR', 
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR_LIST) AS 'COUNTS' 
FROM ANIMAL_OUTS 
WHERE @HOUR_LIST <23;

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]Join VS Union  (0) 2020.05.26
[MySQL] CASE, COALESCE, IFNULL NULL 처리  (1) 2020.03.11
[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB]PL / SQL 기초  (0) 2020.01.06
반응형

join을 통해 2개 이상의 테이블을 연결하여 원하는 데이터로 정제 

 

  • EQUIJOIN : 두 개의 테이블 간에 칼럼값들이 정확하게 일치하는 경우 사용(PK = FK)
  • NON - EQUIJOIN : 두 개의 테이블 간에 칼럼값들이 서로 정확하게 일치하지 않는 경우 사용
  • OUTER JOIN : 두 개의 테이블 간의 JOIN 걸었을 때, JOIN 조건 만족하지 않는 경우에도 그 테이블을 보고자 하는 경우(+) 연산자 사용하는 조인
  • SELF JOIN : 같은 테이블에 있는 행동을 JOIN 하는데 사용

 

EQUI JOIN  VS  OUTER JOIN

-- Equi Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno, d.dname
  FROM emp e, dept d
 WHERE e.deptno = d.deptno;
 
DEPTNO     DEPTNO
------ ----------
    10         10
    20         20
    30         30
 
-- Outer Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e, dept d
 WHERE e.deptno(+) = d.deptno;
 
DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40
              
-- ename LIKE 조건절에 (+)연산자가 누락된 경우
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename LIKE '%';
 
DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
 
-- ename LIKE 조건절에 (+)연산자를 추가해야 정상적으로 데이터가 조회 된다. 
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename(+) LIKE '%';
 
DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40

 

LEFT OUTER JOIN : 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용

-- LEFT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM dept d 
  LEFT OUTER JOIN emp e
  ON d.deptno = e.deptno;

 

RIGHT OUTER JOIN : 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우

-- RIGHT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
 RIGHT OUTER JOIN dept d
    ON e.deptno = d.deptno;

 

FULL OUTER JOIN : 양쪽 테이블 모두 OUTER JOIN 걸어야 하는 경우 사용

-- FULL OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
  FULL OUTER JOIN dept d
    ON e.deptno = d.deptno;
반응형
반응형

정의 

SELECT 문을 통해 결과값들이 나올 때, 이 결과들을 메모리 공간(커서)에 저장

 

커서 => 쿼리문에 의해 반환되는 결과값들을 저장하는 메모리 공간

Fetch => 커서에서 원하는 결과값을 추출

 

사용하는 이유?

커서는 로우를 기반으로 작업된다 

PL/SQL 의 SQL 문처럼 하나의 결과를 리턴하면 암시적으로 커서에 저장되므로 암시적 커서라 하고

PL/SQL 레코드 와 PL/SQL 테이블을 결합한 것은 명시적 커서라 한다.

 

커서 종류

1. 묵시적 커서(Implicit Cursor)

        : 오라클에서 자동으로 선언해주는 SQL 커서.(사용자는 생성 유무를 알 수 없다.)

        

2. 명시적 커서(Explicit cursor)

        : 사용자가 선언해서 생성한 후에 사용하는 SQL 커서, 주로 여러개의 행을 처리하고자

          할 경우 사용한다.

 

커서 속성

1. %Found : 가져올 레코드가 있는 경우 true를 반환

2. %isOpen : 커서가 오픈 상태일 경우 true를 반환

3. %NotFound : 더이상 참조할 레코드가 없을 때 true를 반환

4. %RowCount : 카운터 역할을 한다. 처음 오픈시 0, 패치발생할 때마다 1씩 증가

 

커서 처리 단계(명시적)

1. 명시적 커서 선언(커서 생성)

        EX) Cursor 커서이름

2. 명시적 커서 오픈

        EX) Open커서이름

3. 커서에서 데이터 추출(데이터 행 가져오기)

        EX) Fetch 커서이름

4. 커서 종료

        EX) Close 커서이름

 

반응형
반응형

Procedural Language extension to SQL => 오라클에서 SQL 확장하여 사용하는 프로그램 언어 (절차적 언어)

 

사용하는 이유 ?

  • 대용량 데이터를 연산해야 할 때, WAS 등의 서버로 전송하여 처리하면 네트워크에 부하가 많이 걸릴 수 있다.
    • => 웹 서버(WEB) : HTML 페이지 등을 네트워크 망에 종속되지 않고, 웹서비스를 할 수 있도록 하는 Application
    • => 웹 애플리케이션 서버(WAS) : 웹 서버 + 웹 컨테이너 => tomcat 
                                        / 인터넷 상에서 HTTP 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어 
                                        / 웹 컨테이너 : JSP + Servlet 실행시킬 수 있는 SW 
  • 로직 수정하기 위해 서버를 셧다운 시키지 않고, 단순히 DB에 프로시저 호출하여 사용
  • 블록 단위로 유연하게 사용할 수 있다.

WAS 기본 기능

  • 프로그램 실행 환경과 DB 접속 기능 제공
  • 여러 개의 트랜잭션 관리
  • 업무 처리하는 BL 수행
  • WEB Service 플랫폼 역할

기본 구조 

  • 블록 : 기본 단위 , 선언부, 실행부 , 예외 처리부 / 종류 : 익명 블록, 함수, 프로시저 
    • 선언부 : DECLARE
    • 실행부 : 실제 로직 처리
    • 예외처리부 : 로직 처리하다가 오류가 발생하면 처리하는 내용 기술 하는 부분으로 생략

PL / SQL sub program : function / procedure

  • 함수(function) : 매개변수 존재 / 반환값 존재
  • 프로시져(procedure) : 매개변수 존재 / 반환값 없음(특정 로직만 처리 후 종료)
반응형

'Database Study > SQL' 카테고리의 다른 글

[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB] 오라클_SQL (쿼리문) 처리 및 실행 순서  (0) 2020.01.06
Select query 튜닝  (0) 2020.01.03
[MySQL]JOIN (조인) 문법  (0) 2019.09.12

+ Recent posts