- 변경에 대처하기 힘들기 때문에 중복해서 만들지 않고, 연관관계를 가지게 테이블을 두 개로 만든다.
- 다른 테이블을 참조하는 키: Fk
- 내 테이블에서 행을 유일하게 결정하는 키: Pk
내부에 있는 코드를 먼저 실행해서 확인하기
Subquery (where)
Ex. DALLAS에 사는 직원을 출력하기
-- 스키마 확인
select *
from emp;
select *
from dept;
-- DALLAS에 사는 직원 확인
select *
from emp
where deptno = 20;
-- dept 테이블에서 DALLAS의 deptno 확인
select deptno
from dept
where loc = 'DALLAS'; -- 20 = DALLAS
-- 20자리에 select 절 삽입
select *
from emp
where deptno = (select deptno
from dept
where loc = 'DALLAS');
Ex. sal의 값이 최소인 사람 출력하기
-- emp 테이블에서 sal의 최솟값만 확인
select min(sal)
from emp;
-- emp 테이블에서 sal의 최솟값인 row 출력
select *
from emp
where sal in (select min(sal)
from emp);
Ex. sal의 값이 1200보다 작은 사람 출력하기
-- emp 테이블에서 sal이 1200보다 작은 값만 확인
select sal
from emp where sal < 1200;
-- emp 테이블에서 sal이 1200보다 작은 row 출력
select *
from emp
where sal in (select sal
from emp where sal < 1200);
Ex. RESEARCH부서의 직원을 출력하기
-- 스키마 확인
select *
from emp;
select *
from dept;
-- dept 테이블에서 deptno가 20인 row 확인
select *
from dept
where deptno = 20;
-- dept 테이블에서 RESEARCH의 deptno 확인
select deptno
from dept
where dname = 'RESEARCH'; -- 20 = RESEARCH
-- where에 dept 테이블에서 RESEARCH의 deptno 확인한 절 삽입
select *
from emp
where deptno = (select deptno
from dept
where dname = 'RESEARCH');
Inline view
select ename, sal*12 '연봉'
from emp
where 연봉 = 9600; -- where이 먼저 실행되서 '연봉'과 매칭 안되므로 실행되지 않는다
Ex. 연봉이 9600인 사람 출력하기
-- name, sal*12 연산된 테이블 확인
select ename, sal*12 '연봉'
from emp;
-- From에 name, sal*12 연산된 테이블 절 삽입
select e.*
from (
select ename, sal*12 '연봉'
from emp
)e -- From 절은 테이블 별칭이 필요하다
where e.연봉 = 9600;
Ex. sal 평균이 2000 미만인 부서
-- 그룹핑으로 deptno별 평균계산
select avg(sal) 'avg_sal' -- 소문자로 적고 띄어쓰기는 _로 함
from emp
group by deptno;
-- From에 그룹핑으로 deptno별 평균계산한 절 삽입
select *
from
(select avg(sal) 'avg_sal'
from emp
group by deptno
) e
where e.avg_sal < 2000;
select avg(sal), if(2000<=sal, "고액","소액") grade
from emp
group by grade;
select *
from
(
select avg(sal), if(2000<=sal, "고액","소액") grade
from emp -- 인라인 뷰 (가상 테이블_연산해서 나온 결과)
);
Scala Subquery
Ex. 부서별 직원수 뽑기
-- 스키마 확인
select *
from dept;
-- 정렬된 스키마 확인
select *
from emp
order by deptno;
-- 별칭 'd' / dept 스키마 '직원수' 컬럼에 1 넣어보기
select d.deptno,d.dname,d.loc, 1 '직원수'
from dept d;
-- deptno 컬럼의 갯수 확인
select count(*)
from emp
where deptno = 10; -- 10 = d.deptno
-- 1 자리에 Select 절 삽입 (컬럼의 갯수를 확인한 절)
select d.deptno,d.dname,d.loc, (select count(*)
from emp
where deptno = d.deptno) '직원수'
from dept d;
Share article