1. 사원 이름과 입사일 출력, 10번 부서 입사일자를 MAY 1981과 1988년 1월 1일 형태로 출력한다.
SELECT ENAME, HIREDATE, TO_CHAR(HIREDATE, 'FMDD MONTH YYYY') T_HIREDATE,
TO_CHAR(HIREDATE, 'YYYY "년" MM"월" DD"일" ') T_KOR FROM EMP
WHERE DEPTNO=10
ORDER BY HIREDATE DESC;
2. 20번부서에서 급여앞에 $를 삽입, 천단위 구분자 표시
사원번호, 이름 ,직업, 봉급, 봉급포맷 출력
SELECT EMPNO, ENAME, JOB, SAL, TO_CHAR(SAL,'$999,999') FROM EMP
WHERE DEPTNO=20;
#원화표시할꺼면 L999,999
3. 현재시간 출력
SELECT TO_CHAR(SYSDATE, 'YY/MM/DD(DAY) HH:MI:SS AM') TEST FROM DUAL;
=>21/05/21(금요일) 09:26:19 오전
SELECT TO_CHAR(SYSDATE, 'WW) A FROM DUAL;
21 (1월 1일부터 WEEK 수)
4.연도 출력
SELECT TO_CHAR( TO_DATE('98','RR'), 'YYYY') TEST1, 1998
TO_CHAR(TO_DATE('05','RR') , 'YYYY') TEST2, 2005
TO_CHAR(TO_DATE('98','YY'), 'YYYY') TEST3, 2098
TO_CHARE(TO_DATE('05','YY), 'YYYY') TEST4 FROM DUAL; 2005
SELECT '000123', TO_NUMBER('000123') FROM DUAL;
-> 000123, 123 출력
#desc table 했는데 너무너무 길게 나오면 set lin 50으로 줄이기
5. DROP TABLE TEST;
CREATE TABLE TEST ( NO NUMBER(4), CH VARCHAR2(4));
DESC TEST;
INSERT INTO TEST VALUES(1,1) ;
SELECT * FROM TEST;
INSERT INTO TEST VALUES('2', 'A');
2. 추가 변환 함수
3. 기타함수
4. 사원이름, 매니저, 매니저가 없으면 "상위관리자" 있으면 "담당자"
SELECT ENAME, MGR, NVL2(MGR, MGR||'담당자', '상위관리자') FROM EMP;
# 짜증나게 여러줄 되면 COL FORMAT A10으로 줄이기. 가장 밑단에 있는 칼럼(=연산으로 길어진것들)
5. 사원이름, 직업, 직업이 'CLERK'인 경우 NULL로 출력
SELECT ENAME, JOB, NULLIF(JOB,'CLERK') RES FROM EMP;
6. 사원이름, 커미션, 연봉, 커미션이 NULL이 아닌경우 커미션을 , NULL이면 연봉을, 전부 NULL 이면 50 출력
(COALESCE : NVL함수를 일반화 시킨 함수)
SELECT ENAME, COMM, SAL, COALESCE(COMM, SAL*12, 50) RES FROM EMP;
7. DECODE
CASE WHEN THEN 으로 바꿔서 출력
:
CASE[대상값] WHEN 비교조건1 THEN 처리1
WHEN 비교조건2 THEN 처리2
ELSE 디폴트처리
END
SELECT ENAME, SAL, CASE WHEN SAL <1000 THEN 'A'
WHEN SAL >= 1000 AND SAL <2500 THEN 'B'
ELSE 'C' END GRADE FROM EMP;
8. GROUP 함수
SELECT MIN(ENAME), MAX(ENAME), MIN(HIREDATE), MAX(HIREDATE) FROM EMP;
9.SALESMAN 대해서 급여평균, 최고, 최저, 합계를 구하라
# ENAME 을 추가했을때 오류 뜨는거 확인
ENAME 은 12ROW 리턴하려고 하고, SAL은 ROW 한개임
10.
SELECT DEPTNO FROM EMP GROUP BY DEPNO ----- SELECT 1st (30, 20, 10으로 셀렉)
ORDER BY DEPTNO ; --------SELET 2nd (10 ,20, 30으로 정렬)
11. 부서별~~ 이라고 하면 group by 사용
직업과 부서별 사원의 기준으로 인원수, 평균급여, 최대급여, 최저급여, 급여의 합을 구하라
SELECT COUNT(*), AVG(SAL), MAX(SAL), MIN(SAL), SUM(SAL) FROM EMP
GROUP BY JOB, DEPTNO;
12. HAVING; 그룹이 생성(행분류) -> 그룹함수 적용-> HAVING 적용
HAVING 절에는 GROUP BY에 참여하는 컬럼이나 AGGREGATE 함수만 가능
부서인원이 4명보다 많은 부서의 부서번호, 인원수, 급여의 합을 리턴하라
SELECT DEPTNO, COUNT(*), SUM(SAL) FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*) >4;
부서별 평균급여중 최대값이 얼마인지 리턴하라
SELECT MAX( AVG(SAL) ) FROM EMP
GROUP BY DEPTNO;
오류나는 이유. HAVING은 잘 모르겠당
BETWEEN AND
OR 대신 IN
LIKE
GROUP BY 별칭
HAVING
TABLE, COL 별칭
CUBE
ROLL UP