Database - SQL 내장함수

Verba volant, scripta manent·2021년 4월 10일
0

SQL 내장함수

SQL 에서는 자체적으로 사용할 수 있는 함수들이 여러 개 있다.
값들을 더하거나 평균을 구하거나 하는 등의 다양한 작업들을 손쉽게 할 수 있도록 도와주는 역할을 한다.

아래 스키마를 예시로 예제를 들 수 있다.

집합연산

레코드들을 조회하고 분류한 뒤에 특정 작업을 하는 등의 집합연산에 대해서 알아보자.

GROUP BY

SQL 에서는 GROUP BY 를 사용해 조회한 데이터를 분류해서 묶을 수 있다.

ex) 다음과 같은 쿼리가 있다.

SELECT * FROM customers;

위 쿼리에서는 단순히 customers 테이블로부터 데이터를 조회하고 있다.
이번에는 각 주 (state) 를 기반으로 그룹화 해보자.

SELECT * FROM customers
GROUP BY State;

위 쿼리처럼 간단하게 State 를 기준으로 그룹화할 수 있다.
하지만 돌아온 결과를 보게되면 데이터가 중간에 비어있는 것을 확인할 수 있다.

데이터베이스에서는 그룹으로 따로 묶었지만 이에 대한 작업을 따로 하지 않고 그저 조회만 했기 때문에 이에 대한 결과는 각 그룹의 첫번째 데이터가 보이게 되는 것!

따라서 다음과 같이 정렬을 하게 되면 각 그룹의 첫번째 레코드가 조회되는 것을 확인하실 수 있다.

SELECT * FROM customers
GROUP BY State
ORDER BY CustomerId;

HAVING

HAVING 은 GROUP BY 로 조회된 결과에 대한 필터이다.

ex) 다음과 같은 쿼리가 있다고 생각하겠다.

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

위 쿼리에서는 각 고객의 주문한 값들의 평균을 구한 뒤에 그 평균이 6.00 을 넘는 결과들만 조회하고 있다.

이처럼 GROUP BY 로 인한 결과에 대한 필터를 적용할 때에는 HAVING 을 사용할 수 있다.

이에 비해 WHERE 는 적용하는 방식이 다르다.
HAVING 은 그룹화한 결과에 대한 필터라고 생각한다면 WHERE 는 그룹화하기 전에 조회되는 레코드를 필터한다.
따라서 실제로 GROUP BY 전에 데이터를 필터하고 싶다면 WHERE, GROUP BY 결과에 대한 필터는 HAVING 을 사용하면 된다.

그룹화를 했으니 이제 묶여진 그룹에 대해서 어떤 작업들을 할 수 있는지 알아보자.

COUNT()

집계할 때 유용한 COUNT 함수는 말 그대로 몇 개인지 값을 리턴한다.

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

실제로 실행하게 되면 각 그룹의 첫번째 레코드와 각 그룹에 대한 집계를 리턴한다.
조금 다듬으면 다음과 같이 필요한 정보만 조회할 수 있다.

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

이런 식으로 조회할 칼럼들을 묶어둔 그룹을 기준으로 정해 한 눈에 볼 수 있다.

SUM()

SUM 은 합을 구해주는 함수이다. 조회된 값들에 대한 합을 구해 리턴한다.

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

위 코드는 'invoice_items' 라는 테이블에서 'InvoiceId' 필드를 기준으로 그룹화 후 'UnitPrice' 필드에 대한 값들에 대한 합을 구하고 있다.

이처럼 어떤 값들에 대한 합을 구할 때 매우 유용하게 사용할 수 있다.

AVG()

AVG 는 평균값을 구해주는 함수이다.

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

위 쿼리문은 각 TrackId 의 평균 'UnitPrice' 를 구하고 있다.

MAX(), MIN()

MAX 와 MIN 은 최대값과 최소값을 구할 수 있는 함수이다.

SELECT CustomerId, MIN(Total)
FROM invoices
GROUP BY CustomerId

위 코드에서는 CustomerId 로 그룹화한 뒤에 각 고객의 최소값들을 보여주고 있는 쿼리이다.
(꿀팁(?) : MIN 을 MAX 로만 바꾸면 각 고객이 지불한 최대 금액을 명시할 수 있다.)

SELECT 실행 순서

SELECT 문은 데이터를 조회하는 쿼리문에 사용이 된다.
그런데 쿼리문이 적힌 순서가 아닌 정해진 순서대로 작동을 한다.

실행 순서는 다음과 같다.
셀프웨어 구해옹
->셀(select)프(from)웨어(where) 구(group by)해(having)옹(order by)

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

위와 같은 쿼리문을 실행하게 되었을 때 동작하는 순서는 다음과 같다.

  • FROM invoices: 먼저 invoices 테이블에 접근을 한다.
  • WHERE CustomerId >= 10: 'CustomerId' 필드가 10 이상인 레코드들을 조회한다.
  • GROUP BY CustomerId: 'CustomerId' 를 기준으로 그룹화한다.
  • HAVING SUM(Total) >= 30: 'Total' 필드의 값들의 합이 30 이상인 결과들만 필터한다.
  • SELECT CustomerId, AVG(Total): 조회된 결과에서 'CustomerId' 필드와 'Total' 필드의 평균값을 가져온다.
  • ORDER BY 2: AVG(Total) 필드를 기준으로 오름차순 정렬을 한다.
  • profile
    말은 사라지지만 기록은 남는다

    0개의 댓글