Coding Note/SQL

SQL SELECT ORDER BY 정렬하기 / GROUP BY / HAVING / 통계 (그룹함수)

푸린이 2021. 12. 26. 22:47

* ORDER BY == Sorting

- 형식 :

    SELECT COLUMN VALUE SUBQUERY
    FROM TABLE SUBQUERY
    WHERE IF
    ORDER BY COLUMN ASC     오름(생략가능)
                               DESC    내림

 

-- 오름차순 ASC

SELECT first_name, salary
FROM employees
ORDER BY salary ASC;

 

-- 내림차순 DESC

SELECT first_name, salary
FROM employees
ORDER BY salary DESC;

 

-- ALIAS로 정렬하기

SELECT employee_id, first_name, SALARY * 12 AS annsal
FROM employees
ORDER BY annsal DESC;

- ORDER BY SALARY * 12 DESC; 와 동일

 

-- NULL FIRST

SELECT commission_pct
FROM employees
ORDER BY commission_pct NULLS FIRST;

- NULL이 먼저 출력되고 그 다음 값이 있는 부분 정렬하여 출력

 

-- NULL LAST

SELECT commission_pct, salary
FROM employees
ORDER BY commission_pct NULLS LAST, salary DESC;

- COMMISSION_PCT 먼저 NULL이 맨 뒤에 오도록 정렬 후, SALARY를 기준으로 내림차순 정렬

 

-- 입사 순으로 정렬한 뒤 급여 역순 정렬

SELECT hire_date, salary, JOB_ID
FROM employees
ORDER BY hire_date ASC, salary DESC;

- 같은 날짜 안에서 급여로 정렬

 

-- 업무명으로 정렬, 급여 역순 정렬

SELECT job_id, salary
FROM employees
ORDER BY job_id ASC, salary DESC;

 

* GROUPING

- GROUP BY : 그룹으로 묶는 기능

- HAVING : 그룹으로 묶은 후의 조건

  (WHERE : 그룹으로 묶기 전 조건)

 

SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY department_id ASC;

SELECT job_id
FROM employees
GROUP BY JOB_ID
ORDER BY job_id ASC;

- 중복 데이터가 있는 부분을 묶을 수 있다.

- 묶은 컬럼만 출력가능 (DISTINCT와 비슷)

 

* 통계 (그룹함수) : 그룹으로 묶었을 때 사용 가능 (정석)

- COUNT
- SUM
- AVG
- MAX

- MIN

 

SELECT job_id, COUNT(employee_id)
FROM employees
GROUP BY job_id;

SELECT job_id, COUNT(*)
FROM employees
GROUP BY job_id;

- COUNT(employee_id) == COUNT(*)

- 중복이 되지 않는 부분을 전부 포함시켜 개수 셈

 

 

SELECT job_id, COUNT(*), SUM(salary), AVG(salary), MAX(salary), MIN(salary)
FROM employees
GROUP BY job_id;

- 부서별로 묶어서, 부서별 인원, 급여 합계, 급여 평균, 최대 급여, 최소급여를 출력할 수 있다.

 

-- HAVING : 그룹으로 묶은 후의 조건

SELECT job_id, COUNT(*), SUM(salary), AVG(salary)
FROM employees
GROUP BY job_id
HAVING SUM(salary) >= 100000;

 

- 급여를 5000이상 받는 사원만으로 합계를 내서 JOB_ID(업무)으로 그룹화하여 급여의 합계가 20000을 초과하는 JOB_ID명(업무)을 구하라

SELECT job_id, SUM(SALARY)                                      -- 4
FROM employees
WHERE salary >= 5000                -- 묶기 전 조건 : 필터링       -- 1
GROUP BY job_id                                                 -- 2
HAVING SUM(salary) > 20000;        -- 묶은 후 조건               -- 3

- 처리순서 : WHERE → GROUP BY → HAVING → SELECT