2021년 10월 31일 일요일

오라클 SQL, 등가조인(Equi Join)과 비등가조인(Non-Equi Join)

 

오라클 SQL, 등가조인(Equi Join)과 비등가조인(Non-Equi Join)

등가조인(Equi Join)은 흔히 사용하는 조인의 형태이며 조건 절에 조인되는 두 테이블의 컬럼을 Equal 연산자(=)로 연결하는 경우 입니다. 주로 Primary Key와 Foreign Key 컬럼이 서로 조인될 때 이용되는 형태 입니다. 

비등가조인(Non-Equi Join)은  조인 조건이 Equal 연산자 이외의 >, >=, <, <=, <>, BETWEEN … AND 연산자들을 이용하여 조인을 하는 경우 입니다. 한 테이블의 어떠한 컬럼도 조인 할 테이블의 컬럼에 직접적으로 일치하지 않는 경우에 사용 합니다. 

이러한 조인을 내부조인 이라고도 합니다.

EMP, DEPT 테이블의 DEPTNO라는 공통 컬럼을 Equal(=) 연산자로서 Equi Join 하는 예 입니다. EMP 테이블에는 부서명(DNAME) 컬럼을 가지고 있지 않으므로  DEPT 테이블과 조인을 해야만 부서명을 얻을 수 있습니다. 


EMP 테이블의 DEPTNO는 외래키(Foreign Key)이고 DEPT 테이블에서 DEPTNO는 주키(Primary Key) 입니다. 아래 예문에서 두 테이블의 공통 컬럼인 DEPTNO가 서로 Primary Key, Foreign Key 관계이므로 USING구를 이용한 형태도 가능하다는 것을 참고로 알아 두면 좋습니다. 아래 6가지 표현은 모두 같은 결과를 만들어 내는 쿼리문 입니다


SELECT ename AS "사원명"

              , dname AS "부서명"

 FROM     emp E, dept D

 WHERE E.deptno = D.deptno

 AND       E.JOB = 'SALESMAN'


<실행결과>

 

사원명

부서명

1

ALLEN

SALES

2

TURNER

SALES

3

MARTIN

SALES

4

WARD

SALES


내부조인 형태(inner join ~ using) 이며 표준 ANSI JOIN 구문 입니다.

두 테이블에 이름이 같은 컬럼이 존재하는 경우에는 using문을 사용할 수 있습니다.


SELECT ename "사원명"

             , dname "부서명"

FROM    emp E INNER JOIN dept D

USING   (deptno)

WHERE JOB = 'SALESMAN'



일반적인 조인 형태(JOIN ~ USING) 이며 표준 ANSI JOIN 구문 입니다.

두 테이블에 이름이 같은 컬럼이 존재하는 경우에는 using문을 사용할 수 있습니다.


SELECT ename "사원명"

             , dname "부서명"

FROM    emp E JOIN dept D

USING  (deptno)

WHERE JOB = 'SALESMAN'


JOIN ~ USING, INNER JOIN ~ USING 인 경우 이름이 같은 공통 컬럼이 있든, 없든 on 절에 조인 조건을 기술 합니다. 기타 다른 조건이 있는 경우 where 절에 기술하거나 on 다음에 and 절을 기술하면서 조건을 주셔도 됩니다.


SELECT ename "사원명"

             , dname "부서명"

FROM    emp E JOIN dept D

ON         E.deptno = D.deptno

WHERE E.JOB = 'SALESMAN'


SELECT ename "사원명"

             , dname "부서명"

FROM   emp E JOIN dept D

ON        E.deptno = D.deptno

AND      E.JOB = 'SALESMAN'


오라클9i 이후 조인 시 두 테이블의 컬럼명이 같은 경우 조인 컬럼을 자동으로 알아서 조인하므로 이러한  등가조인(Equi Join)을 자연조인(Natural Join)이라고 하고 ON절이나 USING문을 사용하지 않아도 됩니다. 


SELECT ename "사원명"

             , dname "부서명"

FROM    emp E NATURAL JOIN dept D

WHERE  E.JOB = 'SALESMAN'


자연조인(Natural Join)에서는 SELECT절에 JOIN컬럼이 출현시 테이블 별칭을 사용하면 안됩니다.


SELECT ename "사원명"

       , dname "부서명"

       , E.deptno

FROM emp E NATURAL JOIN dept D

WHERE E.JOB = 'SALESMAN'


<실행결과>

ORA-25155: NATURAL 조인에 사용된 열은 식별자를 가질 수 없음

❶ E.deptno에서 테이블 별칭인 E를 생략해야 합니다.


SELECT ename "사원명"

       , dname "부서명"

       , deptno

