조인및 서브쿼리 > 온라인강의

본문 바로가기
 
 
 
오늘 1,780
어제 1,939
최대 2,526
전체 3,251,325

최근 방문자

1215
964
1723
2217
1939
1780
18 19 20 21 22 23
비즈니스의 시작 비즈명함 ~ 가격, 품질, 배송 3가지 만족을 드리는 비즈명함 / 즉석명함 / 급행서비스 / 서울 전지역 수도권일부 3시간배송

온라인강좌 홈 > 온라인강좌 > 온라인강좌

Oracle | 조인및 서브쿼리

페이지 정보

작성일2013-10-06 04:24 조회4,768회 댓글0건

본문

1. 조인(JOIN)
 
(1) 설명
하나의 테이블로는 원하는 컬럼정보를 참조할 수 없는 경우 관련된 테이블을 논리적으로 결합하여 원하는 컬럼을 참조하는 방법을 조인(JOIN)이라 한다.
 
(2) 조건
논리적으로 결합되는 2개 이상의 테이블에는 반드시  '공통 컬럼'이 존재해야하며 이 공통 컬럼은 동일한 데이터 타입과 공통된 데이터를 포함해야 한다.

SQL> SELECT emp.empno, dept.dname FROM emp, dept WHERE emp.deptno=dept.deptno;
SQL> SELECT e.empno, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;
SQL> SELECT e.empno, d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno;
 
 
2. CROSS 조인 ( CARTESIAN 조인 )
2개 이상의 테이블이 조인될 때 where절에 의해 공통되는 컬럼에 의한 결합이 발생하지 않는 경우 즉, 테이블 전체 행의 전체컬럼이 조인에 사용되는 조인 따라서, 모든 데이터가 검색결과가 된다.
교차 조인 (Cross Join) 은 말 그대로 두 개의 테이블을 그냥 붙였다는 개념이다. 아무런 조건이나 제한 사항 없이 양쪽은 있는 그대로 연결만 했다는 개념으로 생각을 하면 되겠다.
합집합(Union) 이라는 개념으로 생각해도 큰 무리가 없다.
http://www.statwith.pe.kr/TABLE_JOIN/functions007.htm

SQL> SELECT e.empno, e.ename, d.dname FROM emp e, dept d;
SQL> SELECT e.empno, e.ename, s.grade FROM emp e, salgrade s;
 

3. NATURAL 조인 ( EQUI 조인 ) - 가장 일반적 WHERE절에 사용된 공통된 컬럼들이 동등 연산자(equals, =)에 의해 비교되는 조인
[1] 형태1 ***** 중요 형태 *****
SQL> SELECT e.empno, e.ename, d.dname FROM emp e, dept d  WHERE e.deptno=d.deptno;

[2] 형태2
SQL> SELECT empno, ename, dname FROM emp NATURAL JOIN dept;
SQL> SELECT empno, ename, dname FROM emp NATURAL JOIN dept WHERE deptno=20;

[3] 형태3 - ( 오라클 9i부터 적용 )
SQL> SELECT e.empno, e.ename, d.dname FROM emp e JOIN dept d USING (deptno);
SQL> SELECT e.empno, e.ename, d.dname FROM emp e JOIN dept d USING (deptno) WHERE deptno=30;

[4] 형태4
SQL> SELECT e.empno, e.ename, d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno;
 

4. SELF 조인
참조해야 할 컬럼이 자신의 테이블에 있는 다른 컬럼인 경우 사용하는 조인
SQL> SELECT e1.empno, e1.ename, e2.empno FROM emp e1, emp e2 WHERE e1.empno=e2.empno;
SQL> SELECT e1.empno, e1.ename, e2.empno FROM emp e1 JOIN emp e2 ON e1.empno=e2.empno;

< sqlForSelfJoin.sql 먼저 실행 가정 >
#문제 : 취업반이면서 국어와 미술을 듣는 학생 출력!

#답1 - (논리 연산자를 이용)
SQL> SELECT DISTINCT name FROM hacksa WHERE dept='취업반' AND (subject='국어' OR subject='미술');
#답2 - (self join 이용1)
SQL> SELECT a.name FROM hacksa a, hacksa b WHERE a.name=b.name AND a.dept='취업반' AND a.subject='국어' AND b.subject='미술';
#답3 - (self join 이용2)
SQL> SELECT a.name FROM hacksa a JOIN  hacksa b ON a.name=b.name WHERE a.dept='취업반' AND a.subject='국어' AND b.subject='미술';


