저번 시간에 이어 나머지 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';
## 날짜 출력 포맷
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 기능 매우 많다. 아직 부술게 좀 더 남았다. 다음 포스팅때 나머지를 마저 부셔보자.
도움이 되셨다면 공감눌러주시고 궁금한점 있으시면 댓글 남겨주세요~
'프로그래밍 > Database' 카테고리의 다른 글
데이터베이스 모델링과 회원가입 설계 (0) | 2017.03.26 |
---|---|
Oracle 데이터베이스 Select문 완전정복 -(3) (0) | 2017.03.24 |
Oracle 데이터베이스 Select문 완전정복 -(1) (0) | 2017.03.22 |
관계형 데이터베이스 와 Relational Algebra (0) | 2017.03.15 |
PreparedStatement의 사용법 (0) | 2017.01.19 |