📚 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()은 문자열과 문자열을 결합시켜주는 함수이지만
-- 내부적으로 숫자나 날짜를 문자로 변환해주는 과정이 포함되어 있다.