왼쪽부터 DAS, SAN, NAS

위 그림으로 3가지 형태의 스토리지 사용 방식을 확인할 수 있다.


DAS (Direct-Attached Storage) : Block-level Access

DAS는 스토리지가 직접 호스트에 연결된 구성이다. 호스트의 내부 디스크 드라이브와 직접 연결된 외부 스토리지 어레이가 DAS의 예이다.

 

Internal DAS

  • 스토리지 디바이스가 직렬 또는 병렬 버스로 호스트에 연결된다.

External DAS

  • 호스트는 외부 스토리지 디바이스에 직접 연결되고 데이터는 블록 레벨로 액세스된다.
  • 호스트와 스토리지 디바이스 간의 통신은 주로 SCSI나 FC 프로토콜을 사용한다.

Internal DAS와 비교해 External DAS는 디바이스 거리와 개수의 한계를 극복하며 스토리지 디바이스를 중앙 집중적으로 관리할 수 있게 해준다. 

DAS의 특징으로는 기본적으로 간단한 구성을 가지고 있으며 초기 투자 비용이 낮다는 점과, 저장 용량을 모두 사용했을 경우 확장이 어려워 서비스 가용성에 문제가 생길 수 있다는 점, 사용하지 않는 리소스를 재할당할 수 없기 때문에 많이 사용되는 Storage Pool과 적게 사용되는 Storage Pool이 나뉜다는 점이 있다.


SAN (Storage Area Network) : Block-level Access

SAN은 스토리지가 네트워크를 통해 호스트에 연결된 구성이다. 호스트에서 파일 시스템을 구동하고 있기 때문에 파일 ↔ 블록 변환은 호스트 측에서 수행하고, 네트워크 상에서 데이터는 블록 레벨로 교환이 이루어진다.

DAS와 비교했을 때 가장 큰 차이점으로는 역시 네트워크가 중간에서 중개 역할을 해주고 있다는 것이다. 때문에 DAS에선 스토리지의 포트 하나 당 호스트 하나만 연결이 가능하지만 SAN, NAS에서는 네트워크를 통해 수많은 호스트에게 연결될 수 있다.

SAN의 예로는 금융권 등 대규모 인프라 등이 있다.


NAS (Network-Attached Storage) : File-level Access

NAS 또한 SAN과 같이 스토리지가 네트워크를 통해 호스트에 연결된 형태이다.

하지만 NAS의 경우는 파일 시스템이 호스트 단이 아닌 스토리지 시스템 단에서 돌아가고 있기 때문에 호스트 측에선 파일 단위로 데이터를 송수신할 수 있으며, 스토리지 시스템 측에서 파일 ↔ 블록 데이터 변환을 수행해서 스토리지에 블록 형태로 저장한다. 때문에 호스트는 운영 체제에 구애받지 않고 스토리지를 이용할 수 있다.

 

이에 관한 내용은 다른 포스트에서 추가적으로 정리할 계획이다.

Application

  • 애플리케이션은 컴퓨팅 연산의 로직을 제공하는 컴퓨터 프로그램이다.
  • 데이터 센터를 이용하여 서비스되는 일반적인 애플리케이션 
    • Business Applications : email, enterprise resource planning(ERP), decision support system(DSS)
    • Management Applications : 리소스 관리, 성능 튜닝, 가상화
    • Data Protection Applicstions : backup(데이터를 보관하기 위함), replication(가용성을 위해서, 미리 복제해 준비해 둔 서버를 통해 문제가 생겨도 서비스가 중지되지 않게 함)
    • Security Applications : authentication, antivirus
  • 애플리케이션의 주요 I/O 특성
    • Read intensive vs. Write intensive
    • Sequential vs. Random
    • I/O size

Application Virtualization

Isolated(독립된, 고립된) 환경에서 필요한 Application을 사용하도록 제공한다.

  • 운영 체제와 리소스를 애플리케이션 가상화 컨테이너로 결합하여 제공한다.
  • 가상화 애플리케이션은 독립 환경에서 실행되기 때문에 OS나 기타 애플리케이션은 잠재적인 위험으로부터 보호된다.
  • 다른 응용 프로그램 또는 동일한 응용 프로그램의 서로 다른 버전 간의 충돌을 방지한다.

Logical Components (가상 애플리케이션 환경의 시스템 구조)

