쌓고 쌓다

[SQL] ORDER BY, LIMIT, DISTINCT, GROUP BY, HAVING, 집계함수 본문

프로그래밍/SQL

[SQL] ORDER BY, LIMIT, DISTINCT, GROUP BY, HAVING, 집계함수

승민아 2022. 6. 24. 19:23

ORDER BY

SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date;

오름차순 정렬

기본값은 ASC로 오름차순 정렬이다.

여기서 내림차순을 원한다면 DESC를 제일 뒤에다 붙여주면 된다.

SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date DESC;

내림차순 정렬

 

 

 

WHERE 절을 ORDER BY 절 앞에 추가하여 함께 사용할 수 있다.

height가 164보다 큰 조건을 추가하였다.

SELECT mem_id, mem_name, debut_date FROM member WHERE height >=164 ORDER BY debut_date DESC;

 

WHERE + ORDER BY

 

 

정렬 기준은 여러 개도 가능하다.

정렬 기준이 1개고 같은 값이 존재한다면 또 다른 정렬 기준을 통해 같은 값을 같은 자료를 다른 기준으로 정렬할 수 있다.

SELECT mem_id, mem_name, debut_date FROM member WHERE height >=164 ORDER BY height DESC, debut_date ASC;

위의 쿼리문은 키를 내림차순으로 정렬을 하는데 키가 같다면 데뷔 날짜를 기준으로 오름차순으로 정렬을 한다.

즉 정렬 기준이 2개이고 첫 정렬 기준은 키, 두번째 정렬 기준은 데뷔 날짜가 되는 것이다.

2가지 정렬 기준

 

 

 

출력의 개수 제한 : LIMIT

SELECT * FROM member; 로 멤버 테이블을 출력했더니 너무 많다...

그래서 출력의 개수를 제한하려고 한다. 그럴 때 LIMIT를 사용한다.

LIMIT을 사용해 출력의 개수를 3개로 제한해보자.

SELECT * FROM member LIMIT 3;

 

SELECT * FROM member LIMIT 3

 

LIMIT의 형식 : LIMIT 시작,개수 이다.

LIMIT 3으로 할 경우 사실상 0부터 시작하여 3개를 출력하므로

LIMIT 0, 3 인 것이다.

LIMIT 3과 동일한 결과인 LIMIT 0,3

 

+ 응용을 하여 키(height)를 내림차순으로 정렬하는데 3번째부터 2건만 출력해보자.

SELECT mem_name, height FROM member ORDER BY height DESC LIMIT 3,2 ;

 

 

중복된 결과 제거 : DISTINCT

주소만 뽑아 와 보자.

SELECT addr FROM member;

주소만 뽑아 옴

 

중복되는 주소가 많아 보기가 힘들다.

그래서 일단 정렬을 통해 같은 것들끼리 모아 보기 쉽게 만들자.

SELECT addr FROM member ORDER BY addr;

같은 주소들끼리 모아봄

 

 

주소들을 보기가 쉬워졌으나, 중복된 것들이 여전히 많아 보기 힘들다.

중복된 것들을 제거하고 보고 싶다.

SELECT DISTINCT addr FROM member;

중복 제거를 해봄

 

-> 열 이름 앞에 DISTINCT 만 붙여준다면 중복된 데이터는 제거가 되고 1개만 보여준다.

 

집계 함수

GROUP BY를 설명하기 전

주로 GROUP BY와 함께 사용되는 함수를 이해하고자 한다.

함수명 설명
SUM() 합계를 구합니다.
AVG() 평균을 구합니다.
MIN() 최소값을 구합니다
MAX() 최대값을 구합니다.
COUNT() 행의 개수를 셉니다.
COUNT(DISTINCT) 행의 개수를 셉니다.(중복은 1개만 인정)

 

 

GROUP BY

: 그룹으로 묶어주는 역할을 한다.

 

예를 들어 회원(mem_id) 별로 여러 건의 물건을 구매했고, 그것을 출력을 하면 각각의 행으로 표시가 된다.

SELECT mem_id, amount FROM buy ORDER BY mem_id

그래서 같은 회원(mem_id)이 주문한 건수에 대해 모두 합쳐서 출력을 하고 싶다.

위의 예제로 mem_id가 APN인 회원은 1+2+1+1 이므로 5만 출력을 해주면 되는 것이다.

집계 함수를 이용해 구현한다.

SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id ;

같은 회원에 대해 묶어 합계 구하기

 

 

+ 별칭 사용

SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수" FROM buy GROUP BY mem_id ;

별칭 사용

 

 

+ 가격(price)와 수량(amount)를 이용해 금액의 총합 구하기

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매액" FROM buy GROUP BY mem_id ;

 

 

+ 전체 회원이 구매한 물품 개수(amount)의 평균

SELECT AVG(amount) "평균 구매 개수" FROM buy;

buy 테이블의 amount의 평균을 출력

 

 

+ 각각 회원 별 구매한 물품 개수(amount)의 평균

SELECT mem_id, AVG(amount) "평균 구매 개수" FROM buy GROUP BY mem_id;

 

 

+ 회원 테이블(member)에서 회원의 수 ( 모든 행의 개수를 셈 )

SELECT COUNT(*) FROM member;

member 테이블의 데이터(행)가 10이다.

실제로 10개의 데이터가 member에 존재함.

 

 

+ 회원 테이블(member)에서 연락처가 있는 회원의 수 ( NULL인 것을 제외 )

SELECT COUNT(phone1) FROM member;

phone1이 NULL이 아닌 회원 8명 존재

 

 

HAVING

앞서 SUM()으로 회원(mem_id)별 총 구매액을 구했다.

여기서 총 구매액이 1000이 넘는 회원만 보고 싶다면

HAVING을 사용한다.

 

왜? WHERE 을 사용 안 할까? 한번 WHERE을 입력을 해보자.

SELECT mem_id, SUM(price*amount) FROM buy WHERE SUM(price*amount) > 1000 GROUP BY mem_id;

에러 결과

"집계 함수는 WHERE 절에 나타날 수 없다"는 에러가 뜬다.

즉, 집계 함수는 WHERE에 사용할 수 없다는 것이다.

이럴 때 HAVING을 사용해야 한다.

HAVING은 WHERE와 비슷하게 조건을 제한하지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하자.

즉, GROUP BY의 조건절은 HAVING을 사용한다.

 

- HAVING 사용

SELECT mem_id, SUM(price*amount) FROM buy GROUP BY mem_id HAVING SUM(price*amount) >= 1000 ;

출력 결과

-> HAVING 절은 GROUP BY 절 다음에 나와야 한다.

 

+ 같은 회원은 묶고, 총 구매액 1000이상을 내림차순으로 정렬

SELECT mem_id, SUM(price*amount) FROM buy GROUP BY mem_id HAVING SUM(price*amount) >= 1000 ORDER BY SUM(price*amount) DESC;

출력 결과

 

모든 내용은 '혼자 공부하는 SQL' 도서를 학습후 정리한 내용입니다. 

Comments