-- 그룹함수 또는 집합함수 ...
-- 표준...
/*
- count() : 행의 갯수 (컬럼명을 사용하는 경우 null은 제외)
- avg() : 평균 ( null인 경우 처리 필요 )
- max() : 최대값( null인 경우 처리 필요 )
- min() : 최소값( null인 경우 처리 필요 )
- sum() : 합계 ( null인 경우 처리 필요 )
*/
SELECT COUNT(*) AS all_cnt,
AVG(mem_mileage) AS all_avg,
SUM(mem_mileage) AS all_sum,
MAX(mem_mileage) AS mileage_max,
MIN(mem_mileage) AS mileage_min
FROM MEMBER;
-- null이 존재하는 컬럼의 경우에는
-- : null 체크를 해야함
-- : not null 조건인 컬름은 제외해도 무관
SELECT COUNT(nvl(prod_mileage, 0)) AS all_cnt,
COUNT(*) AS all_cnt2,
AVG(nvl(prod_mileage, 0)) AS all_avg,
SUM(nvl(prod_mileage, 0)) AS all_sum,
MAX(nvl(prod_mileage, 0)) AS mileage_max,
MIN(nvl(prod_mileage, 0)) AS mileage_min
FROM prod;
-- 일반 조건 ㅣ Where절 사용
-- 그룹에 대한 조건 : Group By ~ Having 절 사용
-- Group By절
-- : 그룹으로 묶고자 하는 컬럼명 or 일반함수를 처리한 컬럼 지정
-- Having절
-- : 그룹함수를 이용한 조건(비교 연산자) 사용
-- : 그룹 조건이 없으면 Having절은 사용 안해도 됨
-- (Group By절만 사용 가능)
-- 그룹에 대한 문제로 인식하는 방법
-- : ~별로 조회 라는 개념적 용어가 사용되면 Group By를 사용
-- 회원 취미별로 count 하기
SELECT mem_like, count(nvl(mem_like, 0)) AS cnt_like
FROM MEMBER
-- 그룹화 할 컬럼 지정
-- group by에 지정한 컬럼 or 일반함수를 이용한 경우,
-- : select절에 예의상 넣어주기
GROUP BY mem_like;
-- 일반적으로 집계함수와 일반컬럼 or 일반함수가 적용된 경우에는
-- Group By 절에도 존재합니다.
SELECT mem_like, count(nvl(mem_like, 0)) AS cnt_like,
SUM(nvl(mem_mileage, 0)) AS sum_mile
FROM MEMBER
GROUP BY mem_like;
-- [문제]
-- 회원의 성별 count값을 조회해주세요...
SELECT
if(mod(SUBSTR(mem_regno2,1,1),2) > 0,'남자', '여자')AS mem_mf,
COUNT(SUBSTR(mem_regno2,1,1)) AS mem_mf_count
FROM MEMBER
GROUP BY SUBSTR(mem_regno2,1,1);
SELECT COUNT(*) AS cnt -- 묶은값들에 대한 카운트
FROM MEMBER
Group BY SUBSTR(mem_regno2,1,1) -- 같은 값끼리 묶어라..
ORDER BY cnt Desc;
/*
< 처리순서>
1. Select
2. From 테이블
3. Where ~ And
4. Group By
5. Having
6. Select 뒤에 컬럼들
7. Order By
<SQL 작성>
Select 컬럼들
From 테이블
Where 일반조건
And 일반조건
Group By 그룹컬럼
Having 그룹조건
Order By 정렬컬럼
<Group By를 사용한 경우 규칙>
- Gruop By절에 제시된 컬럼들은 원형그대로, 조회할 컬럼에 제시
- Select절 뒤에 컬럼 또는 일반함수를 이용해서 조회하고자 하는 컬럼들은
Gruop By절에 원형 그대로 제시가 되어 있어야 오류가 안남
- 컬럼 뒤에 별칭(as)은 group By절에는 사용하면 오류남
- 집계함수는 Group By절에 제시핮 ㅣㅇ낳습니다.
*/
-- [문제]
-- cart 테이블을 이용해서 회원별로 count 해주세요
SELECT cart_member,
COUNT(*) AS MEMBER_cnt,
MAX(cart_qty) AS max_qty,
SUM(cart_qty) AS sum_qty
FROM cart
GROUP BY cart_member;
-- 주문번호 : 앞자리 8자리는 주문했던 년월일,
-- : 뒷자리 5자리는 주문일 기준 1씩 증가된 값..
-- (주문이 일어나면 1씩 증가된 주문번호가 부여됨)
SELECT cart_member,cart_no, cart_qty, cart_prod
FROM cart
WHERE cart_no LIKE '20050401%';
-- [문제]
-- 임의 회원이 2005년 4월 1일에 상품하나를 구매했다.
-- 주문번호를 발급 >>
-- 신규 주문번호만 조회하자
SELECT MAX(cart_no) + 1
FROM cart
WHERE cart_no LIKE '20050401%';