SQL SELECT, 제대로 사용하기

2020. 6. 23. 15:46BACKEND/Database

반응형

안녕하세요.

지난 포스팅에서 SELECT문에 대한 다양한 필터링대해 알아보았습니다.

이번에는 SELECT문에 대한 다양한 필터링 및 정렬 기능에 대해 더 알아보도록 하겠습니다.

 

***************** INDEX *****************

 

[ 1장 ]

1. 조건 & 관계 연산자

2. BETWEEN...AND

3. IN

4. LIKE

 

[ 2장 ]

5. GROUP BY - HAVING

6. ORDER BY

7. DISTINCT

8. LIMIT

 

********************************************

 

 

 

🌈 첫 번째, GROUP BY - HAVING

GROUP BY 는 말 그대로 그룹으로 묶어주는 역할을 해줍니다.

GROUP BY 에서는 알아볼 것들이 몇 가지 있는데요.

 

1. GROUP BY

2. 집계함수 AggregateFunction

3. AS

4. HAVING

 

등이 있습니다.

 

 

✔️GROUP BY 

GROUP BY <column> 을 해주면 column 을 그룹으로 묶어주는 역할을 합니다.

 

[TEST DATA 1]

 

위의 데이터를 이용해서 GROUP BY에 대한 예시를 보겠습니다.

 

SELECT * 
FROM buy 
GROUP BY user_id;

 

위의 코드를 보면 user_id 값을 기준으로 묶은 데이터를 검색하게 됩니다. 

그런데 이 과정에서 의문점이 하나 생기는데요, 중복되는 데이터는 어떻게 처리가 될까요❓ 

예를 들어 Margo와 Tod는 두 개의 데이터를 갖고 있습니다.

이 때, price와 amount의 데이터를 어떻게 처리할까요❓ 

 

결과를 같이 한 번 보겠습니다 〰️

 

result 1

위와 같은 결과가 나옵니다.

보면 Margo, Tod와 같이 중복된 데이터는 제일 먼저 나오는 데이터가 검색되게 됩니다.

 

그럼 한 개의 데이터가 나오는 것 말고, 모든 Margo 혹은 Tod에 대한 price를 더해서 출력하고 싶으면 어떻게 해야할까요❓ 

그럴 때 집계함수를 사용하는데요. 지금부터 같이 살펴보도록 하겠습니다.

 

 

✔️ 집계함수 AggregateFunction

집계함수는 효율적인 데이터 그룹화를 위한 함수입니다.

 

AggregateFunction

 

집계함수는 SELECT 문에 넣어 원하는 값을 출력하면 됩니다.

예시를 한 번 들어보도록 하겠습니다. 

 

회원들의 구매 가격을 합으로 갖는 열을 만들어보겠습니다.

 

SELECT user_id, SUM(price)
FROM buy
GROUP BY user_id;

 

위와 같은 쿼리문을 실행시키면 아래의 'USING SUM()' 와 같은 결과를 얻을 수 있습니다.

 

 

user_id를 그룹으로 묶여 price에 SUM() 집계함수가 사용된 걸 볼 수 있죠.

 

 

SUM(price) 라는 열의 이름이 마음에 안든다면 이름을 바꿀 수 있습니다.

 

 

✔️ AS  -  열 이름 지정하기 

 

as를 사용하면 별명을 붙일 수 있습니다.

아래와 같이 말이죠.

 

SELECT user_id, SUM(price) as price
FROM buy
GROUP BY user_id;

 

위의 결과는 아래와 같습니다.

 

 

이 때, as를 생략해도 별명으로 인식이 되기도 합니다.

 

이 밖에도 다양한 집계함수가 있으니, 다양하게 활용하면 좋을 것 같아요.

 

 

 

 

 

✔️HAVING 

자, 그럼 이번에는 집계함수에 대한 조건을 주는 방법에 대해 알아보도록 하겠습니다.

 

HAVING 절은 사용할 때 알아둬야할 사항이 두 가지 있습니다.

첫 번째, GROUP BY 문 뒤에 적을 수 있습니다.