5. OUTER 조인
한쪽 테이블에는 해당하는 데이터가 존재하는 데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 모든 데이터를 출력하게 하는 조인

[1] 형태1
SQL> SELECT e.empno, e.ename, d.dname FROM emp e, dept d WHERE e.deptno(+)=d.deptno; //17개

[2] 형태2
SQL> SELECT e.empno, e.ename, d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno; //17개

## 생각해 보세요.. ##
SQL> SELECT e.empno, e.ename, d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno; //15개
SQL> SELECT e.empno, e.ename, d.dname FROM dept d LEFT OUTER JOIN emp e ON e.deptno=d.deptno; //17개


5-1. RIGHT : 오른쪽 테이블을 기준
오른쪽 테이블을 기준으로 외부 조인 한다. 왼쪽 테이블에 일치하는 값이 없어도 오른쪽 테이블의 데이터는 모두 가져 온다. 이때 왼쪽에 없는 데이터는 null 로 대치 된다.

SQL> SELECT t1.no, t1.name, t2.no, t2.name FROM t1 LEFT OUTER JOIN t2 ON t1.no=t2.no;
http://www.statwith.pe.kr/TABLE_JOIN/functions006.htm


5-2. LEFT  : 왼쪽 테이블을 기준
왼쪽 테이블을 기준으로 외부 조인 한다. 오른쪽 테이블에 인치하는 값이 없어도 왼쪽 테이블의 데이터는 모두 가져 온다.
이때 오른쪽에 없는 데이터는 null 로 대치 된다. 외부조인은 여집합(Complement) 의 개념이다.

SQL> SELECT t1.no, t1.name, t2.no, t2.name FROM t1 RIGHT OUTER JOIN t2 ON t1.no=t2.no;
http://www.statwith.pe.kr/TABLE_JOIN/functions005.htm


5-3. FULL  : 두 테이블 모두를 기준
오른쪽 외부조인과 왼쪽 외부조인을 합친 개념이다. 왼쪽/오른쪽 테이블의 값이 일치하든 일치 하지 않든 모두 가져오는 조인이다.
다만 Cross join 과 다른 점은 Full join 은 빈 값을  null 로 리턴한다는 것이고 Crosss join 은 양쪽 테이블을 그냥 단순히 연결시켜 준다는 점이다.

SQL> SELECT t1.no, t1.name, t2.no, t2.name FROM t1 FULL OUTER JOIN t2 ON t1.no=t2.no;
http://www.statwith.pe.kr/TABLE_JOIN/functions004.htm

 

6. 서브 쿼리(Sub Query)   
 
(1) 설명
   하나의 SQL문장절에 부속된(포함된) 또 다른 SELECT문장 따라서, 두 번 질의를 해야 얻을 수 있는 결과를 한번의 질의로 해결이 가능케하는 쿼리  
 
(2) 용어 설명
    <1> MAIN-QUERY 또는 OUTER-QUERY
    <2> SUB-QUERY 또는 INNER-QUERY
   
(3) 특징
    <1> 괄호를 묶어야 한다.
    <2> 실행 순서는 대부분 SUB-QUERY가 먼저 수행되고, MAIN-QUERY가 실행된다.
    <3> SUB-QUERY는 MAN-QUERY의 다음 부분에 위치된다.
       - SELECT/DELECT/UPDATE 문장의 FROM절/WHERE절
       - INSERT문장의 INTO절
       - UPDATE문장의 SET절
    <4> SUB-QUERY는 ORDER BY절을 사용할 수 없다.
      ( 예외 : SELECT/DELETE/UPDATE문장의 FROM절 )


7, 단일행 SUB-QUERY ( 연산자 : =, <, >, <=, >= ) SUB-QUERY의 실행결과가 하나의 컬럼, 하나의 행만을 리턴해 주는 경우의 쿼리
      SUB> SELECT job FROM emp WHERE empno=7900;
      SQL> SELECT * FROM emp WHERE job=(SELECT job FROM emp WHERE empno=7900);
      error1> SELECT ename, sal FROM emp WHERE sal=(SELECT sal FROM emp WHERE deptno=10);
      error2> SELECT ename, sal FROM emp WHERE sal=(SELECT sal, comm FROM emp WHERE empno=7369);
      error3> SELECT sal FROM emp WHERE sal>AVG(sal);
      SQL> SELECT ename, sal FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);
   
   
