혼자 공부하는 SQL(03-2)

Sea Panda·2022년 10월 4일
0

혼자 공부하는 SQL

목록 보기
5/5

03-2 좀 더 깊게 알아보는 SELECT문

  • 핵심 키워드: ORDER BY, LIMIT, DISTINCT, GROUP BY, HAVING

0. 시작하기 전에

SELECT 문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT등을 사용할 수 있다.

그리고 GROUP BY절은 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출한다. 그리고 GROUP BY절에서는 HAVING절을 통해 조건식을 추가할 수 있다. HAVING절은 WHERE절과 비슷해 보이지만, GROUP BY절과 함께 사용하는 것이 차이다.

1. ORDER BY절


ORDER BY절은 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다.

위의 사진은 데뷔 일자에 따라 출력을 정렬한 것이다. 이때, 뒤에 DESC를 붙여주면 내림차순으로 결과를 출력한다. DESC는 Descending의 약자로 내림차순을 의미한다. 기본값은 ASC으로 Ascending의 약자로 오름차순을 의미한다.

ORDER BY절과 WHERE절은 함께 사용할 수 있다. 이때 SQL의 순서에 주의하여야 한다.

위의 SQL문을 실행하면 오류가 발생한다. 이를 해결하기 위해서는 다음과 같이 순서를 수정하고 실행해야 한다.

여기서 만일 동일한 값을 가지는 두 행이 있을 때 순서를 정하여 정렬하고 싶을 경우 다음과 같이 조건을 추가하여 순서대로 정렬할 수 있다.

즉, 정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있다. 이때 먼저 나온 정렬기준에 따라서 정렬을 한 후에 동일한 값이 나올 경우 그 후의 정렬기준에 따라서 정렬한다.

1-1. 출력의 개수를 제한: LIMIT

LIMIT는 출력하는 개수를 제한한다. 예를 들어, 회원 테이블을 조회하는데 전체 중 앞에서 3건만 조회할 수 있다.

LIMIT형식은 LIMIT 시작, 개수이다. 위와 같이 LIMIT 3만 쓰면 LIMIT 0,3과 동일하다. 즉, 0번째부터 3건이라는 의미이다.

1-2. 중복된 결과를 제거: DISTINCT

DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다.

위와 같이 여러 회원들의 중복된 주소를 제거하고 1개만 남긴다. DISTINCT를 열 이름 앞에 붙이면, 중복된 값은 1개만 출력된다.

2. GROUP BY절


GROUP BY절은 말 그대로 그룹으로 묶어주는 역할을 한다. 예제로 Market_db의 구매 테이블에서 회원이 구매한 물품의 개수를 구하여 보도록 하겠다.

위와 같이 정렬하여 하나씩 계산할 수 있지만, 이렇게 계산한다면 MySQL을 사용할 이유가 없다.

이럴 때는 집계 함수를 사용하면 된다. 집계 함수는 주로 GROUP BY절과 함께 쓰이며 데이터를 그룹화(Grouping)해주는 기능을 한다.

2-1. 집계함수


GROUP BY와 함께 주로 사용되는 집계 함수(aggregate function)의 표이다. 이를 이용하여 각 회원의 구매한 물품의 개수를 구한다.

그리고 앞에서 배운 별칭(alias)를 사용할 수도 있다.
이번에는 회원이 구매한 금액의 총합을 출력해보겠다. 이 역시 SUM을 사용하면 된다.

이번에는 전체 회원이 구매한 물품 개수의 평균을 구하여 보겠다.
평균 구매 개수는 3개인 것을 알 수 있다.

이번에는 각 회원이 한 번 구매 시 평균 몇 개를 구매했는지 알아보도록 하겠다. 회원별로 구해야 하므로 GROUP BY를 사용하면 된다.

이번에는 연락처가 있는 회원만 카운트하기 위하여 COUNT를 사용해보도록 하겠다.

위와 같이 집계 함수를 이용하면 손쉽게 그 수를 알 수 있다.

2-2. Having절

앞에서 살펴본 SUM()으로 회원별 총 구매액을 구해보도록 하겠다. 이때 총 구매액이 1000이상인 회원만 출력하기 위하여 WHERE절을 사용하면 다음과 같은 결과가 나온다.

오류 메세지를 보면 집계 함수는 WHERE절에 나타낼 수 없다는 내용이다. 바로 이때 WHERE 대신에 사용되는 것이 HAVING절이다. HAVING은 집계 함수에 대해서 조건을 제한하는 것이다. 그리고 HAVING절은 반드시 GROUP BY절 다음에 나와야 한다.


  • 개인적 피드백
    공부한 내용을 정리하려고 하는 건데 공부하는 시간보다 정리하는 시간이 더 드는 것 같다. 아마도 책 내용 모두를 똑같이 정리하려다 보니 그러는 것 같다. 다음부터는 정말 요약정리처럼 정리해서 작성해야겠다.

0개의 댓글