Equi Join = 이꼬르 공통적으로 존재하는 컬럼의값이 일치되는 행을 연결하여 결과 생선
SELECT * FROM EMP, DEPT
WHERE EMP.DEPT = DEPT.DEPTNO;
EMP의 DEPTNO컬럼, DEPT의 DEPTNO컬럼 겹친곳
DEPTNO 겹친곳 찾아서 표시.
이때 EMP지정 해줄때 서로 같은 이름이 있으면 에러가 나기 마련이니 이름도 지정
물론 더 좋은 방법도 있음
NON-EQUI JOIN
특정범위내에서 조사해 다나와
SELECT ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;
근데 위에보면 이름만있고 잡이 뭔지 모른다 젠장
그럼 3개의 테이블을 조인해야할땐 우짤까?? 미치겄네 이거
EMP, DEPT, SALGRADE
서브쿼리
가로안에부터 실행되는건 알쥐
(EMP중에 DEPTNO출력 ' SCOTT'찾아낸다)
DNAME출력한다 DEPT테이블에서 위에서 찾은 DEPTNO를 기준으로
스캇과 같은 부서에서 근무하는 사원의 이름과 부서번호 출력
SCOTT과 동일한 직급을 가진 사원을 출력하는 SQL문
SCOTT과 급여와 동일하거나 더 많이 받는 사원명과 급여를 출력하라
DALLAS에서 근무하는 사원의 이름, 부서번호를 출력해라
SALES(영업부)부서에서 근무하는 모든 사원의 이름과 급여를 출력해보십시오.
자신의 직속상관이 KING인 사원의 이름과 급여를 출력해보십시오.
사원들의 평균급여 내기
SELECT AVG(SAL) FROM EMP;
평균보다 많은 좌
다중행 연산자 중요하다
IN
ANY, SOME
ALL
EXIST
IN | 서브쿼리 결과가 하나라도 일치하면 참 |
ANY, SOME | 하나이상 일치하면 참 |
ALL | 모든값이 일치하면 참 |
EXIST | 만족값이 하나라도 존재하면 참 |
SELECT DISTINCT DEPTNO // DISTINCT 중복값 제거
FROM EMP
WHERE SAL>=3000;
밑에처럼 응용하면 에러난다
SQL> SELECT ENAME, SAL, DEPTNO
2 FROM EMP
3 WHERE DEPTNO =
4 (SELECT DISTINCT DEPTNO FROM EMP WHERE SAL>=3000);
단일연산만된당께
SELECT ENAME, SAL DEPTNO FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM EMP WHERE SAL>=3000);
부서별로 가장 급여를 많이 받느 사원으 정보 출력 in연산자 사용
SQL> SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE SAL IN
2 (SELECT MAX(SAL) FROM EMP);
이건 이 가장 많이 받는사람이고,.......... 부서별로 다시 해
직급(job)이 manager인 사람이 속한 부서의 부서번호와 부서명과 지역 출력
HAVING 은 같은 where절인데 GROUP BY ... 에서만 쓰임
ALL 연산자
30번소속사원중 급여를 가장많이 받는 사원보다 더 많이 받는 사람들의 이름과 급여
30번sal은 원래 2850이다.
헌데 여기서 결과값이 여러개 나오는 쿼리문을 서브쿼리에 >연산자만 사용하면 오류생긴다
SELECT ENAME, SAL FROM EMP WHERE SAL >
( SELECT SAL FROM EMP WHERE DEPTNO=30); // 에러난다
이때 필요한게 > ALL
SELECT ENAME, SAL FROM EMP WHERE SAL > ALL
(SELECT SA LFROM EMP WHERE DEPTNO=30);
영업사원들보다 급여를 많이 받는 사원들의 이름과 급여 직급(담당 업무)를 출력하되 영업사원 출력X
'wif LiNoUz > Oracle,Sql' 카테고리의 다른 글
sql (0) | 2012.10.18 |
---|---|
DW ERD (0) | 2012.10.16 |
2 (0) | 2012.08.15 |
Oracle SQL문 (0) | 2012.08.10 |
Oracle 설치 (0) | 2012.08.09 |