본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] 3일차ⓒ LIKE + 『%』『_』ESCAPE COMMIT ROLLBACK ORDER BY(ASC, DESC) CONCAT()

-- ○ 추가 실습 테이블 구성 TBL_SAWON

CREATE TABLE TBL_SAWON
(SANO   NUMBER(4)
,SANAME VARCHAR(30)
,JUBUN  CHAR(13)
,HIREDATE DATE  DEFAULT SYSDATE
,SAL    NUMBER(10)
);
--==>>Table TBL_SAWON이(가) 생성되었습니다.


SELECT *
FROM TBL_SAWON;

DESC TBL_SAWON;

/*

이름       널? 유형           
-------- -- ------------ 
SANO        NUMBER(4)    
SANAME      VARCHAR2(30) 
JUBUN       CHAR(13)     
HIREDATE    DATE         
SAL         NUMBER(10)   

*/


-- ○ 데이터 입력
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1001,'김가영','9402252234567', TO_DATE('2001-01-03','YYYY-MM-DD'),3000);


INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1002,'김서현','9412272234567', TO_DATE('2010-11-05','YYYY-MM-DD'),2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1003,'김아별','9303082234567', TO_DATE('1999-08-16','YYYY-MM-DD'),5000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1004,'이유림','9609142234567', TO_DATE('2008-02-02','YYYY-MM-DD'),4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1005,'정주희','9712242234567', TO_DATE('2009-07-15','YYYY-MM-DD'),2000);


INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1006,'한혜림','9710062234567', TO_DATE('2009-07-15','YYYY-MM-DD'),2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1007,'이하이','0405064234567', TO_DATE('2010-06-05','YYYY-MM-DD'),1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1008,'아이유','0103254234567', TO_DATE('2012-07-13','YYYY-MM-DD'),3000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1009,'정준이','9804251234567', TO_DATE('2007-07-08','YYYY-MM-DD'),4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1010,'이이제','0204254234567', TO_DATE('2008-12-10','YYYY-MM-DD'),2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1011,'선동열','7505071234567', TO_DATE('1990-10-10','YYYY-MM-DD'),3000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1012,'선우선','9912122234567', TO_DATE('2002-10-10','YYYY-MM-DD'),2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1013,'선우용녀','7101092234567', TO_DATE('1991-11-11','YYYY-MM-DD'),1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1014,'남주혁','0203043234567', TO_DATE('2010-05-05','YYYY-MM-DD'),2000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1015,'남궁선','0512123234567', TO_DATE('2012-08-14','YYYY-MM-DD'),1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN,HIREDATE, SAL)
VALUES (1016,'남이','7012121234567', TO_DATE('1990-08-14','YYYY-MM-DD'),2000);



DELETE
FROM TBL_SAWON
WHERE SANAME='스펀지밥';
--==>1 행 이(가) 삭제되었습니다.

SELECT *
FROM TBL_SAWON;


/*
1002	김서현	9412272234567	2010-11-05	2000
1003	김아별	9303082234567	1999-08-16	5000
1004	이유림	9609142234567	2008-02-02	4000
1005	정주희	9712242234567	2009-07-15	2000
1006	한혜림	9710062234567	2009-07-15	2000
1007	이하이	0405064234567	2010-06-05	1000
1008	아이유	0103254234567	2012-07-13	3000
1009	정준이	9804251234567	2007-07-08	4000
1010	이이제	0204254234567	2008-12-10	2000
1011	선동열	7505071234567	1990-10-10	3000
1012	선우선	9912122234567	2002-10-10	2000
1013	선우용녀	7101092234567	1991-11-11	1000
1014	남주혁	0203043234567	2010-05-05	2000
1015	남궁선	0512123234567	2012-08-14	1000
1016	남이	7012121234567	1990-08-14	2000
1001	김가영	9402252234567	2001-01-03	3000
*/

COMMIT;


--==>> 커밋 완료.
--○TBL_SAWON 테이블에서 김가영 사원의 정보를 모두 조회한다,
SELECT *
FROM TBL_SAWON
WHERE SANAME='김가영';
--==>>1001	김가영	9402252234567	2001-01-03	3000


SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '김가영';

--1001	김가영	9402252234567	2001-01-03	3000

-- ※ ~와 같이 라는 부사로 쓰인 LIKE ★★

