NVL(null value) : default 값 지정
여러 개의 행에 하나의 값을 반환
급여가 1000이상인 사원들의 부서별 평균 급여의 반올림 값을 부서번호로 내림차순 정렬해서 출력하기
select deptno,round(avg(sal)) avg_sal
from emp
where sal>=1000
group by deptno
order by avg_sal desc
where :필요없는 row 는 배제시킴
having : 필요없는 그룹을 배제시킴
급여가 2000이상인 사원들의 부서별 평균 급여의 반올림 값을 평균 급여의 반올림 값으로 오름차순 정렬해서 출력하기
select deptno,round(avg(sal)) avg_sal
from emp
where sal>=2000
group by deptno
order by avg_sal
select deptno,job,count(*) result
from emp
group by deptno,job --부서별로 더 세분화 했기에 그룹이 많아질 수 밖에
order by deptno asc
select deptno,avg(sal)
from emp
where sal>=1000
group by deptno
having avg(sal)>=2000 --특정 그룹을 배제시킴
select ename,emp.deptno,dept.deptno,dname
from emp,dept
where emp.deptno = dept.deptno --=>모든 경우에서 남길 행을 생각...
select ename,dname
from emp,dept
where (emp.deptno=dept.deptno) and (sal between 3000 and 5000)
select ename,hiredate,dept.deptno,dname
from emp,dept
where emp.deptno=dept.deptno and dname='ACCOUNTING';
<ANSI 조인>
select ename,hiredate,emp.deptno,dname
from emp
inner join dept on emp.deptno =dept.deptno
where dname='ACCOUNTING';
<테이블 별칭>
select ename,hiredate,d.deptno,dname
from emp e, dept d
where e.deptno = d.deptno and dname='ACCOUNTING'
<일반조인>
select ename,hiredate,dname
from emp e, dept d
where (e.deptno= d.deptno) and (comm is not null);
<anisi 조인>
select ename,hiredate,dname
from emp e
inner join dept d on e.deptno=d.deptno
where comm is not null;
select e.ename,e1.ename
from emp e, emp e1
where e.mgr=e1.empno;
select e.ename,e1.ename
form emp e
join emp e1 on e.mgr=e2.empno;

select (e1.ename|| '의 매니저는 '|| e.ename) info
from emp e
inner join emp e1 on e.empno =e1.mgr;
select e.ename,e1.ename
from emp e, emp e1
where e.mgr =e1.empno(+);
select e.ename,e1.ename
from emp e
left outer join emp e1 on e.mgr=e1.empno;

select e.ename,nvl(e1.ename,'X') ename
from emp e
left outer join emp e1 on e.mgr=e1.empno
select empno, d.deptno, dname
from emp e
join dept d on e.deptno(+)=d.deptno;
select ename,sal,grade
from emp
inner join salgrade on sal between losal and hisal;
select ename,dname,grade
from emp e,dept d,salgrade
where e.deptno=d.deptno
and sal between losal and hisal;
select ename,dname,grade
from emp
join dept on emp.deptno=dept.deptno
join salgrade on sal between losal and hisal;


select dname
from emp
join dept on emp.deptno=dept.deptno
where ename='SMITH';
<서브쿼리>
select dname
from dept
where deptno = (select deptno from emp where ename='SMITH'); -- 단 row가 반드시 하나여야만 한다
select ename,deptno
from emp
where deptno=(select deptno from emp where ename='ALLEN')
select empno,ename,job
from emp
where job =(select job from emp where ename='ALLEN');
SELECT ename, sal
FROM emp
JOIN dept ON emp.deptno = dept.deptno
WHERE emp.deptno = (
SELECT dept.deptno
FROM dept
WHERE dname = 'SALES'
);
select ename,sal
from emp
where deptno=(select deptno from dept where dname='SALES');
교훈: SELECT에서 필요한 값이 특정 테이블에만 있다면, 굳이 JOIN을 사용하지 않아도 된다.
특히, 조건만 다른 테이블에서 가져올 수 있다면 서브쿼리를 사용하여 원하는 조건을 설정하고, 데이터를 직접 가져오는 것이 더 간단하고 효율적
한 번에 모두 관리하면 데이터 관리의 효율성이 떨어짐
(변경, 메모리 과다 등...) ==>join이 나온 이유
(velog의 복수행 설명+코드 실행)
부서명이 'ACCOUNTING' 인 사원의 이름, 입사일, 부서번호,부서명을 출력하기
select dname # 부서명만 대표할 수 있는 것만 조회할 수 있다!
from emp e,dept d
where e.deptno=d.deptno
group by dname
having dname='ACCOUNTING';
->group by를 묶는 기준에
dname으로 그룹을 묶었기에 select에는 dname과 dname을 대표하는 sum, sal,count와 같은 집계함수만 나올 수 있음!
함수를 바라보는 관점? 함수가 반환하는 값으로 대체
오라클에서 함수 안에 값 전달이 없으면 아예 괄호를 생략
식별자(테이블명, 칼럼명, 계정명, 시퀀스명...)은 대소문자를 가리지 않음
DB에서 데이터를 잘 뽑아야지 아니면 프로그래밍 언어에서 처리해야 함
where :필요없는 row 는 배제시킴
having : 필요없는 그룹을 배제시킴