brunch

You can make anything
by writing

C.S.Lewis

by 김유환 Oct 10. 2019

15. 함수 (Functions)

SQL에서 사용하는 함수 알아보기

배경

SELECT, WHERE 2개의 글을 통해서 SQL 을 이용해 원하는 데이터를 선택하는 방법까지 다뤄보았습니다. 이제 선택한 데이터들을 기반으로 의미있는 값을 뽑아내는 작업을 배워봅시다. 개수, 평균, 최대값, 최소값. 보통 이야기하는 데이터 분석의 결과입니다. SQL 은 다양한 함수를 지원함으로써, 추가적인 통계 도구를 사용하지 않고도 주요 데이터를 뽑아낼 수 있도록 도와줍니다.


SELECT 실행 과정

함수를 사용하는 단계부터 SQL 문을 실행순서가 헷갈리기 시작할 수 있습니다. 이 때문에 함수에 대해서 알아보기 전에, DMBS가 SQL 문을 이해하고 어떤 순서로 데이터 추출 및 가공 과정을 실행하는지 아는것이 매우 중요합니다. 


SELECT 실행 과정에 대해서 다시 한번 살펴봅시다. 예시로 아래 SELECT 문을 실행한다고 가정합시다. 이 요청을 실행한 결과는 주민번호가 첫번째 열로 이름이 두번째 열에 표현된 테이블입니다.


우리가 여기에서 알아야하는 것은 DBMS는 SELECT문을 크게 2가지 역할로 사용한다는 것입니다. 첫번째 역할은 DBMS가 저장소에서 데이터를 가져올때 어떤 데이터를 선택해서 가져올지 고르는 역할입니다. DBMS는 이렇게 가져온 데이터를 DBMS 내부의 임시 저장소에 잠시 저장해둡니다. 이후에, SELECT문을 기반으로 임시 저장된 데이터를 사용자에게 어떻게 보여줄지 결정하는 역할로 사용합니다.


조금 더 자세히 살펴보도록 합니다. SELECT 와 FROM 사이에 명시된 열의 이름인 rrn, name 의 경우 데이터베이스에서 어떤 데이터를 선택해서 가져올지 결정합니다. 반면, 열이 나열된 순서 (주민번호, 이름)은 이렇게 가지고 온 데이터를 어떻게 보여줄지 결정합니다. 만약, 아래와 같이 SELECT 문 내부의 순서를 바꾼다면 데이터베이스에서 가져오는 데이터는 동일하겠지만, 사용자에게 보여주는 테이블의 순서는 (주민번호, 이름)이 아닌 (이름, 주민번호)로 달라지는 것입니다.


또 다른 예시로, WHERE 문과 ORDER BY, LIMIT 을 동일한 관점에서 해석해 봅시다. WHERE 은 데이터를 사용자에게 보여줘야하는 형태로 가공하는 역할과는 상관없이, 어떤 데이터를 저장소에서 가져올 지 결정하는 역할만을 합니다. 반면, ORDER BY 와 LIMIT 은 데이터베이스에서 가져온 데이터를 어떻게 화면에 보여줄지 결정하지, 어떤 데이터를 저장소에서 가져올지 결정하지는 않습니다.


COUNT

위처럼 우리가 지금까지 배운 SQL문은 2가지 역할을 한다는 것을 마음에 담아두고, 가장 간단한 함수인 COUNT에 대해서 배워보도록 합시다. COUNT 는 SELECT 문으로 선택된 데이터 개수가 몇개인지 추출하는 함수입니다. 예를 들어, 사용자 테이블에 있는 총 데이터의 개수를 구하기 위해서는 아래와 같은 SQL 문을 작성하면 됩니다.


간단한 예시를 통해 조금 더 자세히 살펴봅시다. 사용자 테이블에 아래와 같은 데이터만 저장되어있다고 가정합시다.


이 데이터를 대상으로 위의 COUNT 쿼리를 실행시키면 결과는 아래와 같이 나옵니다. 바로, 데이터베이스에서 추출된 이름 행의 개수가 총 4개라는 의미입니다.


이번에는 조건문과 함께 COUNT 함수를 사용해 봅시다. 사용자 테이블에서 여자인 사용자가 몇명인지 구한다고 가정합시다. 이 경우에는 아래와 같은 SQL 문을 통해 결과값을 구할 수 있습니다. 위 테이블에 이 SQL 을 요청한다면 결과는 2가 나올 것입니다.


함수 실행 과정

가장 간단한 함수인 COUNT를 배웠으니, SELECT 실행 과정과 동일하게 함수의 실행 과정에 대해서 이해해 보도록 합니다. 함수는 SELECT 문이 하는 역할을 한 가지 더 추가합니다. 바로, 테이블에서 가져온 데이터를 가공하는 역할입니다. 예제를 통해 살펴봅시다.