Traditional : 전통적인 방식으로는 하드웨어부터 Device Drivers, Volume Manager, File System, OS, Application 순으로 순차적으로 올라가는 방식으로 구성되며, OS가 직접 물리적인 엘리먼트들로부터 리소스를 가져와서 애플리케이션에게 제공한다.

 

Virtual Machines : VMware 등의 가상화 프로그램에서 애플리케이션을 구동하는 경우인데, 물리적 서버 윗단에 Hypervisor라고 하는 OS의 역할을 하는 소프트웨어가 자리 잡고 있으며 이 Hypervisor가 각 가상 머신의 GuestOS에게 물리적 서버에서 가져온 리소스를 전달하는 방식으로 제공한다. Hypervisor가 일괄적인 처리를 맡으며 실제 OS의 역할이 줄어들었기에 Traditional에 비해 OS가 가벼워지고 그에 따른 퍼포먼스 측면에서의 이점이 있다.

 

Containers : Docker 등의 컨테이너에서 애플리케이션을 구동하는 경우이다. Virtual Machines에서 한 단계 더 진화해 아예 GuestOS 조차 없애고 애플리케이션이 필요로 하는 리소스를 Docker Engine이 HostOS로부터 받아와 각 컨테이너에 할당해준다.


Device Driver → OS → Application

Device Driver는 OS로 하여금 물리적인 엘리먼트들을 인식하게 하는 소프트웨어이다. Device Driver를 통해 장치를 인식한 OS는 그 리소스들을 Application의 요청에 맞게 할당한다.


Memory Virtualization

 

 

메모리 가상화는 호스트의 물리적 메모리(RAM)를 가상화해주는 운영 체제의 기능이다.

가상 메모리 관리자(Virtual Memory Manager : VMM)가 디스크 스토리지에 있는 공간 중 일부를 사용해 스왑 공간(Swap space)으로 만들고 RAM에서 당장 실행 중이 아닌 프로세스들을 실제 메모리에서 스왑 공간으로 이동시킨다.

이로 인해 물리적 메모리의 효율적인 사용이 가능하고 디스크 스토리지의 놀고 있던 공간도 활용할 수 있게 된다. 만약 스왑 파일의 데이터 액세스 속도가 느려지게 되면 플래시 드라이브를 사용한다.

 

 


LVM(Local Volume Manager)

LVM은 파일 시스템과 물리 디스크의 중간에 있는 레이어로, Physical Volumes, Volume Groups, Logical Volumes로 구성되어 있다. 일반적으로 운영 체제의 일부 또는 타사 호스트 소프트웨어로 제공되며, 파일 시스템 용량을 동적으로 확장할 수 있고 효율적인 스토리지 관리를 할 수 있다는 특징이 있다.

Volume Groups

볼륨 그룹은 1개 이상의 물리 볼륨을 그룹화해서 만든다(고유 물리적 볼륨 아이디 할당). 이 볼륨 그룹으로 논리적 볼륨을 생성할 수 있으며 여기서 볼륨 그룹은 디스크, 논리적 볼륨은 디스크 파티션이라고 생각할 수 있다.

 

정리하자면 LVM에서 물리적 볼륨들을 모아 하나의 큰 pool을 만들고 그 pool을 구성하는 작은 block들로 논리적인 볼륨을 생성하고 애플리케이션에 할당하는 것이다. 또한 이렇게 만들어진 논리적 볼륨은 데이터 가용성을 높이기 위해 복제될 수 있다.

LVM을 통해 물리적인 볼륨을 Partitioning 또는 Concatenating해서 하나의 물리적 볼륨을 여러 개의 논리적 볼륨으로 분할하거나 여러 개의 물리적 볼륨을 하나의 논리적 볼륨으로 합치는 등의 작업을 할 수 있다.


File System

  • 파일은 관련 레코드의 집합, 또는 이름을 가진 단위로 저장된 데이터를 말한다.
  • 파일 시스템은 파일의 계층 구조를 말한다.
  • 파일 시스템은 디렉토리를 이용해서 데이터를 계층 구조로 관리한다.
  • 디렉토리는 여러 파일에 대한 포인터를 저장하는 컨테이너이다.
  • 파일 시스템은 디스크 드라이브나 디스크 파티션, 논리적 볼륨에 저장된 데이터 파일에 액세스할 수 있게 한다.
  • 파일 시스템은 논리적 구조와 파일 액세스를 조정하는 소프트웨어 루틴으로 구성한다.
  • 파일 시스템 종류 : FAT 32, NTFS, UNIX FS, EXT 2/3


