프로그래밍/Database

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

Jay22 2017. 3. 23. 09:58
반응형

저번 시간에 이어 나머지 select문을 다 부셔보자.


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

http://pjh3749.tistory.com/156


중요한 내용들만 썼으니 모두 숙지해야 하는 부분이다.


SELECT job FROM emp;

이거는 결과를 보여주지 않아도 알 것이다. 하지만 여러 job들이 중복해서 나타난다.


중복을 제거하고싶다.


 select distinct job from emp;




각 직업들이 하나씩만 표시되게 나온다.

select distinct deptno,job from emp;

select distinct job,deptno from emp;


이렇게 하면 어떻게 될까?


둘이 깉은 결과가 나온다. distinct가 앞의 것에 걸리는게 아니라 전체에 걸린다. 즉, 2개의 칼럼을 합쳤을 때 중복된 값들을 제거 하여 보여준다.



## SESSION


cf) 현재 데이터 포맷은?



SELECT value FROM nls_session_parameters

WHERE parameter = 'NLS_DATE_FORMAT';





NLS_SESSION_PARAMETER는 각종 세션에 관한 파라미터이다. 나머지를 확인해보자.

select * from nls_session_parameters;







## 날짜 출력 포맷


RR은 Y2K를 고려한 2자리 년도이다. Y2K 는 2000년이 진입한 순간에 전산오류로 버그가 생길것이다라고 하는 문제를 이야기 한다. (밀레니엄 버그)


 ALTER SESSION SET nls_date_format = 'DD-MON-RR'; 


 SELECT empno, ename FROM emp WHERE hiredate >= '01-JAN-82';


ORA-01843: not a valid month


???? 


월 형식이 맞지 않는다고 한다.

 

다시 원복시킨다.


 ALTER SESSION SET nls_date_format = 'RR/MM/DD';


SELECT empno, ename FROM emp WHERE hiredate >= '82/01/01';


정상적으로 나온다.




## ANY / IN 연산자

SELECT dname, loc FROM dept WHERE loc IN ('BOSTON', 'DALLAS'); 

SELECT dname, loc FROM dept WHERE loc =ANY ('BOSTON', 'DALLAS');







30,40 번 부서에 속하지 않는 사원들을 출력하고 싶다.


SELECT ename,deptno FROM emp WHERE deptno NOT IN (30,40);

SELECT ename,deptno FROM emp WHERE deptno <>ALL (30,40); 



DALLAS의 20번 부서, 또는 CHICAGO의 30번 부서를 출력하고 싶다.



SELECT * FROM dept WHERE (deptno,loc) IN ((20,'DALLAS'),(30,'CHICAGO')); 







## BETWEEN, LIKE


급여가 2000에서 3000 사이인 사원을 출력해보자.


SELECT ename, job, sal FROM emp WHERE sal BETWEEN 2000 AND 3000;






이름이 A 로 시작되는 사원을 출력해보자.


 SELECT ename FROM emp WHERE ename LIKE 'A%';


쿼리문과 헷갈리면 안된다. 대소문자 구분한다. A가 아니라 a로 하면 나오지 않는다.



사번이 8번으로 끝나는 사원을 출력해보자.


SELECT empno, ename FROM emp WHERE empno LIKE '%8';



그리고 주의할 점은 like뒤에 싱글quote이다. 더블 quote쓰면 오류난다.



 82년도에 입사한 사원을 출력해보자. 


SELECT ename, hiredate FROM emp WHERE hiredate LIKE '82%';




## IS NULL


첫 번째 포스팅에서 comm이 null인 애들이 있었다. 그것을 제외하고 출력하고 싶다. 즉, 커미션 지급 대상인 직원들을 출력하고 싶다.



 SELECT ename, comm FROM emp WHERE comm IS NOT NULL;




그럼 null인것을 출력하려면?



SELECT ename, comm FROM emp WHERE comm = NULL;



?? 안나오네....




 SELECT ename, comm FROM emp WHERE comm IS NULL; 



된다.

돌려보면 밑에 거는 안된다. 즉 (=를 사용하면 결과가 나오지 않는다. is null을 박아야한다)



## 각종 유용한 질의들


PRESIDENT 를 제외한 사원들의 이름과 직종을 출력해보자.


SELECT ename, job FROM emp WHERE job <> 'PRESIDENT';







직종이 CLERK 인 사원 중에서 급여가 1000 이상인 사원을 출력해보자.


SELECT ename, job, sal FROM emp WHERE job = 'CLERK' AND sal >= 1000; 



10번 부서와 20번 부서에 속한 사원을 출력해보자. 


SELECT ename, deptno FROM emp WHERE deptno = 10 OR deptno = 20;

SELECT ename, deptno FROM emp WHERE deptno IN (10, 20);






10번과 20번 부서에 속하지 않는 사원의 이름과 부서번호를 출력해보자.


SELECT ename, deptno FROM emp WHERE deptno <> 10 AND deptno <> 20;

SELECT ename, deptno FROM emp WHERE deptno NOT IN (10,20); 



급여가 2000에서 3000 사이인 사원을 출력해보자.


SELECT ename, job, sal FROM emp WHERE sal >= 2000 AND sal <= 3000; 

SELECT ename, job, sal FROM emp WHERE sal BETWEEN 2000 AND 3000; 

select 기능 매우 많다. 아직 부술게 좀 더 남았다. 다음 포스팅때 나머지를 마저 부셔보자.


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

반응형