DB 3일 (23.03.23)

Jane·2023년 3월 23일
0

IT 수업 정리

목록 보기
83/124

1. JOIN (이어서)

  • Key : 내용 중복이 안되는 컬럼 (같은 것이 존재하면 안된다, 무결성)

  • 존재하는 부서번호만 사용할 수 있다.

  • 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을 가진 사원과 급여)

profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글