📚 Study/Oracle

Oracle :: ORDER BY절(ASC, DESC), CONCAT()

bono-hye 2023. 10. 22. 18:28

(파일명 : 20231020_01_scott)

■ ORDER BY절 (ASC, DESC)

- ASC    : 오름차순 정렬, 생략 가능

- DSEC : 내림차순 정렬

- ORDER BY는 파싱 순서가 SELECT 보다 뒤에 있기 때문에 별칭으로 정렬해도 적용 가능!

--■■■ ORDER BY 절 ■■■--

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP;
--==>>
/*
SMITH	20	CLERK	     800	 9600
ALLEN	30	SALESMAN	1600	19500
WARD	30	SALESMAN	1250	15500
JONES	20	MANAGER	    2975	35700
MARTIN	30	SALESMAN	1250	16400
BLAKE	30	MANAGER	    2850	34200
CLARK	10	MANAGER	    2450	29400
SCOTT	20	ANALYST	    3000	36000
KING	10	PRESIDENT	5000	60000
TURNER	30	SALESMAN	1500	18000
ADAMS	20	CLERK	    1100	13200
JAMES	30	CLERK	     950	11400
FORD	20	ANALYST	    3000	36000
MILLER	10	CLERK	    1300	15600
*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY DEPTNO ASC;            -- DEPTNO → 정렬 기준 : 부서번호
                                -- ASC    → 정렬 유형 : 오름차순
--==>>
/*
CLARK	10	MANAGER 	2450	29400
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	    1300	15600
JONES	20	MANAGER	    2975	35700
FORD	20	ANALYST	    3000	36000
ADAMS	20	CLERK	    1100	13200
SMITH	20	CLERK	     800	9600
SCOTT	20	ANALYST	    3000	36000
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
JAMES	30	CLERK	     950	11400
BLAKE	30	MANAGER	    2850	34200
MARTIN	30	SALESMAN	1250	16400
*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY DEPTNO;                --ASC → 정렬 유형 : 오름차순 → 생략 가능~!!! (기본 정렬이 오름차순)


SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY DEPTNO DESC;            -- DEPTNO → 정렬 기준 : 부서번호
--==>>                           -- DESC   → 정렬 유형 : 내림차순
/*
BLAKE   30   MANAGER       2850   34200
TURNER   30   SALESMAN   1500   18000
ALLEN   30   SALESMAN   1600   19500
MARTIN   30   SALESMAN   1250   16400
WARD   30   SALESMAN   1250   15500
JAMES   30   CLERK       950       11400
SCOTT   20   ANALYST       3000   36000
JONES   20   MANAGER       2975   35700
SMITH   20   CLERK       800       9600
ADAMS   20   CLERK       1100   13200
FORD   20   ANALYST       3000   36000
KING   10   PRESIDENT   5000   60000
MILLER   10   CLERK       1300   15600
CLARK   10   MANAGER       2450   29400
*/                                


SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY 연봉 DESC;                           -- 파싱 순서가 ORDER BY가 SELECT 보다 뒤에 위치했기 때문에 별칭으로 정렬해도 정렬이 되는 것!!
--==>>
/*
KING	10	PRESIDENT	5000	60000
FORD	20	ANALYST	    3000	36000
SCOTT	20	ANALYST	    3000	36000
JONES	20	MANAGER	    2975	35700
BLAKE	30	MANAGER	    2850	34200
CLARK	10	MANAGER	    2450	29400
ALLEN	30	SALESMAN	1600	19500
TURNER	30	SALESMAN	1500	18000
MARTIN	30	SALESMAN	1250	16400
MILLER	10	CLERK	    1300	15600
WARD	30	SALESMAN	1250	15500
ADAMS	20	CLERK	    1100	13200
JAMES	30	CLERK	     950	11400
SMITH	20	CLERK	     800	9600
*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY 2;                       -- SELECT 에서 명시한 컬럼 ! TBL_EMP의 전체 컬럼이 기준이 아니라!
                                  -- 따라서 부서번호 기준 오름차순 정렬!
--> EMP 테이블이 갖고 있는 테이블의 고유한 컬럼 순서(2 → ENAME)가 아니라
--  SELECT 처리 되는 두 번째 컬럼(2→DEPTNO, 부서번호)을 기준으로 정렬
--  ASC는 생략된 상태 → 오름차순 정렬
--  오라클에서의 기본 인덱스는 자바와 달리 1부터 시작
--  최종적으로... 현재 『ORDER BY 2』 구문은 →  『ORDER BY DEPTNO ASC』이다.
--==>>
/*
CLARK	10	MANAGER	    2450	29400
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	    1300	15600
JONES	20	MANAGER	    2975	35700
FORD	20	ANALYST	    3000	36000
ADAMS	20	CLERK	    1100	13200
SMITH	20	CLERK	     800	9600
SCOTT	20	ANALYST	    3000	36000
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
JAMES	30	CLERK	     950	11400
BLAKE	30	MANAGER	    2850	34200
MARTIN	30	SALESMAN	1250	16400
*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여", SAL * 12 + NVL(COMM, 0) "연봉"
FROM EMP
ORDER BY 2, 4; 
-- 부서번호, 급여 기준 오름차순 정렬
-- (1차)     (2차)
--==>>
/*
MILLER	10	CLERK	    1300	15600
CLARK	10	MANAGER	    2450	29400
KING	10	PRESIDENT	5000	60000
SMITH	20	CLERK	     800	9600
ADAMS	20	CLERK	    1100	13200
JONES	20	MANAGER	    2975	35700
SCOTT	20	ANALYST	    3000	36000
FORD	20	ANALYST	    3000	36000
JAMES	30	CLERK	     950	11400
MARTIN	30	SALESMAN	1250	16400
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
BLAKE	30	MANAGER	    2850	34200
*/