--※ WILD CARD(CHARACTER) → % 

-- LIKE 와 함께 사용되는 % 는 모든 글자를 의미한다. 

--LIKE 와 함께 사용되는 _(언더스코어) 는 아무 글자1 개를 의미한다. 

-- ○ TBL_SAWON 테이블에서 성씨가 『이 씨인 사원의
-- 사원명, 주민번호, 급여 항목을 조회한다.
SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON
WHERE SANAME = '이';
--===>> 조회 결과 없음




SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '이__';
--==>> 조회 결과 없음





SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이__';

/*
이유림	9609142234567	4000
이하이	0405064234567	1000
이이제	0204254234567	2000
*/


SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이_';

--==>> 조회 결과 없음

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';

/*
이유림	9609142234567	4000
이하이	0405064234567	1000
이이제	0204254234567	2000*/

--TBL_SAWON 테이블에서 이름의 마지막 글자가 림 으로 끝나는 사원의
-- 사원명, 주민번호, 입사일 급여 항목을 조회한다.
SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
WHERE SANAME LIKE '%림';   --> 또는 '__림' 그런데 이름이 세글자가 아닐수도 있으니까,,,


SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
WHERE SANAME LIKE '__림';
/*--==>>
이유림	9609142234567	2008-02-02	4000
한혜림	9710062234567	2009-07-15	2000
*/

-- TBL_SAWON 테이블에서 이름의 두 번째 글자가 '이'인 사원의
-- 사원명, 주민먼호, 입사일, 급여 항목을 조회한다.


-- SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
--FROM TBL_SAWON
--WHERE 이름의 두 번째 글자가 '이'

SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
WHERE SANAME LIKE '_이%';
/*
아이유	0103254234567	2012-07-13	3000
이이제	0204254234567	2008-12-10	2000
남이	7012121234567	1990-08-14	2000
*/
-- TBL_SAWON 테이블에서 이름에 '이'라는 글자가 하나라고 포함되어 있으면 그 사원의
-- 사원명, 주민먼호, 입사이르 급여 항목을 조회한다.
SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
--WHERE 이름에 '이'라는 글자가 하나라고 포함
WHERE SANAME LIKE '%이%';

/*
이유림	9609142234567	2008-02-02	4000
이하이	0405064234567	2010-06-05	1000
아이유	0103254234567	2012-07-13	3000
정준이	9804251234567	2007-07-08	4000
이이제	0204254234567	2008-12-10	2000
남이	    7012121234567	1990-08-14	2000*/



-- ○TBL_SAWON 테이블에서 이름에 '이'라는 글자가 연속으로 두 번 \ 포함되어 있으면 그 사원의
-- 사원명, 주민먼호, 입사일, 급여 항목을 조회한다.

SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
--WHERE 이름에 '이'라는 글자가 연속으로 두 번 포함
WHERE SANAME LIKE '%이이%';
--==>>이이제	0204254234567	2008-12-10	200

-- ○TBL_SAWON 테이블에서 이름에 '이'라는 글자가 두 번 포함되어 있으면
--(위처럼 연속 x) 그 사원의 사원명, 주민번호, 입사일 급여 항목을 조회한다.


SELECT SANAME "사원명", JUBUN "주민번호", HIREDATE "입사일", SAL "급여"
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
/*
이하이	0405064234567	2010-06-05	1000
이이제	0204254234567	2008-12-10	2000*/


--○ TBL_SAWON 테이블에서 성씨가 남씨인 사원의 
-- 사원명, 주민번호, 급여 항목을 조회한다.
SELECT SANAME "사원명", JUBUN "주민번호",  SAL "급여"
FROM TBL_SAWON
WHERE SANAME LIKE '남%';

/*남주혁	0203043234567	2000
남궁선	0512123234567	1000
남이	7012121234567	20008*/

-- ※ 데이터 베이스 설계 시 성과 이름을 분리해서 처리해야 할 업무
-- 계획이 있다면(지금 당장은 아니더라도)
-- 테이블에서 성 컬럼과 이름 컬럼을 분리하여 구성해야 한다. 