Compute Virtualization

컴퓨팅 가상화는 운영 체제로부터 물리적 하드웨어를 감추는 기술이다. 단일 또는 클러스터 머신에서 여러 운영 체제를 동시에 운영할 수 있다.

 

  • 각 VM은 고립된 방식으로 운영 체제와 애플리케이션을 실행한다.
    • VM은 실제 컴퓨터처럼 보이고 행동하는 논리적 엔티티.
  • 하드웨어와 가상 머신 사이의 가상화 레이어를 이용해 컴퓨팅 가상화를 실현한다. 이 레이어는 Hypervisor라고 불린다.
  • Hypervisor는 CPU와 메모리, 네트워크 같은 하드웨어 리소스를 가상 머신에 제공한다. 물리적인 서버의 하드웨어 사양에 따라 한 서버 안에 많은 가상 머신을 만들 수 있다.
  • Hypervisor의 관점에서 가상 머신은 VM 설정 파일과 데이터 파일 등의 독립적인 파일의 집합입니다.


Desktop Virtualization

데스크탑 가상화는 하드웨어와 OS, 애플리케이션, 사용자 프로파일, 설정 간의 의존성을 없애 준다.

 

조직이 데스크탑을 호스팅하고 중앙집중적으로 관리할 수 있다.

  • 조직은 데이터 센터 안에서 가상 머신으로 데스크탑이 운영되기 때문에 유출이나 도난의 위험을 줄여준다.

데스크탑 가상화의 장점

  • thin clients의 활성화 → 유연한 액세스
  • 향상된 데이터 보안
  • 간소화된 데이터 백업 및 PC 유지 관리

Connectivity

Connectivity란 호스트 간 또는 호스트와 프린터, 스토리지 디바이스 등의 주변기기와의 연결을 말한다.

연결은 다음과 같이 이루어진다.

 

Host Interface Card(Network Interface Card : NIC) ↔ PortCablePortDisk

 

아래에서 대표적인 프로토콜 몇 가지를 알아보겠다.

 

IDE/ATA & Serial ATA(SATA)

  • Integrated Device Electronics(IDE) / Advanced Technology Attachment(ATA)
    • IDE/ATA는 디스크 드라이브와 CD-ROM 드라이브 같은 스토리지 드라이브를 연결하는 데에 사용하는 인터페이스 프로토콜 표준이다.
    • 가격 대비 성능이 좋다.
    • 저렴한 비용으로 스토리지를 연결할 때 사용한다.
    • Internal Connectivity에 사용한다.
    • ATA의 Ultra DMA/133 버전은 초당 133MB의 전송량을 지원한다.
  • Serial Advanced Technology Attachment(SATA)
    • IDE/ATA 직렬(serial) 버전은 단일 비트 직렬 전송을 지원한다.
    • SATA는 성능이 좋고 가격이 낮기 때문에 IDE/ATA를 대체하고 있다.
    • SATA 리비전 3.0은6Gb/s의 전송 속도를 제공한다. 
    • Hot-pluggable(장치를 제거하려면 PC를 종료해야 함)이다.

SCSI & Serial SCSI(SAS)

  • Parallel SCSI(Small Computer System Interface)
    • 일반적으로 host와 peripheral device를 연결하기 위한 표준 방식이다.
    • IDE/ATA에 비해 가격이 높다. 개인용 데스크탑에서는 잘 사용되지 않는다.
    • SCSI는 하이엔드 컴퓨터에서 선호되는 연결 프로토콜이다.
    • SCSI는 1개의 버스에 최대 16개의 디바이스를 지원하고 데이터 전송 속도는 640MB/s (Ultra-640)이다.
  • Serial Attached SCSI(SAS)
    • SAS는 포인트 간 직렬 프로토콜로, 병렬 SCSI의 대안이 되고 있다.
    • 새로운 버전의 직렬 SCSI(SAS 2.0)은 6Gb/s의 데이터 전송 속도를 지원한다.

