관계형 데이터베이스

김성수·2022년 10월 7일
0

SEB_BE

목록 보기
8/31

이번건은..쪼매 수월하다...왜냐..바로... 그... 자격증 때문이다..
6개월을 시달리게 했던 그.... 기사 그거 있다 여튼...
뿐만 아니라, 뭐 다른 부분들도 있겄지..

나는 잘 되고 있다.


데이터베이스 설계

관계형 데이터베이스

구조화된 데이터는 하나의 테이블로 표현할 수 있다.
사전에 정의된 테이블을 relation이라고도 부르기 때문에, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)라고 한다.

관계형 데이터베이스 사용시 알아야 하는 키워드

  • 데이터(data)
    • 각 항목에 저장되는 값
  • 테이블(table || relation)
    • 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적
  • 칼럼(column || field)
    • 테이블의 한열을 가리킨다.
  • 레코드(record || tuple)
    • 테이블의 한 행에 저장된 데이터.
  • 키(key)
    • 테이블의 각 레코드를 구분할 수 있는 값(Map의 key랑 비슷)
    • 각 레코드마다 고유한 값을 가짐
      • 기본키(primary key)
      • 외래키(foreign key)

관계 종류

  • 1:1 관계

  • 1:N 관계

  • N:M 관계

  • *self referencing 관계

    • 테이블 스스로 관계를 가진다.

1:1 관계

  • 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우.

1:N 관계

  • 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우.
    관계형 데이터베이스에서 가장 많은 경우

N:M 관계

  • 여러 개의 레코드가 다른 태이블의 여러개의 레코드와 관계가 있는 경우.
  • N:M(다대다) 관계를 위해 스키마를 디자인할 때에는 Join테이블을 만들어 관리한다.
  • 1:N 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다.
  • N:M(다대다) 관계의 조인 테이블을 생성 하더라도 조인을 위한 기본키는 반드시 있어야 한다.

자기참조 관계(Self Referencing Relationship)

  • 테이블 '내'에서 의 관계

SQL 내장함수

부산 돼지내장국밥 먹고싶다. 고향가고싶다.

집합연산 : 레코드를 조회하고, 분류한 뒤, 특정 작업을 하는 연산

GROUP BY

데이터를 조회할 때, 그룹으로 묶어서 조회한다.

SELECT * FROM customers;

▲ customers 테이블의 모든 레코드를 조회

위의 쿼리를 주(state:상태)에 따라 그룹으로 묶어 표현할 수 있다.

SELECT * FROM customers
GROUP BY State;

▲ customers 테이블의 모든 레코드를 State에 따라 그룹화

  • GROUP BY 쿼리로 간단하게 State에 따라 그룹화 가능.
  • 쿼리의 결과를 확인하면, 데이터가 중간에 비어있는 것을 확인할 수 있는데, 데이터를 불러오는 과정에서 State에 따라 그룹을 지정했지만, 그룹에 대한 작업 없이 조회만 했기 때문이기에, 데이터는 각 그룹의 첫번째 데이터만 표시된다.

HAVING

HAVINGGROUP BY로 조회한 결과를 필터링할 수 있다.

SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00

▲ invoices 테이블을 CustomerId로 그룹화하고 그 평균이 6을 초과한 결과를 조회
해당 쿼리는 모든 고객의 주문서에서 가격의 평균을 구한 뒤에, 평균이 6.00을 넘는 결과만 조회하는 쿼리를 예시로 한 것이다.
GROUP BY로 그룹을 지은 결과에 필터를 적용할 때, HAVING을 사용할 수 있다.
HAVING은 WHERE과 적용하는 방식이 다름
HAVAING은 그룹화한 결과에 대한 필터이고, WHERE은 저장된 레코드를 필터링한다.
따라서 그룹화 전에 데이터를 필터해야 한다면 WHERE을 사용함.

COUNT()

COUNT 함수는 레코드의 갯수를 헤아릴 때 사용.

SELECT *, COUNT(*) FROM customers
GROUP BY State;

▲ 모든 레코드에 대한 COUNT 함수 예시

위의 쿼리를 실행하면, 각 그룹의 첫번쨰 레코드와 각 그룹의 레코드 갯수를 집계하여 리턴한다.

아래와 같이 변경시 그룹으로 묶인 결과의 레코드 갯수도 확인 가능

SELECT State, COUNT(*) FROM customers
GROUP BY State;

▲ 각 State에 해당하는 레코드의 개수를 확인하는 COUNT 함수 예시

SUM()

SUM 함수는 레코드의 합을 리턴한다.

SELECT InvoiceId, SUM(UntiPrice)
FROM invoice_items
GROUP BY InvoiceId;

▲ SUM 함수 사용 예시
위 쿼리는 invoice_items라는 테이블에서 InvoiceId 필드를 기준으로 그룹하고, UnitPrice 필드 값의 합을 구한다.

AVG()

AVG 함수는 레코드의 평균 값을 계산하는 함수.

SELECT TrackId, AVG(UnitPrice)
FROM invoice_items
GROUP BY TrackId;

▲ AVG 함수 사용 예시

MAX(), MIN()

MAX는 최댓값을, MIN은 최솟값을 리턴.

SELECT CustomerId MIN(Total)
FROM invoices
GROUP BY CustomerId

▲ MIN 함수 사용 예시
위 쿼리에서 MIN을 MAX로 변경하면, 각 고객이 지불한 최대금액을 리턴한다.

SELECT 실행순서

데이터를 조회하는 SELECT 문은 정해진 순서대로 동작한다.

  • SELECT 문의 실행 순서
    • FROM
    • WHERE
    • GROUP BY
    • HAVING
    • SELECT
    • ORDER BY
SELECT CustomerId, AVG(Total)
FROM invoices
WHERE CustomerId >= 10
GROUP BY CustomerId
HAVING SUM(Total) >= 30
ORDER BY 2

▲ SELECT 문의 실행 순서
위 쿼리의 실행 순서는 다음과 같다.
1. FROM invoices : invoices 테이블에 접근을 한다.
2. WHERE CustomerId >= 10 : CustomerId 필드가 10 이상인 레코드를 조회
3. GROUP BY CustomerId : CustomerId를 기준으로 그룹화한다.
4. HAVING SUM(Total) >= 30 : Total 필드의 총합이 30 이상인 결과들만 필터링함
5. SELECT CustomerId, AVG(Total) : 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값을 구한다.
6. ORDER BY 2 : AVG(Total) 필드를 기준으로 오름차순 정렬한 결과를 리턴.

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

0개의 댓글