-- ○ TBL_ SAWON 테이블에서 여직원들의 사원명, 주민번호, 급여 항목을 조회한다.
SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE JUBUN LIKE '______2%' OR JUBUN LIKE '______4%';
/*김서현	9412272234567	2000
김아별	9303082234567	5000
이유림	9609142234567	4000
정주희	9712242234567	2000
한혜림	9710062234567	2000
이하이	0405064234567	1000
아이유	0103254234567	3000
이이제	0204254234567	2000
선우선	9912122234567	2000
선우용녀	7101092234567	1000
김가영	9402252234567	3000*/


SELECT SANAME "사원명", JUBUN "주민번호", SAL "급여"
FROM TBL_SAWON
WHERE JUBUN LIKE '______2_______' OR JUBUN LIKE '______4_______';

--==>> 이것도 같은 결과 

 

 

 

 

 

 

 

 

 -- ○ 실습 테이블 생성(TBL_WATCH)
 
 CREATE TABLE TBL_WATCH
 (
 WATCH_NAME     VARCHAR2(20)
 , BIGO         VARCHAR2(100)
 
 );
 --==>>
Table TBL_WATCH이(가) 생성되었습니다.
 --○ 데이터 입력
 INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
 VALUES('금시계','순금 99.99% 함유된 최고급 시계');
 INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
 VALUES('은시계','고객 만족도 99.99점을 획득한 시계');
 
 
 SELECT *
 FROM TBL_WATCH;
 
 COMMIT;
 
 
 -- ○ TBL_WATCH 테이블의 BIGO 컬럼에 99.99& 라는 글자가 들어있는 행(레코드)의 정보를
 -- 조회한다,
 SELECT *
 FROM TBL_WATCH
 WHERE BIGO LIKE '%99.99%%';
 /*
 금시계	순금 99.99% 함유된 최고급 시계
은시계	고객 만족도 99.99점을 획득한 시계
*/
 SELECT *
 FROM TBL_WATCH
 WHERE BIGO LIKE '%99.99\%%' ESCAPE '\'; 
--==>>금시계	순금 99.99% 함유된 최고급 시계


--WIRD CARD 를 탈출시킨다는 의미에서 'ESCAPE'


 SELECT *
 FROM TBL_WATCH
 WHERE BIGO LIKE '%99.99$%%' ESCAPE '$';
--==>>금시계	순금 99.99% 함유된 최고급 시계

-- ※ ESCAPTE 로 정한 문자의 다음 한 글자는 와일드카드(캐릭터)에서 탈출시켜라...
-- ESCAPE '\'

-- 일반적으로 키워드가 아닌, 연산자도 아닌, 사용빈도가 낮은 특수문자(특수기호)를 사용한다.

 

 

 

 

 

 

 

 

 

 

 

 

--■■■ COMMIT /ROLLBACK ■■■

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
*/


-- ○ 데이터 입력
INSERT INTO TBL_DEPT VALUES(50, '개발부','서울'); 

--===>>1 행 이(가) 삽입되었습니다.
--최고 약식으로 인서트 구문 작성한 것. 하지만 권장하지는 않는다.
-- 50번...개발부... 서울....
-- 이 데이터는 TBL_DEPT 테이블에 저장???
-- 하드디스크상에 물리적으로 적용되어 저장된 것이 ㅏㅇ니라
--메모리(RAM) 상에 입력된 것이다. 


-- ○ 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울
*/

-- 메모장에 뭐라고 알랄라라랄 이렇게 써놔도 보이기만 하지 저장 안하면 바로 날아간다.
-- 메모리에만 임시로 퍼올려둔 것이지 하드디스크에 저장/기록된 것이 아니다.


-- ○ 롤백
ROLLBACK;

SELECT *
FROM TBL_DEPT;

/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON*/ --50번 개발부 서울은 데이터가 소실되었음(존재X)

-- ○ 다시 입력
INSERT INTO TBL_DEPT VALUES(50,'개발부','서울');
--==>>1 행 이(가) 삽입되었습니다.


--> 메모리상에 입력된 이 데이터를 실제 하드디스크상에 물리적으로 
--저장하기 위해서는 COMMIT 을 수행해야 한다. 

--○ 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울*/

COMMIT;
--==>>커밋 완료.


-- ○ 커밋 이후 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울*/

ROLLBACK;
--===>>롤백 완료.

SELECT *
FROM TBL_DEPT;


--○ 롤백 이후 다시 확인 

