mysql 강좌 7

join
– 둘 이상의 테이블을 서로 연결하여 데이타를 참조하는 방법
※ join의 종류
1. cross join => 연결조건 없이 두개 이상의 테이블 데이타를 무조건 연결하여 검색


2. inner join => 연결조건이 맞는 두개 이상의 테이블 데이타만 연결하여 검색


3. outer join => 연결조건이 맞는 두개 이상의 테이블 데이타를 연결하여 검색하고, 연결조건이 맞지 않는 것은 null로 대체하여 검색한다.


4. self join => 하나의 테이블에 다른 이름을 부여하여 연결  검색


● cross join
-> 연결조건 없이 테이블 연결 검색


형식1)
select 검색대상  from 테이블1,테이블2,…;


ex) select * from person,division;
select pno,pname,dname from person,division;


형식2)
select  검색대상 from person 테이블1 crsoss join 테이블2,,,;
ex) select pno,pname,dname from person cross join division;


● inner join
-> 연결조건이 맞는 데이타만 테이블 연결 검색
형식1)
select 검색대상 from 테이블1,테이블2…where 연결조건;
ex) select pno,pname,dname from person,division where person.dno=division.dno;
where 조건절을 2개 이상 두기가 보기 불편하므로 형식2의 방식으로.


형식2)
select 검색대상 from 테이블1 inner join 테이블2,… on 연결조건;
ex) select pno,pname,dname from person inner join division on person.dno=division.dno;


형식3)
select 검색대상 from 테이블1 inner join 테이블2,… using(필드명);
=> 두 테이블의 연결 조건의 필드명이 같은 경우 사용 가능
ex) select pno,pname,dname from person inner join division using(dno);


문제) person과 division 두개의 테이블을 연결하여 사번,이름,급여,부서,부서번호,부서이름을 검색 출력
mysql> select pno,pname,dno,pay,dname from person inner join division using(dno); => 오류: 검색대상의 dno가 어떤 테이블의 dno인지 구분하지 못하므로 발생


mysql> select pno,pname,pay,person.dno,dname from person inner join division using(dno);
person.dno : person에 있는 dno라는 의미, 또는 division.dno로 명시.
20090112_01.jpg


문제) person과 division 두 개의 테이블을 연결하여 사번,이름,급여,부서번호,부서이름을 검색 출력(테이블 alias 이용)


myslq> select pno,pname,pay,p.dno,dname from person as p inner join division d using(dno);
as : 생략가능
p.dno : 만약 원래 명칭인 person.dno로 적으면 에러.


연결조건을 출력할 경우 어느 테이블의 연결조건으로 출력할 지 결정할 것과 테이블 alias를 이용할 경우 alias로 규정한 이름으로만 검색할 것.


문제) person과 division 두개의 테이블에서 sales 부서에 근무하는 사원의 사번과 이름 검색 출력
mysql> select pno,pname from person inner join division using(dno) where dname=’sales’;


● outer join
-> 연결조건이 맞는 데이타만 테이블 연결 검색하고 연결조건이 맞지 않는 것은 NULL 값으로 검색 출력


형식1)
select 검색대상 from 테이블1 left join 테이블2,… on 연결조건;
select 검색대상 from 테이블1 right join 테이블2,… on 연결조건;
left : 왼쪽에 적은 테이블1 전부 출력. 연결조건이 맞지 않는 것은 NULL로
right : 오른쪽에 적은 테이블2 전부 출력. 연결조건이 맞지 않는 것은 NULL로
ex) select pno,pname,dname from person right join division on person.dno=division.dno;
20090112_02.jpg


형식2)
select 검색대상 from 테이블1 left(right) join 테이블2,… using(필드명);
=> 두 테이블의 연결 조건의 필드명이 같은 경우 사용 가능
ex) select pno,pname,dname from person right join division using(dno);


● self join
-> 하나의 테이블에 이름을 다르게 부여하여 서로 연결 검색 => 테이블 alias 필요
형식)
select 검색대상 from 테이블 별명1 inner join 테이블 별명2,… on 연결조건;


문제) person에서 사원의 번호,이름,급여,관리자이름을 출력하세요
mysql> select pno,pname,pay,manager from person;  => manager에는 사번으로 적혀 있으므로 이름이 아닌 숫자로 나온다.


mysql> select w.pno,w.pname,w.pay,m.pname from person w inner join person m on w.manager=m.pno;
mysql> select w.pno,w.pname,w.pay,m.pname manager from person w inner join person m on w.manager=m.pno;
20090112_03.jpg


