데이터를 그냥 마구잡이로 보여주지 않고 어느정도 정돈된 상태로 보고 싶은 마음이 있을 것입니다. 널부러져있는 옷가지보다는 착착 잘 정돈된 옷이 더 보기가 좋듯 말이죠. SQL에서는 데이터를 어떻게 정돈할까요? 바로 ORDER BY를 사용하여 우리가 원하는 방식대로 정렬이 가능합니다.
SELECT
FROM
WHERE
ORDER BY
ORDER BY는 가장 마지막에 등장하며 다음과 같이 활용할 수 있습니다.
1. ORDER BY (ASC / DESC / NULLS FIRST)
SELECT ename, sal FROM emp ORDER BY sal ASC; --월급을 기준으로 오름차순으로 정리
SELECT ename, sal FROM emp ORDER BY sal DESC; --내림차순으로 정리
SELECT empno, ename, sal*12 AS annsal FROM emp ORDER BY annsal DESC;
SELECT empno, ename, comm FROM emp ORDER BY comm NULLS FIRST;
ascending은 올라가는이고 descending은 내려가는이죠? 그것들의 약자로 ASC, DESC를 쓰면 오름차순과 내림차순의 활용이 가능합니다. 만약 둘 중 아무것도 적지 않는다면 디폴트값으로 ASC, 즉 오름차순이 적용됩니다. 앞서 배웠던 AS로 별명을 만들어준 다음에 그것을 ORDER BY에 활용도 가능합니다.
또한 null값을 가진 데이터가 있을 경우에는 표의 가장 아래쪽에 보여지도록 하는것이 디폴트값인데요(NULLS LAST) 이것을 돌려서 NULLS FIRST, 즉 null값이 제일 먼저 보이게끔 만들수도 있습니다. NULLS FIRST로 한 경우에는 NULL값을 0보다 작은 값으로 보기 때문에 그 다음부터는 오름차순으로 정렬이 됩니다.
2. GROUP BY & HAVING
GROUP BY는 보이는대로 그룹으로 묶는다는 것이고, 그럼 그 그룹을 무슨 기준으로 묶을것이냐 하면 HAVING절에 그 조건을 적어주면 됩니다. GROUP BY함수와 어울려서 같이 잘 쓰이는 것에는 COUNT, SUM, AVG, MAX, MIN이 있습니다.
SELECT COUNT(*), SUM(salary), AVG(salary), MAX(salary), MIN(salary)
FROM employees WHERE job_id = 'IT_PROG';
다 넣어본다면 위와 같은 형식이 되겠네요!
SELECT job_id FROM employees GROUP BY job_id ORDER BY job_id;
일단 이렇게 하면 업무(job_id)로 묶은 것인데요, GROUP BY에 사용된 컬럼은 그 후 일반 컬럼으로 쓸 수 없습니다. 이 말이 무슨 말인가 하면 예를 들어 SELECT job_id, first_name FROM employees GROUP BY job_id ORDER BY job_id; 이렇게 쓰는 경우에 원하는 것은, 업무별로 묶은 다음에 ~ 업무명이랑 이름을 알려줘가 되겠죠? 그런데 생각을 해보면 GROUP BY job_id 하라고 해서 이미 업무별로 묶어놓은 상태입니다. 그런데 어떻게 이름을 보여줄 수가 있을까요? 만약 서울, 부산, 광주에 보낼 택배를 이미 싸놓은 상태에서 서울이랑 부산이랑 광주에 보낼 물건들 다 꺼내서 보여줘 하면 가능할까요? 불가능하겠죠. 그러므로 에러가 나게 됩니다.
SELECT job_id, COUNT(*), SUM(salary), AVG(salary) FROM employees
GROUP BY job_id ORDER BY job_id;
--업무별로 급여의 합계가 10만불을 초과하는 부서
SELECT job_id FROM employees GROUP BY job_id HAVING SUM(salary)>100000;
마찬가지로 역시나 GROUP BY절 다음에 오는 컬럼과 SELECT절 다음에 오는 컬럼명은 동일함을 확인하실 수 있습니다. GROUP BY와 SELECT는 함께 짝처럼간다고 기억해도 좋을 것 같습니다.
SELECT job_id AS 업무명, SUM(salary) AS 합계 FROM employees WHERE salary>=5000
GROUP BY job_id HAVING SUM(salary)>20000 ORDER BY 합계 DESC;
1. 급여가 5000이상 받는 사원으로 합계를 내서 2. 업무로 그룹화하여
3. 급여의 합계가 20000을 초과하는 4. 업무명을 구하라
무엇을 하라는것인지 하나씩 쪼개보겠습니다. 일단 마지막에 업무명을 구하라는 걸 보니 SELECT에는 업무명이 들어가겠습니다. 당연히 GROUP BY절에도 업무명이 들어가겠죠? 짝처럼요ㅎㅎ employees테이블에서 값을 가져올 건데 그 중에서 급여가 5000 이상인 사원만 대상으로 합계를 낼 것이기 때문에 FROM employees WHERE salary >= 5000 조건절을 써줍니다. 마지막으로 HAVING절은 GROUP BY에 종속되는 조건절입니다. 즉 급여의 합계 SUM(salary)가 20000을 초과하는 업무명만 구하라고 했기 때문에 HAVING SUM(salary) > 20000이 들어가게 되는 것입니다. 마지막으로 정렬은 합계 순으로 큰 숫자부터 쭉쭉 내려오도록 만들어주면 완성입니다!
'Oracle SQL > 기초 SQL' 카테고리의 다른 글
SQL SELECT문으로 이것저것 다 해보기(4) / JOIN (0) | 2021.05.27 |
---|---|
SQL SELECT문으로 이것저것 다 해보기(2) / 비교연산자 (0) | 2021.05.26 |
SQL SELECT문으로 이것저것 다 해보기(1) (0) | 2021.05.26 |
Dual table을 활용하여 알아보는 SQL SELECT 함수 (0) | 2021.05.25 |
오라클 기본 자료형(숫자, 날짜) (0) | 2021.05.25 |