지난 포스팅에 이어 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;
# 문자열의 길이
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;
힘들어서 나머지 부분들은 다음에 마저 부셔보겠다.
도움이 되셨다면 공감눌러주시고 궁금한 점 댓글 남겨주세요~
'프로그래밍 > Database' 카테고리의 다른 글
[ERD] eXERD 설치와 회원가입 모델링 하는 법 (0) | 2017.03.27 |
---|---|
데이터베이스 모델링과 회원가입 설계 (0) | 2017.03.26 |
Oracle 데이터베이스 Select문 완전정복 -(2) (0) | 2017.03.23 |
Oracle 데이터베이스 Select문 완전정복 -(1) (0) | 2017.03.22 |
관계형 데이터베이스 와 Relational Algebra (0) | 2017.03.15 |