'오라클_쿼리'에 해당되는 글 3건

오라클 OUTER JOIN

개발/ORCLE 2008. 10. 24. 10:59
Out(외부) Join

 - equijoin 문장들의 한가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개
    컬럼에서 공통된 값이 없다면 테이블로부터 테이터를 Return하지 않는 다는 것입니다.

 - 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용합니다.
    Outer join 연산자 "( + )"입니다.

 -조인시킬 값이 없는 조인측에 "( + )"를 위치 시킵니다.


 - Outer join 연산자는 표현식의 한 편에만 올 수 있습니다.


예제1) 일반 조인의 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno = b.deptno

DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30

INNER JOIN 또는 =조인이라고 부르는 조인이죠

예제2)out join을 했을 경우


SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

 DEPTNO     DEPTNO
 -------     ----------
     10         10
     20         20
     30         30
                 40

※ 다음의 쿼리를 한번 잘 보시기 바랍니다.

SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

               ANDa.ename LIKE '%';

    DEPTNO     DEPTNO
----------     ----------
        10              10
        20              20
        30              30

쿼리 결과를 잘 보면 out조인이 되지 않은 것을 알 수 있습니다.
위 쿼리를 out조인이 되기 위해서는 아래와 같이 고쳐야 합니다
.

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno(+) = b.deptno
              AND a.ename(+) LIKE '%'

    DEPTNO     DEPTNO
----------      ----------
        10               10
        20               20
        30               30
                          40

OUT조인 조건이 걸려있는 테이블에는 다른 조건절이 들어와도
똑같이 OUT조인 연산자인 (+)를 해주어야 합니다.  


'개발 > ORCLE' 카테고리의 다른 글

오라클 문자열 처리 함수  (0) 2008.10.24
오라클 SubStr  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,
Length

EX) SELECT NAME LENGTH(NAME) LENGTH FROM TEST

NAME           LENGTH
=====================
테스트                3
TEST                  4

한글을 2byte로 계산하여 리턴받을려면 Length

LengthB

EX) SELECT NAME LENGTHB(NAME) LENGTHB FROM TEST

NAME             LENGTHB
========================
테스트                   6
TEST                     4

한글을 1byte로 계산하여 리턴받을려면 LengthB



'개발 > ORCLE' 카테고리의 다른 글

오라클 SubStr  (0) 2008.10.24
오라클 OUTER JOIN  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

★ UNION

    UNION 구문은 첫번째 쿼리의 모든 행을 두번째 쿼리의 모든 행과 더하고,

    중복된 행을 제거한 후, 결과를 리턴한다.

   

    다음 예를 보면 첫번째 쿼리에서 EMPLOYEES_ID와 LAST_NAME에서 LAST_NAME 열이 A나 B로

    시작하는 직원 레코드를 얻고, 두번째 쿼리에서는 EMPLOYEES_ID와 LAST_NAME 열에서

    LAST_NAME 이 B나 C로 시작하는 직원 레코드를 얻었다.

 

    쉽게 알 수 있겠지만 B로 시작되는 LAST_NAME 열을 가지는 직원 레코드는 첫번재와 두번째

    쿼리 모두에서 선택되며, 중복되는 행들은 결과셋에서 제외된다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  union

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

★ UNION ALL

    UNION ALL 구문은 UNION 구문과 매우 비슷하지만 중복되는 행을 제외시키지 않는다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  union all

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

   

★ INTERSECT

   intersect 구문은 두 개의 쿼리를 받고 결과를 모은 다음, 두 결과셋에 모두 존재하는

   레코드만을 리턴한다. 첫번째  쿼리나 두번째 쿼리에서만 리턴된 행은 결과셋에 포함되지 않는다.

  

   앞에서와 같은 쿼리에 INTERSECT 구문을 이용하면 LAST_NAME이 B로 시작하는 직원

   레코드만이 리턴될 것임을 예상할 수 있다. 이것은 첫번째 쿼리나 두번째 쿼리에만 포함되는

   행들이 모두 결과셋에서 제거되기 때문이다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  intersect

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

★ MINUS

   MINUS 집합 연산자는 첫번째 쿼리에서만 리턴되며, 두번째 쿼리에서는 리턴되지 않는

   레코드만을 리턴한다. 즉, 첫번째 쿼리에서 LAST_NAME이 A나 B로 시작하는 직원 레코드가

   리턴되고, 두번째 쿼리에서 LAST_NAME이 B나 C로 시작하는 직원 레코드가 리턴된다면,

   이 두 쿼리에 MINUS 연산자를 적용한 뒤에는 LAST_NAME이 A로 시작하는 직원 레코드를

   얻게 된다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  minus

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /


'개발 > ORCLE' 카테고리의 다른 글

오라클 OUTER JOIN  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
오라클 반환형 함수  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,