Fibre Channel & IP

  • Fibre Channel(FC)
    • 파이버 채널은 스토리지 디바이스에 대한 초고속 통신을 지원하는 프로토콜이다.
    • 동선과 광섬유를 통한 직렬 데이터 전송을 지원한다.
    • 파이버 채널 최신 버전의 표준에서는 속도가 최대 128Gb/s로 향상되었다.
      • 8, 16, 32Gb/s 버전도 사용 중
  • Internet Protocol(IP)
    • 전통적으로 IP는 호스트 간 통신에 사용하는 네트워크 프로토콜이다.
    • 새로운 기술의 등장으로 IP 네트워크를 호스트와 스토리지 간의 통신에 사용할 수 있게 됐다.
    • IP는 비용과 기술의 성숙도 면에서 큰 장점을 지니고 있으며, 조직이 갖고 있는 IP 기반 네트워크를 사용할 수 있다는 장점이 있다.
      • iSCSI와 FCIP 프로토콜

데이터 센터의 주요 요소

애플리케이션 : 컴퓨팅 연산의 로직을 제공하는 컴퓨터 프로그램.

데이터베이스 관리 시스템 (RDBMS) : 서로 연관된 논리적 테이블에 데이터를 저장하기 위한 구조적인 방법을 제공한다.

호스트 또는 컴퓨터 : 애플리케이션과 데이터베이스를 실행하는 컴퓨팅 플랫폼.

네트워크 : 여러 네트워크 디바이스 간의 통신을 위한 데이터 이동 경로.

스토리지 : 데이터를 영속적으로 저장하기 위한 디바이스.

데이터 센터 요소에 대한 주요 요구 사항

Availability(가용성) : 언제 어디서든 서비스에 접근 가능해야 한다(정보를 즉시 제공해야 한다).

Security(보안) : 데이터 센터는 인증된 사람만 정보에 액세스할 수 있도록 정책과 절차를 수립하고 핵심 요소를 통합해야 한다.

Capacity(용량) : 데이터 센터 운영에는 많은 양의 데이터를 효율적으로 저장하고 처리하기 위한 적절한 리소스가 필요하다.

Scalability(확장성) : 필요 시 비즈니스 운영의 중단 없이 리소스를 확장할 수 있어야 한다.

Performance(성능) : 데이터 센터의 모든 요소는 서비스 레벨에 기반해 최적의 성능을 제공해야 한다.

Data Intergrity(데이터 무결성) : 데이터를 전송받는대로 올바르게 저장하고 추출되는지를 보장해야 한다.

(내결함성 : 하드웨어적인 요소들의 문제로 서비스가 중지되면 안 된다. 이 때문에 모든 부품들은 예비 용도로 이중화 처리가 되어 있다.)

 

데이터 센터 관리

모니터링 : 데이터 센터의 여러 엘리먼트와 수행되는 서비스들에 대해 지속적으로 정보를 수집해야 한다. 모니터링해야 할 것으로는 보안과 성능, 가용성, 용량이 있다.

보고 : 서로 연관된 논리적 테이블에 데이터를 저장하기 위한 구조적인 방법을 제공한다.

공급 : 애플리케이션과 데이터베이스를 실행하는 컴퓨팅 플랫폼.

네트워크 : 여러 네트워크 디바이스 간의 통신을 위한 데이터 이동 경로.

스토리지 : 데이터를 영속적으로 저장하기 위한 디바이스.

 

ex) 하드 디스크의 수명이 거의 다 되었을 때 모니터링을 통해 확인하고 보고함으로써 데이터의 손실을 방지할 수 있다.

 

Information Lifecycle Management

정보화 시대에 돌입하면서 데이터와 정보들이 폭발적으로 증가하고 있고 고가용성을 보장하기 위한 데이터의 복제 및 용도 변경도 정보 증가에 큰 영향을 끼치고 있다. 이렇게 폭증한 정보들은 비즈니스적 측면에서 성공의 여부를 좌우하는 중요한 역할을 하고 시장에서 경쟁 우위를 가지게 하는데, 이러한 정보의 가치는 계속 변화하고 있기 때문에 정보를 효율적으로 운용하기 위해서는 정보 수명주기 동안 정보의 가치를 이해해야 한다.

 

아래는 시간이 지남에 따라 변화하는 주문 정보의 가치를 나타낸 이미지이다.