FROM emp E NATURAL JOIN dept D

WHERE E.JOB = 'SALESMAN'


<실행결과>

 

사원명

부서명

1

ALLEN

SALES

2

TURNER

SALES

3

MARTIN

SALES

4

WARD

SALES


사원테이블(EMP) 테이블과 급여등급테이블(SALGRADE)을 조인하여 급여등급을 출력하는 쿼리문 입니다. 


SALGRADE 테이블에는 등급별로 하한 값과 상한 값을 가지고 있기 때문에 각 사원들의 등급을 알기 위해서는 SALGRADE 테이블과  EMP 테이블을 Non-Equi Join을 해야 합니다. 즉 조인을 하는 각 테이블의 컬럼이 직접적으로 일치 하는 않는 경우에 사용 합니다. 아래 4가지 쿼리문은 동일한 결과를 만들어 냅니다. 


SELECT E.ename "이름"

             , E.sal      "급여"

             , S.grade  "등급"

FROM    emp E, salgrade S

WHERE E.deptno = 10

AND       E.sal BETWEEN S.losal AND S.hisal


<실행결과>


이름

급여

등급

1

CLARK

2450

4

2

MILLER

1300

2


SELECT E.ename "이름"

         , E.sal "급여"

         , S.grade "등급"

FROM   emp E JOIN salgrade S

ON      E.sal BETWEEN S.losal AND S.hisal

WHERE E.deptno = 10


SELECT E.ename "이름"

         , E.sal "급여"

         , S.grade "등급"

FROM   emp E JOIN salgrade S

ON      E.sal >= S.losal 

AND     E.sal <= S.hisal

WHERE E.deptno = 10


SELECT E.ename "이름"

         , E.sal "급여"

         , S.grade "등급"

FROM   emp E INNER JOIN salgrade S

ON      E.sal >= S.losal 

AND     E.sal <= S.hisal

WHERE E.deptno = 10


#EQUI조인 #등가조인 #Equal조인 #SQL조인 #오라클조인 #ORACLE #SQL #SQL강좌 #SQL교육

오라클 별칭(Oracle Alias)

 

오라클 별칭(Oracle Alias)

오라클에서 테이블이나 컬럼의 이름이 긴 경우 또는 함수, 수식등을 사용하여 컬럼명이 없는 경우 별도의 이름을 부여해서 사용할 수 있는데 이를 별칭(Alias) 이라고 하며  컬럼 별칭(Column Alias), 테이블 별칭(Table Alias) 두가지가 있습니다.

컬럼 별칭은 “컬럼명 AS Alias명” 또는 “컬럼명 Alias명” 두 형태로 작성할 수 있습니다.


테이블 별칭은 “테이블명 Alias명” 형태로 작성할 수 있으며 컬럼 별칭과 달리 AS 사용은 불가능 합니다. 


Alias명에 공백이 없는 경우에는 “를 생략할 수 있습니다. 


컬럼 별칭 예문 입니다.

사원(EMP)테이블에서 10번 부서원들의 사원명(ename)과 급여(sal), 연봉을 추출하는 쿼리문 입니다.


SELECT  ename  AS  "사원명"

              , sal              "급여"

              , TO_CHAR(sal * 12, '999,999,999') AS  "연봉"

FROM     emp

WHERE  deptno = 10


컬럼 Alias명에 공백이 없는 경우에는 “를 생략할 수 있습니다.


SELECT  ename  AS 사원명

              , sal              급여

              , TO_CHAR(sal * 12, '999,999,999') AS  년봉

FROM     emp

WHERE  deptno = 10


<실행결과>

 

사원명

급여

년봉

1

CLARK

2450

29,400

2

MILLER

1300

15,600



기본적으로 조인되는 테이블의 컬럼이 SELECT 리스트에 출현하는 경우 어느 테이블 컬럼인지 소속을 밝혀야 합니다. 조인되는 두 테이블의 한쪽에만 속하는 컬럼 이라면 소속을 밝히지 않아도 되지만 두 테이블에 모두 존재하는 컬럼이라면 반드시 어느 테이블인지 소속을 밝혀야 합니다.


EMP 테이블과 DEPT 테이블을 조인하여 10번 부서원들의 이름, 부서코드, 부서명을 추출하는 쿼리문으로 테이블 별칭을 사용하지 않은 경우 입니다. 


SELECT 리스트의 컬럼에 대해 소속을 밝혀주기 위해 컬럼명 앞에 FROM절에서 사용한 실제 테이블명을 사용하여 소속을 밝혔습니다.


SQL 구문이 복잡해 보입니다.