SELECT ENAME, DEPTNO, JOB, SAL
FROM EMP
ORDER BY 2, 3, 4 DESC;
-- ① 2      → DEPTNO(부서번호) 기준 오름차순 정렬 
-- ② 3      → JOB(직종명) 기준 오름차순 정렬
-- ③ 4 DESC → SAL(급여) 기준 내림차순(DESC) 정렬
-- (3차 정렬 수행)
--==>>
/*
MILLER	10	CLERK	    1300
CLARK	10	MANAGER 	2450
KING	10	PRESIDENT	5000
SCOTT	20	ANALYST 	3000
FORD	20	ANALYST	    3000
ADAMS	20	CLERK	    1100
SMITH	20	CLERK	     800
JONES	20	MANAGER	    2975
JAMES	30	CLERK	     950
BLAKE	30	MANAGER 	2850
ALLEN	30	SALESMAN	1600
TURNER	30	SALESMAN	1500
MARTIN	30	SALESMAN	1250
WARD	30	SALESMAN	1250
*/

 

■ CONCAT()

- 문자열 기반으로 데이터 결합을 수행하는 함수. 오로지 2개만 결합시킬 수 있음

- 내부적으로 숫자 / 날짜를 문자로 변화해주는 과정이 포함되어 있음. 내부적 형 변환

--○ CONCAT()
SELECT ENAME || JOB "COL1"
     , CONCAT(ENAME, JOB) "COL2"
FROM EMP;
--==>>
/*
SMITHCLERK	    SMITHCLERK
ALLENSALESMAN	ALLENSALESMAN
WARDSALESMAN	WARDSALESMAN
JONESMANAGER	JONESMANAGER
MARTINSALESMAN	MARTINSALESMAN
BLAKEMANAGER	BLAKEMANAGER
CLARKMANAGER	CLARKMANAGER
SCOTTANALYST	SCOTTANALYST
KINGPRESIDENT	KINGPRESIDENT
TURNERSALESMAN	TURNERSALESMAN
ADAMSCLERK	    ADAMSCLERK
JAMESCLERK	    JAMESCLERK
FORDANALYST	    FORDANALYST
MILLERCLERK	    MILLERCLERK
*/

-- 문자열 기반으로 데이터 결합을 수행하는 함수 CONCAT()
-- 오로지 2개의 문자열만 결합시킬 수 있다.
SELECT '서로' || '배려하며' || '지내자' "COL1"
    , CONCAT('서로', '배려하며', '지내자') "COL2"
FROM DUAL;
--==>> 에러 발생
--     (ORA-00909: invalid number of arguments)

-- 사원명, 직종명, 부서번호
SELECT ENAME || JOB || DEPTNO "COL1"
      ,CONCAT(CONCAT(ENAME, JOB), DEPTNO) "COL2"
FROM EMP;
--==>>
/*
SMITHCLERK20       SMITHCLERK20
ALLENSALESMAN30    ALLENSALESMAN30
WARDSALESMAN30       WARDSALESMAN30
JONESMANAGER20       JONESMANAGER20
MARTINSALESMAN30   MARTINSALESMAN30
BLAKEMANAGER30       BLAKEMANAGER30
CLARKMANAGER10       CLARKMANAGER10
SCOTTANALYST20       SCOTTANALYST20
KINGPRESIDENT10       KINGPRESIDENT10
TURNERSALESMAN30   TURNERSALESMAN30
ADAMSCLERK20       ADAMSCLERK20
JAMESCLERK30       JAMESCLERK30
FORDANALYST20       FORDANALYST20
MILLERCLERK10       MILLERCLERK10
*/

--> 내부적인 형 변환이 일어나며 결합을 수행하게 된다.
--  CONCAT()은 문자열과 문자열을 결합시켜주는 함수이지만
--  내부적으로 숫자나 날짜를 문자로 변환해주는 과정이 포함되어 있다.