두 번째, 집계함수에 대한 조건을 적을 수 있습니다.

 

참고로, WHERE 절에서는 집계함수에 대한 조건을 사용할 수 없습니다.

해보시면 알겠지만, WHERE절은 집계함수를 인식하지 못합니다.

 

이제 예시로 확인해보도록 하겠습니다.

만약, price의 합계가 50.0 이상인 것들을 검색하고싶다면 아래와 같은 쿼리문을 입력하시면 됩니다.

 

SELECT user_id, SUM(price) as price
FROM buy
GROUP BY user_id
HAVING price > 50;

 

위와 같이 말이죠.

 

쿼리문을 실행시켜보면 위와 같은 결과를 얻을 수 있습니다.

 

 

 

 

 

✏️ 두 번째, ORDER BY

이번에는 ORDER BY에 대해 알아보고자 합니다. 

ORDER BY는 이름처럼 순서를 정해주는 역할을 해줍니다.

 

ORDER BY는 기본적으로 오름차순 정렬으로 보여줍니다.

'ORDER BY <column> '의 형식으로, column명에는 정렬하고자 하는 열을 선택해서 넣어주면 됩니다.

 

SELECT *
FROM buy
ORDER BY user_id;

// 위와 아래가 동일

SELECT *
FROM buy
ORDER BY user_id ASC;

 

그럼 반대로 내림차순으로 정렬해볼까요❓ 

 

SELECT *
FROM buy
ORDER BY user_id DESC;

 

위와 같이 내림차순으로 정리하려면 'DESC' 라는 키워드를 반드시 붙여줘야 합니다.

 

 

 

💪🏻 세 번째, DISTINCT

데이터를 검색하려고 할 때, 필요없는 중복 데이터가 계속 나오면 처리 시간만 늘어나겠죠? 

중복된 데이터는 추가하지 않고 검색하려면 어떻게 해야할까요❓ 

바로 'DISTINCT' 키워드를 사용하면 됩니다. 

 

SELECT DISTINCT user_id
FROM buy;

 

위와 같이 검색하고자 하는 필드명 앞에 적어주면 중복된 데이터는 삭제하고 출력이 되죠.

[TEST DATA 1]과 같은 경우에는 중복된 user_id인 Margo와 Tod는 한 번씩만 출력이 됩니다.

 

 

👻 네 번째, LIMIT

마지막으로 LIMIT 키워드를 살펴볼까요❓ 

LIMIT은 상위의 N개만 출력하는 ‘LIMITN’구문 사용합니다. 

일부를 보기 위해 여러 건의 데이터를 출력하는 부담 줄일 수 있죠.

 

어떻게 작동이 되는지 직접 확인해 볼게요.

 

SELECT *
FROM buy
LIMIT 5;

 

위와 같은 쿼리문을 입력하게 되면 상위 0~5개의 데이터만 검색할 수 있습니다.

 

 

위와 같이 상위 5개만 볼 수 있게 됩니다.

 

그런데 범위를 지정해서 출력하고 싶을 때에는 어떻게 해야할까요❓ 

범위를 지정하고 싶으면 'OFFSET'을 사용하면 됩니다.

처음 범위를 설정해두면 LIMIT에 지정한 만큼만 뽑아서 검색하게 되죠.

 

예를 들어 3번째 테이터부터 5개의 데이터를 추출하고 싶다면 아래와 같은 쿼리를 입력하시면 됩니다.

(데이터는 0부터 시작합니다)

 

SELECT *
FROM buy
LIMIT 5
OFFSET 3;

 

offset을 3으로 주면 아래와 같은 결과값이 검색됩니다.

 

 

LIMIT과 OFFSET은 pagination을 사용할 때 필요합니다.

간단하지만, 성능을 높여줄 수 있죠. 

 

 

자 그럼 여기까지 SELECT를 제대로 사용하는 법에 대해 알아보았습니다.

더 많은 기능이 있지만, 이 포스팅에서는 여기까지 다뤄보도록 하겠습니다.

반응형

Backend Software Engineer

Gyeongsun Park