프로그래밍/Database

Oracle 데이터베이스 Select문 완전정복 -(3)

Jay22 2017. 3. 24. 17:36
반응형

지난 포스팅에 이어 select를 마저 부셔보자.



## ORDER BY


SELECT ename, comm FROM emp ORDER BY comm; 


comm을 오름차순으로 정렬한다. 여기서 null값은 후방에 나온다.






 SELECT ename, comm FROM emp ORDER BY comm DESC;


comm을 내림차순으로 정렬한다. 여기서는 null이 먼저 튀어나온다.




# 급여가 제일 많은 사원부터 출력해보자.


SELECT ename, sal FROM emp ORDER BY sal DESC;


자 그런데 저기 노란부분이 좀 거슬린다. 급여가 같아서 모여있는건 맞는데 알파벳 순이 안 맞네. 이것도 이름순으로 정렬하고 싶다.




SELECT ename, sal FROM emp ORDER BY sal DESC ,ename;


이름순으로 정렬하자.




## FLOOR CEIL TRUNC ROUND


 SELECT FLOOR(45.925), CEIL(45.925) FROM dual;


실행 결과만 보자.

버림해당 값보다 작은수 중 가장 큰 정수(버림)과 올림 해당 값보다 큰수중 가장 작은 정수(올림)




SELECT TRUNC(45.925), ROUND(45.925) FROM dual;


버림과 반올림



## 문자열 함수


SELECT CONCAT('Oracle','DBMS'), INITCAP('Oracle DBMS'),

LOWER('Oracle DBMS'), UPPER('Oracle DBMS')

FROM dual;


concat은 붙이는 기능을 하고 initcap은 문자가 드는 매개변수로 들어오는 char의 첫 문자는 대문자로, 나머지는 소문자로 반환하는 함수이다.




# LPAD라고 문자열을 조작하는 함수가 있다. 쌍으로 RPAD도 같이 있는데 사용법과 결과물을 보자.


SELECT LPAD('Oracle DBMS', 13, 'x'), RPAD('Oracle DBMS', 13, 'x') FROM dual;



사용법이다. 인자가 3개가 들어가는데 그림을 보면 더 쉽게 이해가 갈 것이다. 재고번호나 상품양식 등록할때 유용하게 쓰이겠다.





참고) SUBSTR() 문자열 잘라서 보여주기



LPAD와 RPAD를 우리 테이블에서 응용해보자.



SELECT LPAD(ename, 15)||' '||RPAD( job,20) FROM emp;


양쪽 테이블의 내용을 원하는 길이만큼 각각 설정해서 붙인다.



# TRIM


주어진 문자가 아닌 문자가 나올 때 까지 지운다.


뭔소리지 ??? 


일단 공식 홈피 예제를 보자.


LTRIM('   tech')
Result: 'tech'

LTRIM('   tech', ' ')
Result: 'tech'

LTRIM('000123', '0')
Result: '123'

LTRIM('123123Tech', '123')
Result: 'Tech'

LTRIM('123123Tech123', '123')
Result: 'Tech123'

LTRIM('xyxzyyyTech', 'xyz')
Result: 'Tech'

LTRIM('6372Tech', '0123456789')
Result: 'Tech'

좀 알겠는가? 마지막 예에서는 두 번째 인자로 모든 아라바이숫자를 박았다. 결과적으로 왼쪽(LEFT)에 있는 모든 숫자가 다 날아간다. 조합이 어떻든 계속 돌며 다 지워진다는 뜻이다.


우리 테이블에 적용해보자.


 SELECT ename , LTRIM(ename, 'AB'), RTRIM(ename, 'SR') FROM emp


그냥 ename 사원이름에서 AB 조합 다 지운다. 즉 A도 지우고 B만 있어도 지우고 AB있어도 지우고 ABAABB뭐 이런거 다 지운다.

RTRIM은 LTRIM이랑 대칭이다. 오른쪽에서부터 지워진다고 생각하면 된다.




중간 꿀팁)


DB상의 데이터는 대소문자를 구별한다. 그런데 꺼내서 비교하려는데 대소문자인지 잘 모르겠거나 만약 뒤죽박죽이라면,

대문자 혹은 소문자로 변환시켜서 구분한다.


예를들어 (이건 우리테이블에 없다)

SELECT department_id, department_name FROM departments WHERE department_name = 'SALES';

department_name이 대문자인가..? 


SELECT department_id, department_name FROM departments WHERE UPPER(department_name) = 'SALES'; 


그냥 이렇게 uppercase로 변환시킨 후 비교해버린다.



# 문자열 치환


 SELECT REPLACE('Oracle DB System','DB','Database') FROM dual;



문자열 치환 함수이다. 



# 각 글자 단위로 반환


 SELECT TRANSLATE('Oracle DBMS','ABCD','1234') FROM dual;


A는 1 에 대응되고 B는 2 에 대응되고.. 이런식이다.



# 처음 나오는 위치


SELECT INSTR('Oracle DBMS', 'a') FROM dual;


a가 처음나오는 위치는?


# 문자열의 길이


 SELECT LENGTH('Oracle DBMS') FROM dual;



길이를 구하는 친숙한 함수이다. 공백도 길이에 포함된다.



## DATE 날짜 관련 함수


# 날짜 더하기


 SELECT ADD_MONTHS(sysdate, 5), ADD_MONTHS(sysdate, -5) FROM dual;



현재 날짜 기준으로 과거, 미래시점으로 설정할 수 있다.



# 마지막 날? 

SELECT LAST_DAY('03/01/01'), LAST_DAY('03/02/01') FROM dual; 






해당 월의 의 마지막날을 구할 수 있다.


# 사이에 몇 달이 ? 


SELECT MONTHS_BETWEEN('03/01/01', '03/07/01') FROM dual;


달간격을 구할 수 있다.



# 다음 일요일의 날짜는? 


SELECT NEXT_DAY(sysdate, '일요일') FROM dual; 




# 오늘 날짜


SELECT sysdate FROM dual;






# 오늘 현재 날짜 5일 뒤의 날짜와 5일 전의 날짜를 출력하시오. 


SELECT sysdate + 5, sysdate - 5 FROM dual;




# 이름이 KING인 사원의 근무일수를 출력하시오.


SELECT sysdate - hiredate FROM emp WHERE ename = 'KING';


소숫점밑은 시간이다. 즉 12911일 일했다고 볼 수 있다.



# 근무한 지 200000 시간이 넘은 사원을 출력하시오. 


SELECT ename, (sysdate - hiredate) * 24 FROM emp WHERE (sysdate - hiredate) * 24 > 200000;




# 모든 사원에 대해 근무한 지 몇 주가 지났는지를 출력하시오. 


SELECT (sysdate - hiredate)/7 weeks FROM emp; 


힘들어서 나머지 부분들은 다음에 마저 부셔보겠다.


도움이 되셨다면 공감눌러주시고 궁금한 점 댓글 남겨주세요~

반응형