Virtualization

가상화(Virtualization)는 물리적 리소스를 추상화하여 논리적 리소스로 보이게 하는 기술이다.

    - 물리적 디스크의 파티션

가상화는 여러 개의 물리적 리소스를 모아 하나로 합친 형태로 제공할 수 있다.

    - 스토리지 가상화

    - 컴퓨터 가상화

여러 개의 물리적 리소스를 모아 풀(pool)을 구성한 후, 여기서 가상 리소스를 만들어 공급할 수 있다.

    - 스토리지 풀에서 지정한 크기의 가상 디스크

    - 특정 CPU 파워와 메모리를 가진 가상 서버를 컴퓨터 풀에서 만들 수 있다.

 

클라우드 컴퓨팅의 특징

  • 클라우드 컴퓨팅은 개인 및 조직이 IT 리소스를 네트워크를 통한 서비스로 사용할 수 있도록 지원한다.
  • 클라우드 컴퓨팅은 완전히 자동화된 요청 및 공급 프로세스를 통해 셀프 서비스로 필요한 것을 요청할 수 있게 한다 (사용자가 컴퓨팅 리소스 사용을 신속하게 확장 또는 축소할 수 있다).
  • 클라우드 컴퓨팅에서는 사용량 기반의 비용 청구가 가능하다 (사용자는 CPU 사용 시간과 데이터 전송량, 저장한 데이터의 용량 등 자신이 사용한 리소스에 대한 비용만 지불하면 된다).
  • 클라우드 인프라 스트럭쳐는 보통 리소스 풀링과 빠른 리소스 공급을 제공하는 가상화된 데이터 센터를 기반으로 구축된다 (빠르게 서비스를 시작하고 경쟁해야 하는 프로젝트에서 온프레미스가 아닌 클라우드 서비스를 이용할 경우 이점이 있다).

Redis 클라이언트 접속

root@db2:~# redis-cli

127.0.0.1:6379>

 

데이터 저장

127.0.0.1:6379> set 1111 "JM JOO"

OK

127.0.0.1:6379> set 1112 "YH JOO"

OK

127.0.0.1:6379> set 1113 "KO HONG"

OK

127.0.0.1:6379> set 1114 "DJ HONG"

OK

 

데이터 검색

127.0.0.1:6379> get 1111

"JM JOO"

127.0.0.1:6379> get 1112

"YH JOO"

 

Key값 출력

127.0.0.1:6379> keys *

1) "1113"

2) "1111"

3) "1112"

4) "1114"

127.0.0.1:6379> keys *2

1) "1112"

 

Key 삭제

127.0.0.1:6379> del 1112

(integer) 1

127.0.0.1:6379> keys *

1) "1113"

2) "1111"

3) "1114"

 

Key 이름 변경

127.0.0.1:6379> rename 1113 1116

OK

127.0.0.1:6379> keys *

1) "1111"

2) "1116"

3) "1114"

 

랜덤 Key 검색

127.0.0.1:6379> randomkey

"1116"

127.0.0.1:6379> randomkey

"1114"

 

존재 여부 검색

127.0.0.1:6379> exists 1111

(integer) 1

127.0.0.1:6379> exists 1112

(integer) 0

 

Value 길이 확인

127.0.0.1:6379> strlen 1111

(integer) 6

 

전체 Key 삭제

127.0.0.1:6379> flushall

OK

127.0.0.1:6379> keys *

(empty array)

 

일정 시간 동안만 저장

127.0.0.1:6379> setex 1111 30 "JM JOO"

OK

127.0.0.1:6379> ttl 1111

(integer) 18

127.0.0.1:6379> ttl 1111

(integer) 5

127.0.0.1:6379> ttl 1111

(integer) 0

127.0.0.1:6379> ttl 1111

(integer) -2

127.0.0.1:6379> get 1111

(nil)

 

데이터 다중 일괄 저장 및 검색

127.0.0.1:6379> mset 1113 "NoSQL User Group" 1115 "PIT"

OK

127.0.0.1:6379> mget 1113 1115

1) "NoSQL User Group"

2) "PIT"

'IT > Database' 카테고리의 다른 글