8. 복수행 SUB-QUERY
( 연산자 : IN, ANY, ALL[>:가장큰값, <:가장작은값, =:값이한개일때],  EXISTS )
SUB-QUERY의 실행결과가 여러개의 행을 리턴해주는 쿼리

SUB> SELECT sal FROM emp WHERE deptno=10;
SQL> SELECT ename, sal FROM emp WHERE sal IN(SELECT sal FROM emp WHERE deptno=10);
SQL> SELECT ename, sal FROM emp WHERE sal=ANY(SELECT sal FROM emp WHERE deptno=10);
SUB> SELECT sal FROM emp WHERE job='MANAGER';
SQL> SELECT job, sal FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE job='MANAGER');
SQL> SELECT job, sal FROM emp WHERE sal<ALL(SELECT sal FROM emp WHERE job='MANAGER');
SQL> SELECT job, sal FROM emp WHERE sal=ALL(SELECT sal FROM emp WHERE job='PRESIDENT');
SUB> SELECT * FROM emp WHERE deptno=10;
SQL> SELECT dname, deptno FROM dept WHERE EXISTS(SELECT * FROM emp WHERE deptno=10);
 

9. 복수컬럼 SUB-QUERY( 연산자 : IN )
==>SUB-QUERY의 실행결과가 여러개의 컬럼 AND 여러개의 행을 리턴해 주는 쿼리

SUB> SELECT sal, comm FROM emp WHERE deptno=30;
SQL> SELECT ename, deptno, comm FROM emp WHERE (sal, comm) IN (SELECT sal, comm FROM emp WHERE deptno=30);
SUB> SELECT sal, NVL(comm, -1) FROM emp WHERE deptno=30;
SQL> SELECT ename, deptno, NVL(comm, -1) FROM emp WHERE (sal, NVL(comm, -1)) IN (SELECT sal, NVL(comm, -1) FROM emp WHERE deptno=30);


10. 상호관련 SUB-QUERY
MAIN-QUERY절에 사용된 테이블이 SUB-QUERY절에 다시 재사용
error> SELECT AVG(sal) FROM emp e2 WHERE e2.deptno=e1.deptno;
SQL> SELECT e1.empno, e1.sal FROM emp e1 WHERE sal>(SELECT AVG(sal) FROM emp e2 WHERE e2.deptno=e1.deptno);



관련자료
http://blog.daum.net/jeromek/46
http://www.statwith.pe.kr/TABLE_JOIN/functions005.htm
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

등록된 댓글이 없습니다.


목록

Total 1,943건 1 페이지
온라인강의 목록
번호 제목
1943
1942
1941
1940
JSP utf-8 한글깨짐 (write.2017-03-20)  Hit.59
1939
1938
1937
1936
1935
그누보드 [G5] 게시물 순서 바꾸기 (write.2017-03-16)  Hit.106
1934
전자결제 [PayPal] PHP 결제연동 (write.2017-03-15)  Hit.106
1933
전자결제 [PayPal] ASP 결제 연동 (write.2017-03-15)  Hit.101
1932
1931
1930
JSP Service Temporary Unavailable! (write.2017-03-13)  Hit.120
1929
그누보드 [G5] [최신글] 한줄소식 (write.2016-02-19)인기글첨부파일  Hit.1638
1928
1927
1926
1925
1924
일반 FireFox 플러그인 (write.2015-02-28)인기글  Hit.2000
1923
1922
1921
1920
1919
게시물 검색
 
 
상호: 해피정닷컴 대표:정창용 사업자등록번호:119-05-36414 (08394) 서울시 구로구 디지털로 242 한화비즈메트로1차 1502호
전화: 070-7600-3500 팩스:02-865-3528 개인정보관리:정창용 mail@happyjung.com 에스크로확인
개인정보취급방침
COPYRIGHT 2001~2017 해피정닷컴. All rights reserved. 부가통신사업신고:서울체신청-1217 통신판매신고:2014-서울구로-0074
 
모바일 버전으로 보기