데이터베이스화 : (업무 -> 프로그램화 : ERP)
ERP
insert / update / delete
Extended ERP
select
모르는 데이터베이스가 있을때
select * from 테이블명; (사용x)
->
desc 테이블명;
select count() from 테이블명;
select 컬럼명 ... from 테이블명 limit 5;
if(1 = 2, '참', '거짓') : true면 참, false면 거짓을 출력
ifnull(a, b) : a가 null이면 b를 출력, 그렇지 않다면 a출력
ex) 사원정보에서 사원번호, 사원명, 월급, 보너스, 연봉 출력
select empno, ename, sal, comm, truncate( sal*12+ifnull(comm, 0), 0) mm
from emp
where deptno = 30;

case 구문
select case 3
when 1 then 'one'
when 2 then 'two'
else 'more'
end;
ex) 사원정보에 사원번호, 사원명, 직책을 출력
select empno, ename,
case job
when 'cleck' then '사원'
when 'analyst' then '분석'
when 'manager' then '관리'
when 'president' then '대표'
else '영업'
end 'job'
from emp;

ex) 사원정보에서 사원번호, 사원명, 부서번호, 부서명을 출력
select empno, ename, deptno,
case deptno
when 10 then '회계'
when 20 then '조사'
when 30 then '영업'
else '총무'
end 'dname'
from emp;

ex) 사원정보에서 사원번호, 사원명, 현재급여, 인상급여를 출력
select empno, ename, job, sal '현재급여',
case deptno
when 10 then sal*1.1
when 20 then sal*1.2
when 30 then sal*1.3
else sal
end '인상급여'
from emp;

count

-> null은 포함하지 않기 때문에 결과 값이 다르다

=> 전체데이터 (*)로 조회하는게 편하다.
max/min
!그룹함수와 일반내용은 같이 사용x

sum
select sum(컬럼명) from 테이블명;

avg
select avg(컬럼명) from 테이블명;
!계산 시 null은 빼고 계산함.


-> ifnull을 사용하면 같은 값을 출력할 수 있다

그룹화 (group by)
group by 안에는 order by가 내장되어 있어 자동정렬 출력이 된다
where절 다음에는 그룹화함수 사용불가
select deptno, count(*) from emp group by deptno;
그룹화를 하면 컬럼절에 쓸 수 있다.
ex) 부서별 최대 급여

ex) 직책별 평균 급여

ex)같은 부서의 직책별 급여합계

ex)같은 부서의 직책별 급여 중 2000 이상

-> where절 뒤에는 그룹화함수 사용불가

-> having을 사용

ex)부서별 인원수 6명 이상인 부서번호, 부서이름, 인원수(emp의 행의 개수) 출력 -> 문제가 이상함
select deptno, dname, (select count(deptno) from emp group by deptno having count(deptno) >=6) '인원수'
from dept
where deptno = (select deptno from emp group by deptno having count(deptno) >=6);
단일행 - 1행 1열의 결과를 가지고 다시 쿼리
비교 연산자만 사용 가능
ex) 최고 급여를 받는 사원 정보(이름, 급여) 출력
최고 급여 -> 그 급여를 받는 사원
ex) scott의 급여보다 많은 사원 정보 출력
scott의 급여 -> 그 급여('scott')보다 많은 사원
ex) 부서별 최고급여를 받는 사원 정보
부서별 최고급여 -> 그 급여를 받는 사원
복수행 - 다행 1열의 결과를 가지고 다시 쿼리
ex) 부서별 최고급여를 받는 사원 정보
부서별 최고급여 -> 그 급여를 받는 사원
ex) 20번 부서의 사원이 속한 직책과 같은 사원들의 정보
> Any / < Any / > ALL / < ALL
하나라도 만족
킬럼명 <ANY : < 비교값의 최대값 보다 작은 칼럼값을 출력
칼럼명 >ANY : > 비교값의 최소값 보다 큰 칼럼값을 출력
모든 조건에 만족
칼럼명 <All : < 비교값의 최소값 보다 작은 값 출력
칼럼명 >ALL : > 비교값의 최대값 보다 큰 값 출력
ex) 직책이 manager중 최고급여를 받는 manager 보다 급여가 큰 사원에 대한 정보
직책이 manager 사원들의 급여 -> 이 급여보다 큰 사원
ex) 각 부서의 전체 평균 급여보다 적은 급여를 받는 사원들에 대한 정보 출력
equi join
: 두 개의 테이블 간에 칼럼 값들이 서로 일치할 경우 사용
두 개의 테이블을 결합해서 출력하는것
같은 컬럼만 출력
10인 컬럼만 출력
where절 단축 - on()
select e.empno, e.ename, d.dname, d.loc, d.deptno
from emp e inner join dept d
where e.deptno = d.deptno and e.deptno=10;
->
select e.empno, e.ename, d.dname, d.loc, d.deptno
from emp e inner join dept d
on( e.deptno = d.deptno)
where e.deptno = 10;
ex) 직책이 cleck인 사원에 대한 사원번호, 사원이름, 급여, 부서이름, 부서위치 출력
non-equi join
: 두 개의 테이블 간에 칼럼 값들이 서로 일치하지 않을 경우

on( e.sal between s.losal and s.hisal) 로 써도 된다.
ex) 입사년도가 2011년인 사원에 대한 사원번호, 사원이름, 급여, 급여등급 출력
n개이상테이블 결합


outer join - 한 쪽 정보는 완전히 출력, 나머지는 연결만 해준다 -> null이 발생(연결되지 않은정보)
right outer join (오른쪽을 중심으로 왼쪽을 연결)
left outer join (왼쪽을 중심으로 오른쪽을 연결)
full outer join


ex) 사원이 없는 부서
self join
한 테이블 내부에 조인한다
self join 안에서 inner/outer join을 사용할 수 있다


클래스와 객체 217p