본문 바로가기
수업(국비지원)/Oracle

[Oracle] 카티션곱(cross join), 등가 조인(equi jion)

by byeolsub 2023. 4. 14.

1. cross join (카티션 곱)

        : 두개의 테이블의 모든 레코드의 곱의 개수로 레코드 조회 됨. : 조회 되는 레코드 개수가 두 테이블의 레코드의 곱 이            므로 사용 시 주의함. : 테이블 명을 별명으로 지정할 수 있다.


사용 시 주의.

: 절대 사용하지 말자. but 테스트 데이터를 강제로 만들 때에는 자주 사용함.


-- 오라클 방식
  select e.ename , d.dname 2 from emp e, dept d ;

-- ansi 방식.
select e.ename , d.dname 2 from emp e cross join dept d ;
 <--이런식으로 join했음을 표시한다.
예시 : 
select count(*) from emp   -- 14건
select count(*) from dept  -- 4건

select * from emp,dept -- cross join.  14*4=56
예시 : 
select ename,deptno,dname from emp,dept   
-- 오류 : column ambiguously defined
          컬럼명이 겹쳐서 컬럼을 어디서 가져와야할지 모르겠다는 오류문구
-- 두개테이블의 컬럼명이 같은 경우 반드시 테이블명을 명시해야 함.  
    컬럼이 다른 경우 테이블명을 생략할 수 있다.

select ename,emp.deptno,dept.deptno,dname from emp,dept

2. 등가 조인.(equi jion)

      : 두개의 테이블을 연결해주는 컬럼으로 레코드를 조회. ( 기본적인 jion 방법)

        연결 컬럼의 값이 같은 경우 연결.

 학생테이블(student),학과테이블(department)를 사용하여
 학생이름(name),전공학과1(deptno1),전공학과이름(deptno) 출력하기.
-- 오라클 방식.
select s.name,s.deptno1,d.dname from student s,department d where s.deptno1 = d.deptno;

 -- ansi 방식.
select s.name,s.deptno1,d.dname from student s join department d on s.deptno1 = d.deptno;
예시 :
select e.ename,e.deptno,d.deptno,d.dname from emp e,dept d where e.deptno = d.deptno;                         
select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno;
문제 : 
 1. emp 테이블의 사원이름,부서코드(deptno)와 dept테이블의 부서이름 조회하기.
 -- 오라클 방식
select e.ename,e.deptno, d.dname from emp e,dept d where e.deptno = d.deptno;

 -- ansi 방식
select e.ename,e.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
문제 : 
 2. 학생테이블과 교수테이블을 이용하여 학생의이름(name),지도교수번호(profno),
지도교수이름(name)을 조회하기. 지도교수가 없는 학생은 조회하지 않는다.
 -- 오라클 방식  
select s.name 학생이름,s.profno 지도교수번호,p.name 교수이름 
from student s, professor p where s.profno = p.profno and s.profno is not null; 
 
-- ansi 방식
select s.name 학생이름,s.profno 지도교수번호,p.name 교수이름 
from student s join professor p on s.profno = p.profno where s.profno is not null;
문제 : 
 3. 학생테이블과 교수테이블을 이용하여 오나라 학생의이름(name),지도교수번호(profno),
지도교수이름(name)을 조회하기. 지도교수가 없는 학생은 조회하지 않는다. 
 -- 오라클 방식
select s.name,s.profno,p.name from student s,professor p 
where s.profno=p.profno and s.name = '오나라';
 
-- ansi 방식
select s.name,s.profno,p.name from student s join professor p on s.profno=p.profno 
where s.name = '오나라';   
문제 : 
 4. 학생의이름(name-student),학과이름(dname-department),지도교수이름(name-professor)을 
조회하기.
 -- 오라클 방식
select s.name 학생이름, d.dname 학과이름, p.name 지도교수이름 
from student s,department d,professor p where s.deptno1=d.deptno and s.profno=p.profno;

 --ansi 방식
select s.name 학생이름, d.dname 학과이름, p.name 지도교수이름 
from student s join department d on s.deptno1 = d.deptno 
join professor p on s.profno = p.profno;