오라클 - Natural Join

지환·2023년 11월 29일
0

오라클

목록 보기
5/10
post-thumbnail
SELECT a.empno , b.dname
FROM emp a NATURAL JOIN dept b;

SELECT empno,ename,dname
FROM emp a JOIN dept b
    ON a.deptno = b.deptno;

SELECT empno, ename, dname
FROM emp,dept
WHERE emp.deptno = dept.deptno -- 옛날방식
SELECT empno, ename, dname
   FROM emp a JOIN dept b
        ON a.deptno = b.deptno;

동작원리를 보자.

이렇게 조인된 row가 반환 된다. 그 중에서 empno, ename, dname 출력한 값을 리턴한다.

7782	CLARK	ACCOUNTING
7839	KING	ACCOUNTING
7934	MILLER	ACCOUNTING
7566	JONES	RESEARCH
7902	FORD	RESEARCH
7876	ADAMS	RESEARCH
7369	SMITH	RESEARCH
7788	SCOTT	RESEARCH
7521	WARD	SALES
7844	TURNER	SALES
7499	ALLEN	SALES
7900	JAMES	SALES
7698	BLAKE	SALES
7654	MARTIN	SALES

14개가 나온다. 즉 deptno = deptno 가 맞는 것만 확인하고 로우값을 리턴하고
리턴된 로우값에서 emp 테이블에서 해당하는 컬럼 반환

다음 예제를 보자.

문제1: tcom의 work_year = '2001'인 자료와 temp를 사번으로 연결해서 join한 후 comm을 받는 직원의 성명, salary + COMM을 조회해 보시오.

[답]

SELECT a.emp_id, a.emp_name, a.salary+b.comm
   FROM  temp a, tcom b
  WHERE a.emp_id = b.emp_id
      AND b.work_year = '2001';

EMP 테이블과 TCOM 테이블을 먼저 카타시안의 곱을 진행 한 뒤 조인을 where절에서 진행한다.

SELECT
              *
   FROM  temp a, tcom b 

카타시안의 곱을 한다면

SELECT
              *
   FROM  temp a, tcom b
  WHERE a.emp_id = b.emp_id

이렇게 나오게 된다.즉 a(테이블에 해당하는).emp_id = b(테이블에 해당하는).emp_id가 출력된다. 그 때 SELECT문을 수정하면

SELECT
             a.emp_id,a.emp_name,a.salary+b.comm
   FROM  temp a, tcom b
  WHERE a.emp_id = b.emp_id
      AND b.work_year = '2001';

최종적으로 이러한 코드가 나오는데,

  1. 카타시안의 곱이 걸린다.(FROM temp a, tcom b)
  2. where 절 조건이 걸린다 (WHERE a.emp_id = b.emp_i AND b.work_year = '2001';)
  3. where절 조건을 만족하는 a테이블의 emp_id를 출력한다.
  • a.emp_id = b.emp_id를 만족하고 and b.work_year = '2001'만족하는 a테이블의 emp_id를 출력하면된다.

문제2 : temp와 emp_level을 이용해 emp_level의 과장 직급의 연봉 상한/하한 범위 내에 드는 직원의 사번과, 성명, 직급, salary를 읽어보자.

 문제2 : temp와 emp_level을 이용해 emp_level의 과장 직급의 연봉 상한/하한 범위 내에
드는 직원의 사번과, 성명, 직급, salary를 읽어보자.


select  a.emp_id, a.emp_name, a.lev, a.salary

from  temp a, emp_level e

where a.lev = e.lev and a.salary between e.from_sal and e.to_sal;

emp_level의 과장 직급의 연봉 상한/하한 범위 내 이 말이 키워드이다. emp_level테이블에서 과장 (37000000 75000000) 여기 안에 드는 사람을 TEMP 에서 찾아서 출력하면된다.

두개의 다른 테이블을 이용해서 조회를 해야된다. (조인을) 생각해야된다. 과장 직급의 연봉 상한/하한 범위 내 라는 말이 keyword이다. 그렇게 한다면 한 가지 방법이 있다. NATURAL JOIN을 이용하지 않고 WHERE절에서 조인을 거는 것이다.

WHERE a. salary BETWEEN A(EMP_LEVEL).FROM_SAL AND TO_SAL AND B.LEV = ‘과장’를 하는 것이다.

근데 순서가 이게 맞나? 순서는 확인 해봤는데 바뀌어도 상관없다. and 조건이여서

과장을 먼저 정해주면 그에 따른 row가 반환 되는데 거기 안에 FROM_SAL AND TO_SAL이 있기 때문에 과장 먼저 조인을 걸어줘야한다.

문제3: 두 개의 공통된 QnA_title, QnA_CONTENT , MEM_NAME 를 Natural join으로 출력하시오. (테이블은 member, qna) 사용하기

SELECT
             qna_title, qna_content, mem_name
  FROM qna, member
 WHERE QNA.MEM_NO = member.mem_no;

문제4: QnA게시판에서 게시판의 제목, 게시판의 내용, 그리고 Member 글을 쓴 사용자의 이름과, 그 사용자의 댓글QnA_commnent을 출력하시오.(조인3개)

SELECT a.QNA_TITLE, a.QNA_CONTENT, m.MEM_ID, b.QC_CONTENT
FROM QNA a, QNA_COMMENT b, MEMBER m
WHERE a.MEM_NO = m.MEM_NO AND a.QNA_NO = b.QNA_NO;

profile
아는만큼보인다.

0개의 댓글