SELECT  emp.ename

              , emp.deptno

              , dept.dname

FROM     emp, dept

WHERE   emp.deptno = dept.deptno

AND        emp.deptno = 10


<실행결과>


ename

deptno

dname

1

CLARK

        10

ACCOUNTING

2

MILLER

        10

ACCOUNTING



EMP, DEPT 테이블의 한쪽에만 속한 컬럼은 컬럼의 소속을 밝히지 않아도 됩니다.


SELECT  ename

              , emp.deptno

              , dname

FROM    emp, dept

WHERE emp.deptno = dept.deptno

AND       emp.deptno = 10



EMP, DEPT 테이블의 양쪽에 모두 속한 컬럼(deptno)은 반드시 컬럼의 소속을 밝혀야 합니다.


SELECT  ename

              , deptno

              , dname

FROM    emp, dept

WHERE emp.deptno = dept.deptno

AND       emp.deptno = 10


<실행결과>

ORA-00918: 열의 정의가 애매합니다

00918. 00000 -  "column ambiguously defined"

2행, 13열에서 오류 발생


❶ deptno 컬럼이 속한 테이블을 명확하게 해주지 않아서 어느 테이블에 속한 deptno인지 알 길이 없습니다. 그래서 실행 결과 오류가 발생했습니다.


이번에는 테이블 별칭을 이용해 이 구문의 모호함을 제거해 봅시다.

SELECT 리스트의 컬럼에 대해 소속을 밝혀주기 위해 컬럼명 앞에 테이블 별칭을 사용했습니다. 


SQL 구문이 이전보다 간단해 보이며 가독성도 좋습니다.


SELECT  E.ename

              , E.deptno  ❶

              , D.dname

FROM     emp E, dept D

WHERE   E.deptno = D.deptno

AND         D.deptno = 10


<실행결과>


ename

deptno

dname

1

CLARK

        10

ACCOUNTING

2

MILLER

        10

ACCOUNTING


❶ deptno 컬럼에 속한 테이블을 명시해줬습니다. E.deptno는 E 테이블에 속한 컬럼이라는 뜻이므로 이번에는 오류 없이 구문이 실행되었습니다.

 

#ORACLE별칭 #SQL #SQL별칭 #오라클Alias #SQLAlias #SQL교육 #오라클별칭

오라클 조인(Oracle Join)의 개요 및 종류, 조인이란?

 오라클 조인(Oracle Join)의 개요 및 종류, 조인이란? 

 

조인소개


조인(Join)이란?  연관된 둘 이상의 테이블에 대해 행들을 조인 컬럼을 기준으로 비교하여 새로운 행 집합을 만드는 것으로 각 테이블 간 의미있는 행을 연결하는 개념입니다.  


조인은 두 테이블 사이에서 진행됩니다. FROM 절에 있는 A, B, C라는 세 테이블을 조인할 때 3개 테이블이 동시에 조인되는 것은 아닙니다. 2개 테이블이 먼저 조인을 진행하고 그 결과와 나머지 테이블을 조인합니다.


종류

조인은 일반적인 조인인 내부조인(Inner Join)과 외부조인(Outer Join)으로 구분되며 내부조인은 등가조인(Equi Join), 비등가조인(Non-Equi Join), 자연조인(Natural Join), 셀프조인(Self Join)으로, 외부조인은 왼쪽 외부조인(Left Outer Join), 오른쪽 외부조인(Right Outer Join), 전체 외부조인(Full Outer Join)으로 구분할 수 있습니다.


또한 2개 테이블을 내부조인 또는 외부조인을 한다고 했을 때 어떤 방식으로 조인하는지에 따라 중첩루프조인(Nested Loop Join), 해시조인(Hash Join), 머지 조인(Merge Join), 세미조인(Semi Join), 안티조인(Anti Join)으로 구분할 수 있습니다.

조인과 서브쿼리는 유사하지만 중요한 차이는 두 테이블 간의 관계에 있습니다. 조인은 동일한 등급, 레벨에서 이루어지지만, 서브쿼리는 주종관계인 메인쿼리(MAIN QUERY)와 부속쿼리(SUB QUERY) 간에 일어납니다.


유용한 경우

 

관계형 데이터베이스에서는 데이터 중복 저장을 피하려고 데이터를 여러 테이블로 세분화해 저장합니다. 나누어 저장된 데이터에서 원하는 결과를 추출하려면 여러 테이블의 데이터를 연결해야 하는데 이때 조인을 사용합니다.

 

#join #조인 #오라클조인 #ORACLE #JOIN #SQL #SQL조인 #SQL강좌 #SQL강의 #SQL교육 #오라클교육 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...