/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울*/
--> 롤백(ROLLBACK)을 수행했음에도 불구하고 50번 개발부 서울 의 데이터는 소실
--되지 않았음을 확인


-- ※ COMMIT 을 실행한 이후로 DML(INSERT, UPDATE, DELETE 등...)구문을 통해
-- 변경된 데이터만 취소할 수 있는 것일 뿐
-- DML 명령을 사용한 후 COMMIT 을 하고나서 
-- ROLLBACK 을 실행해봐야 이전 상태로 되돌릴 수 없다. (아무런 소용이 없다.)

--○ 데이터 수정 (TBL_DEPT)
UPDATE TBL_DEPT
SET DNAME='연구부', LOC='경기'
WHERE DEPTNO=50;
--==>>1 행 이(가) 업데이트되었습니다.

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	연구부	경기
*/


-- ○ 롤백
ROLLBACK;
--==>> 롤백 완료.

-- ○ 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울*/


--> 수행을 수행하기 이전 상태로 복원되었음을 확인


-- ○ 데이터 삭제
DELETE
FROM TBL_DEPT
WHERE DEPTNO=50;
--==>>1 행 이(가) 삭제되었습니다.


SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON*/

ROLLBACK;

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울*/
--> 롤백 이후 다시 확인 했을 시 제거되었던 개발부 데이터가 다시 확인된다.

--> 삭제(DELETE) 구문을 수행하기 이전 상태로 복원되었음을 확인.

--트랜젝션을 처리하는 구문이다 TCL(Transaction Control System) 구문에는 
--  COMMIT, ROLLBACK, SAVEPOINT 가 포함된다.
-- COMMIT : 현재 트랜젝션 종료
-- ROLLBACK :  저장되지 않은 모든 데이터 변경 사항을 취소하고 현재 트렌젝션 종료
-- SAVEPOINT : 현재까지의 트렌젝션을 특정 이름으로 지정

 

 

 

 

 

 

 

 

 

 

 

 

--■■■■ 정렬 (ORDERED BY) ■■■■
SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
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 TBL_EMP
ORDER BY DEPTNO;    
-- ★ ASC 생략해도 저절로 오름차순 정렬된다.



SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
ORDER BY 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*/

-- ★ DESCRIBE 도 DESCENDING 모두 DESC 으로 표현되지만
-- 오라클은 맥락에 따라 해석한다. 

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
ORDER BY SAL DESC;
/*
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
MILLER	10	CLERK	    1300	15600
WARD	30	SALESMAN	1250	15500
MARTIN	30	SALESMAN	1250	16400
ADAMS	20	CLERK	    1100	13200
JAMES	30	CLERK	    950	    11400*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
ORDER BY 연봉 DESC; --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*/

--> ORDER BY 절보다 SELECT 절이 먼저  처리되기 대문에
--컬럼명 대신 SELECT 절에서 사용한 ALIAS(별칭)DMF
--ORDER BY 절에서 사용해도 문제가 발생하지 않는다.(가능하다)











-->> ALIAS에 공백이 있는 경우
SELECT ENAME "사원명", DEPTNO "부서 번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
ORDER BY 부서 번호 DESC; 
--==>> 오류



SELECT ENAME "사원명", DEPTNO "부서 번호", JOB "직종", SAL "급여"
, SAL*12+NVL(COMM,0) "연봉"
FROM TBL_EMP
ORDER BY "부서 번호" 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 TBL_EMP
ORDER BY 2;

--==>> 두 번째 컬럼(SELECT 에서 언급한 순서) 기준 오름차순
/*
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*/
--> TBL_EMP 테이블이 갖고 있는 테이블의 고유한 컬럼 순서가 아니라
--SELECT 처리 되는 두 번째 컬럼(즉, DEPTNO)을 기준으로 정렬되는 것을 확인
--ASC 생략된 상태 → 오름차순 정렬되는 것을 확인

SELECT ENAME,DEPTNO, JOB, SAL
FROM TBL_EMP
ORDER BY 2,4; -- 2컬럼으로 1차 정렬, SAL 로 2차 정렬