Sub Query
– select, insert, update, delete문 또는 다른 SubQuery 안에 들어가 있는 select문을 말한다. 중첩된 select문이라는 뜻으로 nested select 라고도 한다.
mysql에서는 아직 update와 delete에서는 사용하지 못한다.


형식)
select 검색대상 from 테이블명 where 필드명 연산자(select 필드명 from 테이블명);


SubQuery 규칙
1) 모든 서브쿼리는 ( )안에 작성한다
2) 서브쿼리안에 서브쿼리가 들어 갈 수 있다. =>mysql은 현재 안된다.
3) 서브쿼리에서 검색한 필드를 주쿼리에서 사용해야 된다.
4) 서브쿼리의 결과가 하나인 경우 비교연산자를 이용하며 여러개인 경우 NOT 또는 IN,>ANY, <ANY, >ALL, <ALL 연산자를 사용한다.


SubQuery의 종류
1) 단일행 서브 쿼리 => 서브쿼리의 결과가 1개의 데이타인 경우


문제) 사원의 이름이 ‘johnson’인 사원보다 급여를 많이 받는 사원의 사번,이름,급여를 검색
mysql> select pay from person where pname=’johnson’;
mysql> select pno,pname,pay from person where pay>3550;
=>SubQuery를 사용한 경우
mysql> select pno,pname,pay from person where  pay>(select pay from person where pname=’johnson’);
20090112_04.jpg


문제) 사번이 1114인 사원과 동일한 업무를 하고 있는 사원의 사번, 이름, 업무를 검색 출력
mysql> select pno,pname,job from person where job=(select job from person where pno=1114) && pno !=1114;
20090112_05.jpg


문제) 급여를 가장 적게 받는 사원의 사번,이름,급여를 검색하여 출력
mysql> select pno,pname,pay from person where pay=(select min(pay) from person);


문제) 가장 최근에 입사한 사원의 사번,이름,입사일를 검색하여 출력
mysql> select pno,pname,startdate from person where startdate=(select max(startdate) from person);


문제) 20번 부서에 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원의 사번,이름,급여를 검색하여 출력
mysql> select pno,pname,pay from person where pay>(select max(pay) from person where dno=20);


문제) 업무가 manager인 사원의 평균급여보다 많이 받는 사원이 이름,급여,업무를 검색하여 출력
mysql> select pname,pay,job from person where pay>(select avg(pay) from person where job=’manager’) && job!=’manager’ ;


문제) seoul에 근무하는 사원의 사번,이름,급여를 검색하여 출력 (join을 이용하지 않고 바로 다른 테이블의 필드 검색)
mysql> select pno,pname,pay from person where dno=(select dno from division where position=’seoul’);
20090112_06.jpg


2) 다중행 서브 쿼리 => 서브쿼리의 결과가 여러개의 데이타인 경우


문제)업무가 analyst인 사원과 같은 부서에 근무하는 사원의 사번,이름,부서코드 검색하여 출력
mysql> select pno,pname,dno from person where dno=(select dno from where job=’analyst’); 오류
==>수정
mysql> select pno,pname,dno from person where dno in (select dno from person where job=’analyst’);
20090112_07.jpg


문제) 20번 부서에 근무하는 어떠한 사원보다 급여를 적게 받는 사원의 사번,이름,급여를 검색 출력
mysql> select pno,pname,pay from person where pay <ANY(select pay from person where dno=20);
mysql> select pno,pname,pay from person where pay<(select min(pay) from person where dno=20);
20090112_08.jpg


문제) 업무가 salesman인 사원 누구보다 많은 급여를 받는 사원의 사번,이름,급여를 검색 출력
mysql> select pno,pname,pay from person where pay >ALL(select pay from person where job=’salesman’);
20090112_09.jpg


3) 다중열 서브 쿼리


문제) 업무가 salesman인 사원과 같은 부서에 근무하고 같은 월급을 받는 사원들의 사번,이름,급여를 검색 출력
mysql> select pno,pname,pay from person where dno in (select  dno from person where job=’salesman’) and pay in (select pay from person where job=’salesman’);


※ INLINE VIEW => 서브쿼리를 이용해 가상의 테이블을 만들어 검색


문제) 자기 자신의 부서별 평균 급여보다 더 많은 급여를 사원의 이름과 급여를 검색하여 출력

Loading

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다