[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

TABLE STRUCTURE



QUERY



EXPLAIN


'IT > Database' 카테고리의 다른 글

[NoSQL] Redis Commands  (0) 2021.10.08
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

 UNION

특징

  • 여러 개의 테이블을 세로로 합치는 개념이다(추가적인 레코드 출력).
  • UNION하는 두 테이블의 컬럼명이 다른 경우에는 첫 번째 테이블의 컬럼명으로 출력된다.
  • 중복되는 데이터는 자동으로 DISTINCT해서 출력한다(UNION ALL 사용 시 전부 출력).
  • LIMIT을 걸면 UNION을 통해 테이블을 합친 후에 수행한다. 괄호로 SELECT문을 묶는다면 해당 단일 쿼리 안에서 LIMIT을 수행하도록 할 수 있다.

JOIN

특징

  • 여러 개의 테이블을 가로로 합치는 개념이다(레코드 당 추가적인 정보).
  • 각 테이블에 같은 컬럼이 있을 때만 JOIN을 할 수 있으며, 그 컬럼이 '붙이기 위한 키워드'가 된다.
  • JOIN은 INNER JOIN을 기본으로 사용하며, 일치하지 않는 값은 출력하지 않는다(곱집합).
  • LEFT OUTER JOIN (LEFT JOIN) = 왼쪽 테이블을 우선시하는 합집합.
  • RIGHT OUTER JOIN (RIGHT JOIN) = 오른쪽 테이블을 우선시하는 합집합.
  • CROSS JOIN = 두 테이블의 레코드들의 모든 조합 (모든 경우의 수)
  • INNER JOIN과 OUTER JOIN은 결합 조건을 ON 구에 적어야 한다. 비교 연산자 뿐만 아니라 논리 연산자 등 다양한 연산자로 조건을 설정할 수 있다.
  • 컬럼명 간 등호를 사용하여 결합 조건을 설정할 경우 ON 대신 USING 구를 사용할 수도 있다.

'IT > Database' 카테고리의 다른 글

[NoSQL] Redis Commands  (0) 2021.10.08
[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

서브 쿼리란 쿼리 안의 쿼리를 말한다. 서브 쿼리를 감싸고 있는 원래의 쿼리는 메인 쿼리라고 부른다.

 

SELECT [컬럼명] FROM [테이블명]

    WHERE [컬럼명] [연산자] (SELECT ~);

 

서브 쿼리는 위의 형식과 같이 괄호로 감싸며, 서브 쿼리에는 세미콜론을 사용하지 않는다.

 

아래의 예제들을 살펴보자.


WHERE절에서의 사용

SELECT -- (3)
    order_id, price
FROM -- (1)
    productorder
WHERE -- (2)
    price >= (
        SELECT -- (2-2)
            AVG(price)
        FROM -- (2-1)
            productorder
    );

 

WHERE절에서 서브 쿼리를 날리는 쿼리문이다. 서브 쿼리로 가져온 결과를 메인 쿼리의 조건으로 사용하고 있다.

 


SELECT절에서의 사용

SELECT -- (2)
    order_id, price,
    (
        SELECT -- (2-2)
            COUNT(*)
        FROM -- (2-1)
            productorder
    ) AS order_count
FROM -- (1)
    productorder
ORDER BY -- (3)
    price
LIMIT -- (4)
    3;

 

SELECT절에서 서브 쿼리를 사용했다. 원래라면 집약 함수와 일반 컬럼을 동시에 가져올 수 없기 때문에

SELECT
    order_id, price, COUNT(*)
~

이런 식의 쿼리를 작성하면 에러가 발생해 결과값을 도출할 수 없지만 서브 쿼리를 사용함으로써 가능케 하는 것이다.

 


HAVING절에서의 사용

SELECT
    customer_id, AVG(price)
FROM
    productorder
GROUP BY
    customer_id
HAVING
    AVG(price) < (
        SELECT
            AVG(price)
        FROM
            productorder
    );

 

WHERE절에서 사용한 것과 비슷하게 HAVING절에서도 서브 쿼리로 가져온 값으로 조건을 걸어줄 수 있다.


서로 다른 테이블

SELECT
    customer_id, customer_name
FROM
    customer
WHERE
    membertype_id = (
        SELECT
            membertype_id
        FROM
            membertype
        WHERE
            membertype = "할인 회원"
    );

 

메인 쿼리의 customer 테이블과는 다른 membertype 테이블에서 membertype 컬럼이 할인 회원인 멤버의 아이디만 가져와서 조건을 걸 수도 있다.


복수행 서브 쿼리

SELECT
    order_id, product_id
FROM
    productorder
WHERE
    product_id IN (
        SELECT
            product_id
        FROM
            product
        WHERE
            price >= 150
    );

 

 

위와 같이 서브 쿼리의 결과가 단일행이 아닌 복수행으로 반환되는 경우 일반적인 연산자(<, >, = 등...)는 사용할 수 없다. 그 대신 IN, ANY, ALL 등의 연산자를 통해 비교할 수 있다.

 

IN : 리스트에 이 값이 하나라도 있으면 1 반환.

ANY : 조건이 일치하는 값이 리스트에 하나라도 있으면 1 반환.

ALL : 리스트에 있는 값이 전부 조건에 일치하면 1 반환.


ANY, ALL 연산자

SELECT
    *
FROM
    product
WHERE
    stock < ANY (
        SELECT
            SUM(quantity)
        FROM
            productorder
        GROUP BY
            product_id
    );

 

위와 같은 방식으로 사용할 수 있다.

 


서브 쿼리에서의 LIMIT 오류 해결법

SELECT
    customer_id, customer_name
FROM
    customer
WHERE
    customer_id IN (
        SELECT
            customer_id
        FROM (
            SELECT
                customer_id
            FROM
                productorder
            ORDER BY
                price DESC
            LIMIT 3
        ) AS tmp
    );

 

서브 쿼리를 IN, ANY, ALL 등의 연산자를 통해 처리할 때 해당 서브 쿼리 내부에서 LIMIT 예약어 사용 시 MySQL 버전에 따라 오류가 발생할 수 있다. 이 때 서브 쿼리를 이중으로 중첩시켜서 제일 내부에 있는 서브 쿼리에서 LIMIT을 걸어주면 문제없이 LIMIT을 사용할 수 있다.


상관 서브 쿼리

SELECT
    product_id,
    product_name
FROM
    product
WHERE
    3 < (
        SELECT
            SUM(quantity)
        FROM
            productorder
        WHERE
            product.product_id = productorder.product_id
    );

 

상관 서브 쿼리의 실행 구조

상관 서브 쿼리란 기존의 메인 쿼리 이전에 서브 쿼리를 완전히 끝내고 그 결과값을 통해 메인 쿼리를 하는 방식과는 달리 메인 쿼리를 수행하는 중에 서브 쿼리도 수행하는 것이다. 서브 쿼리의 결과를 매번 비교해서 메인 쿼리에게 전달한다.


외래 키(Foreign Key)

어떤 테이블의 PRIMARY KEY 값이 다른 테이블의 컬럼 중에 포함될 경우 이것을 외래 키라고 한다.

예를 들어 customer 테이블과 order 테이블이 있을 때 customer 테이블에 있는 customer_id는 PK, order 테이블에 있는 customer_id는 FK이다.

 

customer 테이블에 존재하지 않는 값은 order 테이블에서도 외래 키로 사용할 수 없다.

ex) customer_id = 100 은 존재하지 않기 때문에 order 테이블에도 넣을 수 없음.


EXISTS

SELECT
    product_id, product_name
FROM
    product AS p
WHERE
    EXISTS (
        SELECT
            *
        FROM
            productorder AS po
        WHERE
            p.product_id = po.product_id
    );

 

EXISTS 뒤에 오는 서브 쿼리의 결과값이 존재하면 1을 반환(출력), 하나의 레코드도 리턴되지 않는다면 0을 반환한다.

존재하지 않으면 출력하는 NOT EXISTS도 사용 가능하다.

'IT > Database' 카테고리의 다른 글

[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
SELECT
    CAST("123" AS SIGNED) + 1;

위와 같이 CAST 함수를 이용하여 문자열 타입이었던 "123"을 정수형 123으로 치환해서 1을 더할 수 있게 된다.

 

SIGNED 대신 UNSIGNED 사용 시 출력값이 음수가 되면 out of range가 뜬다. 절대값 출력일 것이라 생각했으나 단순히 양수만 처리 가능한 것 같다.

 

SIGNED 대신 DECIMAL 사용 시 실수 처리 가능.

'IT > Database' 카테고리의 다른 글

[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06

+ Recent posts