/*
MILLER	10	CLERK		1300
CLARK	10	MANAGER		2450
KING	10	PRESIDENT	5000
SMITH	20	CLERK		800
ADAMS	20	CLERK		1100
JONES	20	MANAGER		2975
SCOTT	20	ANALYST		3000
FORD	20	ANALYST		3000
JAMES	30	CLERK		950
MARTIN	30	SALESMAN	1250
WARD	30	SALESMAN	1250
TURNER	30	SALESMAN	1500
ALLEN	30	SALESMAN	1600
BLAKE	30	MANAGER		2850
*/

SELECT ENAME,DEPTNO, JOB, SAL
FROM TBL_EMP
ORDER BY 2,3,4 DESC; 
--> ⓐ DEPTNO(부서번호) 기준 오름차순 정렬
--> ⓑ JOB 기준 오름차순 정렬
--> ⓒ SAL 기준 내림차순 정렬 (총 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() → 문자열 결합 함수

SELECT '스펀지밥' || ' 그리고 뚱이'
,CONCAT('진주','다람이')
FROM DUAL;

--==>>스펀지밥 그리고 뚱이/	진주다람이

SELECT ENAME || JOB "1"
, CONCAT(ENAME,JOB) "2"
FROM TBL_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*/


SELECT ENAME || JOB || DEPTNO "1"
,CONCAT(ENAME,JOB,DEPTNO)
FROM TBL_EMP;
--==>>"invalid number of arguments" 오류발생

--> 두 개의 문자열을 결합시켜주는 기능을 가진 함수이며
--> 오로지 2개만 결합시킬 수 있다. 

SELECT ENAME || JOB || DEPTNO "1"
,   CONCAT(CONCAT(ENAME,JOB),DEPTNO) "2"
FROM TBL_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() 은 문자열과 문자열을 대상으로 결합을 수행하는 함수이지만
-- 내부적으로는 숫자나 날짜를 문자 타입으로 바꾸어주는 과정이 포함되어 있다.

--==========================================================


--- JAVA 의 String.subString(n,m)


--○ SUBSTR() / SUBSTRB() → 문자열 추출 함수
     ------      -----
--    개수기반     바이트기반     
SELECT ENAME "1"
        , SUBSTR(ENAME, 1, 2) "2"
        , SUBSTR(ENAME, 2, 2) "3"
        , SUBSTR(ENAME, 3, 3) "4"
        ,SUBSTR (ENAME, 2) "5"
FROM TBL_EMP;
/*
SMITH	SM	MI	ITH	MITH
ALLEN	AL	LL	LEN	LLEN
WARD	WA	AR	RD	ARD
JONES	JO	ON	NES	ONES
MARTIN	MA	AR	RTI	ARTIN
BLAKE	BL	LA	AKE	LAKE
CLARK	CL	LA	ARK	LARK
SCOTT	SC	CO	OTT	COTT
KING	KI	IN	NG	ING
TURNER	TU	UR	RNE	URNER
ADAMS	AD	DA	AMS	DAMS
JAMES	JA	AM	MES	AMES*/

-- 주의할점 ★인덱스가 1부터 시작한다는 점 그리고 ★1부터 2개 라는 점
-- 이 자바와 다르다. 


-- SUBSTR()문자열을 추출하는 기능을 가진 함수
-- 첫 번재 파라미터 값은 대상 문자열 (추출 대상)
-- 두 번째 파라미터 값은 추출을 시작하는 위치(이 때 인덱스는 1부터 시작)
-- 세 번째 파라미터 값은 추출할 문자열의 갯수(생략 시 시작위치부터 끝까지)

-- ○ TBL_SAWON 테이블에서 성별이 남성인 사원만 
-- 사원번호, 사원명, 주민번호 , 급여 항목을 조회한다.
--  단, SUBSTR() 함수를 사용할 수 있도록 하며.
-- 급여 기준으로 내림차순 정렬을 수행할 수 있도록 한다.

SELECT *
FROM TBL_SAWON;


SELECT SANO "사원번호", SANAME "사원명", JUBUN "주민번호" , SAL "급여"
FROM TBL_SAWON
WHERE SUBSTR(JUBUN,7,1)='1' OR SUBSTR(JUBUN,7,1)='3'
ORDER BY SAL DESC;
/*
1009	    정준이		9804251234567	4000
1011	    선동열		7505071234567	3000
1016	    남이  	7012121234567	2000
1014	    남주혁		0203043234567	2000
1015	    남궁선		0512123234567   1000*/

--★ 형변환 꼭하기!!!!!