3장 -2 좀 더 깊게 알아보는 SELECT 문
SELECT 문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 limit, 중복된 데이터를 제거하는 distinct 등을 사용할 수 있다.
GROUP BY 절은 지정한 열의 데이터들을 같은 데이터끼리는 묶어서 결과를 추출한다. 주로 그룹으로 묶는 경우는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 함께 사용된다. GROUP BY 절에서도 HAVING 절을 통해 조건식을 추가할 수 있다. HAVING 절은 WHERE 절과 비슷해 보이지만 GROUP BY절과 함께 사용되는 것이 차이점이다.
1. ORDER BY 절
SELECT 절의 형식
SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
ORDER BY 절은 결과의 값이나 개수에 대해서는 영향을 미치지 않지만 결과가 출력되는 순서를 조절한다.
데뷔 일자가 빠른 순서대로 출력되도록 명령어를 입력해보자.
SELECT mem_id, mem_name, debut_date
FROM member
order by debut_date;

* 데뷔 일자가 늦은 순서대로 하려면 간단히 제일 뒤에 DESC를 붙여주면 된다. ASC는 Ascending의 약자로 오름차순을 의미하고 DESC는 Desending으로 내림차순을 의미한다.

ORDER BY와 WHERE 절은 함께 사용 가능, 하지만 순서는 지켜야 한다.
SELECT mem_id, mem_name, debut_date, height
FROM member
ORDER BY height DESC
WHERE height >= 164; ==> 오류 발생
ORDER BY 절은 WHERE 절 다음에 나와야 한다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC;

정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있다.
평균 키가 순서대로 정렬하되, 평균 키가 같으면 데뷔 일자가 빠른 순서로 정렬하는 명령어는 다음과 같다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;

2. 출력의 개수를 제한: LIMIT
LIMIT는 출력하는 개수를 제한한다.
다음은 회원 테이블을 조회하는데 전체 중 앞 3거만 조회하는 코드이다.
SELECT *
FROM member
LIMIT 3;

데이터를 제한 하기 전 먼저 데이터를 정렬한 후 추출하는 것이 일반적이다.
다음의 코드는 데뷔 일자가 빠른 회원 3건만 ORDER BY를 사용해서 추출한 코드이다.
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3;

LIMIT의 형식은 LIMIT 시작, 개수이다.
LIMIT 3만 쓰면 LIMIT 0, 3과 동일하다.
중간부터 출력도 가능하다.
다음은 평균 키가 큰 순으로 정렬하되, 3번째부터 2건만 조회하는 코드이다.
SELECT mem_name, height
FROM member
ORDER BY height DESC
LIMIT 3, 2;

3. 중복된 데이터 제거: DISTINCT
DISTINCT는 조회된 결과에서 중복된 데이터 1개만 남긴다.
아래 코드를 실행하면 중복된 데이터가 여러 개 출력 된다.
SELECT addr FROM member;

ORDER BY를 사용하면 같은 지역 끼리 묶어서 데이터를 출력 할 수 있다.
SELECT addr FROM member ORDER BY addr;

DISTINCT를 사용하면 중복된 데이터를 1개만 남기고 제거한다.
SELECT distinct addr FROM member;

4. GROUP BY 절
기본 형식
SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
GROUP BY 절은 말 그대로 그룹으로 묶어주는 역활이고 집계 함수와 같이 많이 쓰인다.
집계 함수
함수명 | 설명 |
SUM() | 합계를 구한다. |
AGV() | 평균을 구한다 |
MIN() | 최소값을 구한다 |
MAX() | 최대값을 구한다 |
COUNT() | 행의 개수를 센다 |
COUNT(DISTINCT) | 행의 개수를 센다(중복은 1개만 인정) |
집계 함수인 SUM() 을 사용해 GROUP BY 절을 사용하여 각 회원의 구매한 개수를 출력하는 코드는 다음과 같다.
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;

별칭을 사용하여 결과를 보기 좋게 만들 수도 있다.

회원이 구매한 금액의 총합을 출력하려면 다음과 같다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" FROM buy GROUP BY mem_id;

전체 회원이 개마한 물품 개수의 평균
SELECT AVG(amount) "평균 구매 갯수" FROM buy;

회원 별로 평균 몇 개를 구매했는지 알아보려면 GROUP BY를 사용하면 된다.
SELECT mem_id, AVG(amount) "평균 구매 갯수"
FROM buy
GROUP BY mem_id;

SELECT COUNT(*) FROM member; -- 연락처가 있는 회원의 수 카운트

SELECT COUNT(phone1) "연락처가 있는 회원" FROM member;

HAVING 절
총 구매액을 구한다고 가정 할 때 WHERE 절을 사용하여 1000원 이상 구매한 사람을 찾는 것은 불가능하다.
이럴 때에는 WHERE 대신 HAVING 절을 사용하게 된다.
즉, HAVING 절은 WHERE과 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다.
HAVING은 꼭 GROUP BY 절 다음에 나와야 한다.
다음은 회원 중 총 구매 금액이 천 원이 넘는 사람들을 찾는 코드이다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM BUY
GROUP BY mem_id
HAVING SUM(price*amount) > 1000;

정리) GROUP BY와 관련된 조건절은 HAVING을 사용해야 한다.
만약 총 구매액이 큰 사용자부터 나타내려면 ORDER BY를 사용하면 된다.

핵심 포인트
1. ORDER BY 는 결과가 출력되는 순서를 조저한다. 내림차순 DESC, 오름차순 ASC
2. LIMIT는 출력하는 개수를 제한하며, 주로 ORDER BY와 함께 사용한다.
3. DISTINCT는 조회된 결과에서 중복된 것은 1개만 남기며, 열 이름 앞에 붙여주면 된다.
4. GROUP BY는 데이터를 그룹으로 묶어주는 기능을 한다.
5. HAVING은 집계 함수와 관련된 조건을 제한하며, GROUP BY 다음에 나온다.
집계 함수
함수명 | 설명 |
SUM() | 합계를 구한다. |
AGV() | 평균을 구한다 |
MIN() | 최소값을 구한다 |
MAX() | 최대값을 구한다 |
COUNT() | 행의 개수를 센다 |
COUNT(DISTINCT) | 행의 개수를 센다(중복은 1개만 인정) |