본문 바로가기

SQL

15. 조인(1)( cross join, inner join)

[ 조인 ]
 분리된 두 테이블의 데이터를 동시에 한 쿼리로 출력하거나, 다른 테이블 데이터를 참조하는 조건이 필요할 경우 사용
 oracle 표준과 ansi 표준 존재
 oracle 표준은 조인에 필요한 테이블을 from 절에 컴마로 나열
        조인조건은 일반조건과 마찬가지로 where절에 나열
 ansi 표준은 조인에 필요한 테이블을 조인 형태를 from절에 기술(컴마 전달 불가)
        조인조건은 일반조건과 분리되어 on/using절에 나열 

select *
  from emp, dept ;         --cross join // 발생가능한 모든 경우가 출력됨.

 

나올 수 있는 모든 경우가 다 나타남. 

실무에서 사용되지 않는다.

 


select e.empno, e.ename, e.sal, d.dname     
  from emp e, dept d                               -- 현업에서는 컬럼명 앞 테이블명 정의한다. 가독성을 높이기 위하여
 where e.deptno=d.deptno;                          -- 컬럼별칭은 as 가능하지만 테이블 별칭은 as 사용하면 X
 

 


select e.empno, e.ename, e.sal, d.dname          
  from emp e, dept d                               
 where emp.deptno=dept.deptno;                     -- error : 테이블 별칭을 지정했으면 별칭으로 사용해야함

 

 

 



예제) emp 테이블에서 사원번호, 사원명, 급여와 함께 dept 테이블을 참조하여 각 직원의 부서명 출력

oracle 표준)
select e.empno, e.ename, e.sal, d.dname     
  from emp e, dept d                               
 where e.deptno=d.deptno; 

 

 

ansi 표준)
select e.empno, e.ename, e.sal, d.dname     
  from emp e join dept d                      -- (inner) join : inner 생략가능                     
    on e.deptno = d.deptno; 
    
 

 

동일한 결과를 얻을 수 있다. 

 

 

     
    
    
    
예제) emp 테이블에서 30번 부서원을 제외한 직원의 사원번호, 사원명, 급여와 함께 dept 테이블을 참조하여 각 직원의 부서명 출력


oracle 표준)
select e.empno, e.ename, e.sal, d.dname     
  from emp e, dept d                               
 where e.deptno=d.deptno
   and e.deptno != 30; 


ansi 표준)
select e.empno, e.ename, e.sal, d.dname     
  from emp e join dept d                                        
    on e.deptno = d.deptno
 where e.deptno != 30; 
    



select studno, name, grade, deptno1
  from student;

예제) 각 학생의 학번, 이름, 학년, 제1전공명(department) 출력

oracle 표준)
select s.studno, s.name, s.grade, s.deptno1, d.dname
  from student s , department d 
 where s.deptno1 = d.deptno ; 
 
ansi 표준) 
select s.studno, s.name, s.grade, s.deptno1, d.dname
  from student s inner join department d 
    on s.deptno1=d.deptno;
    

 

 

   
  
예제) student,professor 테이블을 사용하여 각 학생의 학번, 이름, 학년, 지도교수이름 출력            -- equi join
 1:M 의 관계는 부족한쪽이 큰쪽에 맞춰서 늘어난다. / null 끼리는 비교 연산자에서 true 연산하지 않는다. 


select *
  from student;


oracle 표준)
select s.studno 학번, s.name 이름, s.grade 학년, p.name 지도교수이름
  from student s , professor p
 where s.profno=p.profno;
 
 
ansi 표준) 
select s.studno 학번, s.name 이름, s.grade 학년, p.name 지도교수이름
  from student s join professor p
    on s.profno=p.profno;

 

 

예제) gogak, gift 테이블을 사용하여 각 고객의 이름, 고객의 포인트로 받아갈 수 있는 가장 좋은 상품 출력   ---> non equi join

select *
  from gogak;

oracle 표준)
select g1.gname 고객명, g2.gname 상품명
  from gogak g1, gift g2
 where g1.point between g2.g_start and g2.g_end;
 
ansi 표준)
 select g1.gname 고객명, g2.gname 상품명
  from gogak g1 join gift g2
    on g1.point between g2.g_start and g2.g_end;

 

'SQL' 카테고리의 다른 글

17. 서브쿼리(1)  (2) 2024.10.24
16.조인(2)(natural,equi,outer,self)  (2) 2024.10.24
14. 집합 연산자  (0) 2024.10.21
13. 외부 데이터 적재  (1) 2024.10.21
12. 그룹함수(집계함수)  (1) 2024.10.18