위 COUNT 함수를 포함하고 있는 SQL 실행 과정은 다음과 같습니다. DBMS는 위의 SQL 문을 보고 SELECT와 FROM 사이에 name 이 있는 것을 보고 저장소에서 name 데이터를 가져와야 한다고 판단합니다. 추가적으로 name 이라는 열이 COUNT라는 함수에 들어가 있는 것을 보고, 저장소에서 가져온 name 데이터의 행의 갯수 값으로 데이터를 가공해야한다는 것을 판단합니다. 마지막으로, 가공된 데이터를 사용자에게 보여줘야하는데 COUNT 함수를 통해 가공된 결과값의 열의 이름을 COUNT(name)이라고 사용자에게 보여줘야한다고 결정하게 됩니다.


다시 한번, 간단히 정리해보자면 DBMS는 SQL 문을 보고 다음 세가지 단계를 진행합니다.

1. 데이터 가져오기 - 사용자 테이블에서 이름(name) 데이터를 선택해서 가져옴

2. 데이터 가공하기 - 가져온 이름 데이터에 COUNT 함수를 적용해 행 개수를 구함

3. 데이터 보여주기 - 구해진 행의 개수를 열의 이름 COUNT(name)으로 조합해서 사용자에게 보여줌



AVG, MIN, MAX

이제 함수가 실행되는 과정을 이해했으니, COUNT 이외에도 데이터분석에 사용할 수 있는 다른 함수들에 대해서 배워봅시다. DBMS 는 다양한 통계 함수를 제공하고 있고, DBMS 마다 제공하는 함수의 종류도 다양합니다. 저 역시 데이터 분석을 진행하다가 필요에 따라서 검색해서 함수를 사용하고 있습니다. 지금은 이런 함수가 있다는 것만 알고, 필요에 따라 검색해서 사용하시면 됩니다.


AVG 는 선택된 데이터의 평균값(Average)을 도출해주는 함수입니다. 예를 들어, 사용자 테이블에 있는 여자의 평균 나이를 구하고 싶다면 아래와 같은 SQL 문을 작성하면 됩니다.

MIN은 선택된 데이터의 최소값을 추출하는 함수입니다. 예를 들어, 여자들 중에서 최소 나이를 추출하는 SQL 문은 다음과 같습니다.

MAX는 선택된 데이터의 최대값을 추출하는 함수입니다. 예를 들어, 여자들 중에서 최대 나이를 추출하는 SQL 문은 다음과 같습니다.


COUNT(DISTINCT)

마지막으로 COUNT 함수를 추가 활용할 수 있는 부분에 대해서 배워봅시다. 위에서 COUNT 함수는 SELECT 문을 통해 선택된 행의 개수를 세는 함수라고 설명했습니다. 숫자를 세기는 하는데 고유한 값의 개수를 세고 싶을때는 어떻게 해야할까요? 예를 들어, 사용자 테이블에 어떤 나이가 존재하는지를 알고 싶다고 가정합시다. 이때에는 COUNT 함수 내부에 DISTINCT 라는 키워드를 아래와 같이 추가하면 됩니다.

DISTINCT

DISTINCT 는 구별되는 이라는 의미로 구별되는 값을 선택할때 사용하는 키워드 입니다. 다시 말해, 중복을 제거한다고 생각하시면 됩니다. SQL 이 실행되는 순서로 보자면 사용자 테이블에서 나이(age)에 해당하는 데이터를 가져온 이후에, 중복되는 값을 모두 삭제하고, 나머지 행의 개수를 구하게 됩니다.


각 열이 가지고 있는 구별된 값의 종류는 다르기 때문에, 이제 선택된 열에 따라 다른 결과가 나옵니다. 성별(gender) 을 아래와 같이 하면, 현재는 남자와 여자 2가지 값만 존재하기 때문에 항상 2 가 결과값으로 나올 것 입니다.


마치며

오늘은 SQL 이 지원하는 다양한 함수들을 살펴봤습니다. 데이터베이스를 분석하는 데이터 작업은 3가지를 잘하면 됩니다. 첫번째는 제대로 된 데이터를 선택하는 작업이고, 두번째는 이렇게 선택된 데이터를 어떻게 가공할지 결정하는 작업이며, 마지막은, 가공된 데이터를 화면에 어떻게 보여줄지 결정하는 작업입니다. 예제를 통해서 살펴보는 것들은 대부분 단순한 결과를 원하기 때문에 쉬운 경우가 많이 있습니다. 하지만, 막상 실무에서 원하는 결과값을 원하는 형태로 뽑으려다보면 생각보다 어려운 경우가 많이 있습니다. 지속적인 연습을 통해서 SQL 과 익숙해지는 시간을 많이 가지시기를 추천합니다.


오늘 배운 함수를 활용해 아래 질문을 해결할 수 있는 SQL 을 만들어보세요.   

주민등록번호가 88로 시작하는 남자 사용자들의 평균 키는 얼마일까?

키가 170 이하인 여자들의 평균 나이는 얼마일까?

사용자 테이블에 저장된 주민등록번호의 고유한 개수는 몇개일까?


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari