SQL

2022_11_10 SQL 정리

0304호 2022. 11. 10. 18:12

04_그룹함수

AVG() --평균
SUM() --합계
MIN() --최솟값
MAX() --최댓값
COUNT() --행의수

COUNT(*) --NULL을 포함한 행의 갯수
COUNT(컬럼)  --NULL값을 제외한 행의 갯수

--그룹함수는 일반 컬럼과 동시에 출력이 불가능함

--------------------------------------GROUP BY
GROUP BY 절은 where절 다음 order절 사이에 쓰임
그룹별로 그룹함수를 사용하고싶을때 사용함
ex ) 특정 집단별로 (avg/sum/min/max/count)를 사용하고싶을떄
GROUP BY 는 2개 이상도 가능함
Ex) GROUP BY department_id, job_id;
--부서별 급여 평균
SELECT department_id, TRUNC(AVG(salary))
FROM employees
GROUP BY department_id;

-- group절에 묶이지 않은 컬럼은 SELECT절에 사용 불가( 데이터베이스 별로 다름)
--SELECT department_id, job_id, TRUNC(AVG(salary))
--FROM employees
--GROUP BY department_id;

--2개이상의 그룹
SELECT department_id, job_id FROM employees GROUP BY department_id, job_id ORDER BY department_id DESC;

SELECT department_id, 
        job_id, 
        sum(salary), 
        count(*),              --그룹별 수
        count(*) over()        --전체 행 수
FROM employees GROUP BY department_id, job_id ORDER BY department_id desc;

SELECT department_id, 
        job_id, 
        count(*) OVER()        --전체 행 수
FROM employees ;
        
--WHERE절에 그룹함수 사용 불가
--SELECT department_id
--FROM employees
--WHERE sum(salary) >=5000    
--GROUP BY department_id;

--------------------------------------------Having 
HAVING은 GROUP BY 절의 조건
WHERE에는 열선태에 대한 조건이 들어감
HAVING엔 GROUPING에 대한 조건이 들어가야함
--HAVING(그룹에 대한 조건)

SELECT department_id, sum(salary)
FROM employees
GROUP by department_id
HAVING sum(salary) > 100000;

select job_id, count(*)
FROM employees
GROUP BY job_id
HAVING count(*) >=20;

--부서아이디가 50 이상인것들을 그룹화 시키고, 그룹 평균중 5000이상만 조회, 정렬 부서아이디
SELECT department_id, TRUNC(AVG(salary))
FROM employees
WHERE department_id>=50
GROUP BY department_id
HAVING AVG(salary) >=5000
ORDER BY AVG(salary) DESC;

select* from employees;

--직무 SA가 포함된 데이터의 그룹별 사원수, 그룹별 급여합
SELECT job_id, count(*) AS 사원수, sum(salary) AS 급여합
FROM employees
where job_id LIKE '%SA%'
GROUP BY job_id
ORDER BY job_id;


---------------------------------------GROUP BY 앞에 붙음
--ROLLUP 
GROUP BY 절에 의해서 그룹지어진 결과의 합계를 보여줌
--CUBE
GROUP BY 절에 의해서 그룹지어진 결과의 합계를 보여줌
--ROLLUP       --주 그룹의 토탈
--그룹핑 1개 => 총 계출력
SELECT department_id, sum(salary)
FROM employees
GROUP BY ROLLUP(department_id)
ORDER BY department_id;

--그룹핑 2개 --총계와 주그룹의 토탈
SELECT department_id, job_id, AVG(salary), COUNT(salary)
FROM employees
GROUP BY ROLLUP(department_id, job_id)
ORDER BY department_id, job_id;

--CUBE         --주, 서브그룹의 토탈( 구할 수 있는 모든 합)
SELECT department_id, job_id, AVG(salary), COUNT(salary)
FROM employees
GROUP BY CUBE(department_id, job_id)
ORDER BY department_id, job_id;

--GROUPING
SELECT department_id, 
        DECODE(GROUPING(job_id), 1 , '소계', job_id ),
        AVG(salary), 
        COUNT(salary),
        GROUPING(department_id),
        GROUPING(job_id)
FROM employees
GROUP BY ROLLUP(department_id, job_id)
ORDER BY department_id, job_id;

-------------------------------------------JOIN
JOIN  - 관계형 데이터베이스에서 제일 중요한 부분
JOIN은 두가지 종류가 있음
-ANSI 조인 - 모든 데이터베이스에서 공용으로 사용함
-오라클 조인
ANSI JOIN -> 이너와 아우터의 차이를 알아야함
 join 앞에 종률설정이 없으면 기본값임 inner로 설정됨
  
  -> Inner JOIN   -  NULL은 제외하고 합침
    -> Outter JOIN  
-LEFT JOIN        - 왼쪽테이블이 기준으로 잡혀서 오른쪽 테이블에 대한 값이 없다면 NULL값으로 출력됨
-RIGHT JOIN       - 오른쪽이 기준이기 때문에 왼쪽 테이블 중 오른쪽에 없는 데이터는 NULL값으로 출력됨
-FULL OUTER JOIN  - 양쪽의 모든 값을 가져오는데 반대쪽 테이블에 연관되는 값이 없다면 NULL로 출력함
  -> CLOSS jOIN   - 첫번째 테이블의 모든 행 마다 오른쪽 테이블이 붙음
  
  

--INNER JOIN  NULL값을 제외한 후 합쳐짐
SELECT * FROM info INNER JOIN auth ON info.auth_id = auth.auth_id;

--LEFT OUTER JOIN 왼쪽 기준으로 합쳐지고 오른쪽테이블과 연관된 값이 없다면 NULL을 리턴함
SELECT * FROM info LEFT OUTER JOIN auth ON info.auth_id = auth.auth_id;

--RIGHT OUTER JOIN 오른쪽 기준으로 합쳐지고 왼쪽테이블과 연관된 값이 없다면 NULL을 리턴함
SELECT * FROM info RIGHT OUTER JOIN auth ON info.auth_id = auth.auth_id;

--FULL OUTER JOIN 전체 데이터가 합쳐지는데 반대 테이블에 연관된 값이 없다면 null을 리턴함
SELECT * FROM info FULL OUTER JOIN auth ON info.auth_id = auth.auth_id;

--CROSS JOIN 왼쪽 테이블의 모든 행마다 오른쪽 테이블이 붙음
SELECT * FROM info CROSS JOIN auth;