1. JOIN (이어서)
- key를 통해서 테이블끼리 관계를 맺을 수 있다. (1:1, 1:N, N:N)
- 조인의 종류 : EQUI JOIN, NON-EQUI JOIN, SELF JOIN, OUTER JOIN
1-1. EQUI JOIN
조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 기법이다.
- select * from emp, dept;
- select * from emp, dept where emp.deptno = dept.deptno;
-
select ename, job, loc from emp, dept where emp.deptno = dept.deptno and job='SALESMAN';
-
select ename, job, loc from emp e, dept d where e.deptno = d.deptno and e.job='SALESMAN';
(테이블에도 별칭 접근자를 줄 수 있다)
1-2. NON-EQUI JOIN
동일 컬럼이 없이 다른 조건을 사용하여 조인 할 때 쓰인다.
- SALGRADE 테이블 (EMP 테이블과 동일한 컬럼 키는 없지만, SAL과 관련이 있는 테이블)
- 1등급 : 최저연봉 700 ~ 최고연봉 1200
- 2등급 : 최저연봉 1201 ~ 최고연봉 1400
- 3등급 : 최저연봉 1401 ~ 최고연봉 2000
- 4등급 : 최저연봉 2001 ~ 최고연봉 3000
- 5등급 : 최저연봉 3001 ~ 최고연봉 9999
-
select * from emp, salgrade; (카테이션 곱 형태로 출력 / 12 x 5 = 60)
-
select * from emp, salgrade where sal between losal and hisal; (12명의 sal 기준에 맞게 출력)
-
select ename, sal, grade from emp, salgrade where sal between losal and hisal;
- select e.ename, d.dname, s.grade from emp e, dept d, salgrade s where e.deptno = d.deptno and e.sal between s.losal and s.hisal;
(emp, dept, salgrade를 조인 > 사원 이름, 부서 이름, 급여 등급 출력)
1-3. SELF JOIN
자기 자신과 조인하기
- SMITH의 MANAGER : 7902 FORD
- ALLEN의 MANAGER : 7698 BLAKE
같은 테이블을 불러오되, 이름을 다르게 해서 불러온다.
조건을 맞춘 다음 원하는 컬럼을 빼온다.
- select * from emp;
- select * from emp e, emp m; (다른 이름을 주지 않고 emp, emp로 적으면 Error)
- select * from emp e, emp m where e.mgr = m.empno;
(e의 매니저번호와 m의 사원번호가 같은 것을 불러온다.)
- select e.empno, e.ename, e.mgr, m.empno, m.ename from emp e, emp m where e.mgr = m.empno;
(e의 사원 번호, 이름, 매니저 번호 / m의 사원번호, 이름 출력)
- select e.ename, m.ename from emp e, emp m where e.mgr = m.empno;
(원하는 것만 빼온다. > 사원 이름, 매니저 이름)
- select e.ename "사원", m.ename "매니저" from emp e, emp m where e.mgr = m.empno;
2. 서브 쿼리
서브 쿼리 : 쿼리 안의 쿼리
2-1. 단일행 서브 쿼리
- select ename from emp; (사원의 이름을 뽑는다)
- select mgr from emp where ename='SMITH' (사원 이름이 스미스인 매니저번호)
- select ename from emp where empno=(select mgr from emp where ename='SMITH');(사원번호가 스미스인 매니저번호를 사원번호로 하는 사원의 이름)
- select avg(sal) from emp; (-- 평균 급여 : 2077)
- select * from emp where sal > (select avg(sal) from emp);
- select ename, sal from emp where sal > (select avg(sal) from emp);
- select sal from emp where ename = 'SMITH'; (스미스의 급여)
- select ename, sal from emp where where sal>=(select sal from emp where ename = 'SMITH'); (스미스보다 급여를 같거나 더 많이 받는 사람들의 이름과 급여)
- select deptno from emp where ename = 'ALLEN'; (ALLEN의 부서번호)
- select loc from dept; (DEPT 테이블의 위치)
- select loc from dept where deptno = (select deptno from emp where ename='ALLEN'); (ALLEN의 부서번호와 같은 번호를 DEPT에서 찾고, 그 곳의 위치를 출력한다)
2-2. 다중행 서브 쿼리
- select distinct deptno from emp where sal >= 3000
(급여가 3000 이상인 deptno / 중복 X) >> 10, 20
- select ename, sal, deptno from emp where deptno = (select distinct deptno from emp where sal >= 3000)
급여가 3000 이상인 부서에 소속된 사람, 급여, 부서번호
한 줄에 2개 이상의 리턴값이 발생하여 Error!
- select ename, sal, deptno from emp where deptno in (select distinct deptno from emp where sal >= 3000);
(deptno가 10, 20인 사람 출력하기)
-
select sal from emp where deptno = 30;
(부서번호가 30인 곳의 sal : 1600, 1250, 1250, 2850, 1500, 950)
-
any (select sal from emp where deptno = 30) = 950 (최소값)
-
select ename, sal from emp where sal > any (select sal from emp where deptno = 30);(950보다 큰 sal을 가진 사원과 급여)