레이블이 SQL조인인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SQL조인인 게시물을 표시합니다. 모든 게시물 표시

2021년 12월 10일 금요일

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교, SQL학원, 오라클학원, SQL동영상

 

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교, SQL학원, 오라클학원, SQL동영상


http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=702 


오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교오라클 조인내부조인(Inner Join) vs 외부조인(Outer Join)오라클 조인방식(+)과 ANSI SQL 조인방식의 비교실습 :

ojc.asia

https://youtu.be/LEEyBd4n_50

 

https://www.youtube.com/watch?v=XsnDCri9A-A&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=9 


오라클 조인



내부조인(Inner Join) vs 외부조인(Outer Join)

오라클 조인방식(+)과 ANSI SQL 조인방식의 비교



실습 : 오라클 19C



ANSI SQL은 모든 DB에 공용으로 사용할 수 있는 SQL 표준으로 테이블 조인관계는 FROM ~ ON ~ 에서 기술하고 WHERE절에서는 데이터를 필터링 하는 조건만 기술하므로 SQL구문의 가독성이 좋습니다. 


  1. 조인이란?


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


  1. 조인의 4가지 유형


내부 조인, 완전 외부 조인, 왼쪽 외부 조인 및 오른쪽 외부 조인.


  1. 내부조인(Inner Join)


내부 조인은 두 테이블의 교집합을 추출합니다. 양쪽 테이블에서 정확히 조인조건을 만족하는 행들이 추출되는 일반적인 조인 방식 입니다.



실습


EMP, DEPT 테이블 전체를 조인하여 모든 사원의 사원번호, 사원명, 부서명을 출력하세요.

(부서명을 가져오기 위해 DEPT 테이블과 DEPTNO로 조인을 합니다. 사원테이블에서 부서번호가 없는 KING 사원은 출력되지 않습니다.)


사원 테이블과 부서테이블의 데이터를 확인 합니다.


SELECT empno, ename, deptno
FROM emp


<실행결과>



empno
ename
deptno
1
7369
SMITH
20
2
7499
ALLEN
30
3
7521
WARD
30
4
7566
JONES
20
5
7654
MARTIN
30
6
7698
BLAKE
30
7
7782
CLARK
10
8
7788
SCOTT
20
9
7839
KING


10
7844
TURNER
30
11
7876
ADAMS
20
12
7900
JAMES
30
13
7902
FORD
20
14
7934
MILLER
10


부서 테이블(DEPT)의 데이터 입니다.


SELECT *
FROM    dept


<실행결과>



deptno
dname
loc
1
10
ACCOUNTING
NEW YORK
2
20
RESEARCH
DALLAS
3
30
SALES
CHICAGO
4
40
OPERATIONS
BOSTON


a. ANSI SQL 조인형식


SELECT  E.EMPNO, E.ENAME, D.DNAME
FROM     EMP E INNER JOIN DEPT D
ON          E.DEPTNO = D.DEPTNO;


b. 일반적인 조인(모든 DB에서 사용가능)


SELECT E.EMPNO, E.ENAME, D.DNAME
FROM     EMP E , DEPT D
WHERE  E.DEPTNO = D.DEPTNO;



  1. 외부조인(Outer Join)


외부조인은 한 테이블에서 모든 값을 가져오지만 다른 테이블에서 해당 테이블과 일치하는 행만 가져오려는 경우에 이용합니다. 왼쪽 외부 조인에서는 왼쪽 테이블의 모든 행과 오른쪽 테이블의 공통 행이 반환됩니다. 반대로, 오른쪽 외부 조인의 경우 오른쪽 테이블의 모든 행과 왼쪽 테이블의 공통 행이 반환됩니다.


  1. 왼쪽 외부 조인(Left Outer Join)


EMP, DEPT 테이블 전체를 조인하여 모든 사원의 사원번호, 사원명, 부서명을 출력하세요.

(EMP 테이블에서 부서코드가 없는 KING도 출력 됩니다.)

– ANSI SQL 조인형식
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM   EMP E LEFT OUTER JOIN DEPT D       
ON     E.DEPTNO = D.DEPTNO;


– 오라클 조인 형식
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM   EMP E , DEPT D
WHERE  E.DEPTNO = D.DEPTNO(+);


그렇다면 2가지 방식의 차이는 무엇일까요?


ANSI SQL 조인 구문에서는 조인조건은 ON 다음에, 데이터를 필터링 하기 위한 조건은 WHERE절에 기술하여 가독성이 좋습니다. 하지만 오라클 조인구문은 WHERE절에 조인조건과 데이터를 필터링하는 조건들을 같이 기술하여 이들의 순서가 잘 안지켜지고 SQL문이 복잡한 경우에는 가독성이 떨어지고 잘못된 결과를 도출할 확률이 높습니다. WHERE절의 기본 용도는 데이터를 필터링 한다는 관점에서 본다면 ANSI 조인구문을 사용하는 것이 바람직 합니다. 또한 ANSI 조인 방식은 어떤 DataBase에도 통용되는 방식 입니다.


물론 위 실습과 같은 내부조인의 경우 두가지 방식 모두 어떤 데이터베이스에서 SQL문을 작성하던지 동일하게 사용가능 하지만 외부조인의 경우 ANSI SQL 조인구문만 공용으로 사용가능하며 오라클 조인 구문은(+) 오라클 DB에서만 사용 가능합니다.


b. 오른쪽 외부 조인(Right Outer Join)



부서이름별 사원수를 조회 합니다. 외부조인을사용하지 않은 경우와 외부 조인을 사용한 경우를 비교하여 실습 합니다.


-- 외부조인을 사용하지 않은 경우, EMP 테이블에 부서원들이 하나도 없는 OPERATIONS 
-- 부서는 출력되지 않습니다.
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY DNAME;


-- 외부조인을 이용(ANSI SQL 조인방식)
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY DNAME;


-- 외부조인을 이용(오라클 조인방식)
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
GROUP BY DNAME;



c. 전체 외부 조인(Full Outer Join)


조인조건을 만족하지 않는 왼쪽 테이블의 모든 행과 오른쪽 테이블의 모든 행이 반환됩니다.


EMP, DEPT 테이블을 조인하여 사원이름과 부서명을 출력하는데 아래 조건을 만족하도록 작성을 해보겠습니다.


  1. 부서가 없는 KING도 출력 
  2. 부서원이 없는 40번부서도 출력


즉 조인 조건이 맞지 않더라도 부서도 다 출력해야 하고 사원도 다 출력해야 하는 쿼리를 만들어야 하는데요, 이 경우에는 전체 외부조인(FULL OUTER JOIN)을 사용해야 합니다.


[ANSI SQL 조인방식]

SELECT ename
             , dname 
FROM    emp FULL OUTER JOIN dept
ON         emp.deptno = dept.deptno


[오라클 조인방식은 지원하지 않습니다.]

SELECT ename
             , dname 
FROM    emp , dept
WHERE  emp.deptno(+) = dept.deptno(+)   


⇐ 오류!! ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다


 

#SQL조인, #오라클조인, #조인이란, #JOIN이란, #내부조인, #외부조인, #INNERJOIN, #OUTERJOIN, #오라클교육, #SQL교육, #오라클학원, #SQL학원, #SQL동영상, #오라클동영상, SQL조인, 오라클조인, 조인이란, JOIN이란, 내부조인, 외부조인, INNERJOIN, OUTERJOIN, 오라클교육, SQL교육, 오라클학원, SQL학원, SQL동영상, 오라클동영상



2020년 7월 19일 일요일

SQL조인, 오라클 self join

6.4 Self Join

이름그대로 자기자신 테이블과 조인을 하는 것을 말한다. 원래 조인이 두개의 테이블에 대해 연관된 행들을 조인 칼럼을 기준으로 비교하여 새로운 행 집합을 만드는 것인데 두개의 테이블이 같은 테이블인 경우를 Self Join 이라고 한다.

한 개의 테이블을 두 개의 별도의 테이블처럼 이용하여 서로 조인 하는 형태인데 원하는 데이터들이한테이블에 있는 경우, 테이블의 각행이 테이블의 다른 행의 값과 결합되어 있는 경우에 사용하며 같은 테이블을 두번 사용하므로 테이블 별칭을 반드시 사용해야 한다

특별한 경우로 한 테이블의 외래키 칼럼이 자기 자신테이블의 주키(Primary Key)를 참조하는 경우 이용하게 된다. EMP 테이블의 MGR 칼럼은 외래키(Foreign Key)로써 자기자신 테이블 EMP의 EMPNO(Primary Key)를 참조한다.

보통 한 행(ROW)에 두개의 레코드 정보를 보여 주고자 할 때 유용 하다. (EMP 테이블에서 사원 이름과, 관리자 이름을 같이 출력하는 경우)

--EMP 테이블에서 사번, 이름, 관리자 이름을 출력하라.

--관리자도 사원테이블에 존재하여 EMPNO를 가진다.

SQL> select "사원".empno, "사원".ename, "관리자".ename

2 from emp "사원", emp "관리자"

3 where "사원".mgr = "관리자".empno;

EMPNO ENAME ENAME

---------- ---------- ----------

7902 FORD JONES

7788 SCOTT JONES

7844 TURNER BLAKE

7499 ALLEN BLAKE

7521 WARD BLAKE

7900 JAMES BLAKE

7654 MARTIN BLAKE

7934 MILLER CLARK

7876 ADAMS SCOTT

7698 BLAKE KING

7566 JONES KING

7782 CLARK KING

7369 SMITH FORD

13 개의 행이 선택되었습니다.

-- ANSI JOIN 문법

SQL> select "사원".empno, "사원".ename, "관리자".ename

2 from emp "사원", emp "관리자"

3 where "사원".mgr = "관리자".empno;

-- 이름이 ‘SMITH’인 사원과 같은 부서에 근무하는 사원의 이름을 출력하세요.

-- 서브 쿼리로 풀면

SELECT e1.ename

FROM emp e1

WHERE deptno = (SELECT deptno FROM emp e2

WHERE e2.ename = 'SMITH');

-- SELF JOIN으로 풀면

SELECT e1.ename

FROM emp e1, emp e2

WHERE e1.deptno = e2.deptno

AND e2.ename='SMITH';

SQL조인이란? 동등조인, EquiJoin, Non EquiJoin

SQL조인이란? 동등조인, EquiJoin, Non EquiJoin

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=621

6.3 EquiJoin, Non EquiJoin

조인(Join)이란? 두개의 테이블에 대해 연관된 행들을 조인 칼럼을 기준으로 비교하여 새로운 행 집합을 만드는 것으로 각 테이블간 의미있는 행들을 연결하는 개념이다. 일반적인 조인은 내부조인(Inner Join)으로 두 테이블의 공통칼럼(조인칼럼)을 기준으로 데이터를 추출하는 것 이며 EQUI JOIN, NON EQUI JOIN이 있다.

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

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

Non EquiJoin : 조인 조건이 Equal 연산자 이외의 >, >=, <, <=, <>, BETWEEN … AND 연산자들을 이용하여 조인을 하는 경우 이다. 한 테이블의 어떠한 칼럼도 조인 할 테이블의 칼럼에 직접적으로 일치하지 않는 경우에 사용 한다.

-- EMP, DEPT 테이블의 DEPTNO라는 공통 컬럼을 Equal(=) 연산자로서 Equi Join 하는 예이다.

-- EMP 테이블에는 부서명(DNAME) 칼럼을 가지고 있지 않으므로 조인을 해야만 부서명을 얻을 수 있다. EMP 테이블의 DEPTNO는 Foreign Key이고 DEPT 테이블에서 DEPTNO는 Primary Key 이다. 아래 예문에서 두 테이블의 공통 칼럼인 DEPTNO가 서로 Primary Key, Foreign Key 관계이므로 USING구를 이용한 형태도 가능하다는 것을 참고로 알아 두자. 아래 4가지 표현은 모두 같은 쿼리문 이다.

SQL> select ename "사원명", dname "부서명"

2 from emp e, dept d

3 where e.job = 'SALESMAN'

4 and e.deptno = d.deptno;

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

SQL> select ename "사원명", dname "부서명"

2 from emp e join dept d

3 using (deptno)

4 where job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

SQL> select ename "사원명", dname "부서명"

2 from emp e join dept d

3 on e.deptno = d.deptno

4 where e.job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

-- 오라클9i 이후 EQUI JOIN을 자연조인(Natural Join)이라하고 공통 조인칼럼을 자동으로 알아서 내부적인 조인문을 만들어 조인하므로 ON절이나 USING문을 사용하지 않아도 된다. 주의할 점은 SELECT절에 JOIN컬럼이 출현시 테이블 별칭을 사용하면 안 된다.

SQL> select ename "사원명", dname "부서명"

2 from emp e natural join dept d

3 where e.job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

TURNER SALES

MARTIN SALES

WARD SALES

SQL> select ename "사원명", dname "부서명", e.deptno

2 from emp e natural join dept d

3 where e.job = 'SALESMAN';

select ename "사원명", dname "부서명", e.deptno

*

1행에 오류:

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

--EMP 테이블에서 10번 부서 사원들의 이름, 급여 , 급여등급(GRADE)을 SALGRADE를 참고하여 출력하는 예문이다. SALGRADE 테이블에는 등급별로 하한 값과 상한 값을 가지고 있기 때문에 각 사원들의 등급을 알기 위해서는 SALGRADE 테이블과 Non-Equi Join을 해야 한다. 즉 조인을 하는 각 테이블의 칼럼이 직접적으로 일치 하는 않는 경우이다.

SQL> select e.ename "이름", e.sal "급여", s.grade "등급"

2 from emp e, salgrade s

3 where e.deptno = 10

4 and e.sal between s.losal and s.hisal;

이름 급여 등급

---------- ---------- ----------

MILLER 1300 2

CLARK 2450 4

KING 5000 5

SQL> select e.ename "이름", e.sal "급여", s.grade "등급"

2 from emp e join salgrade s

3 on e.deptno = 10

4 and e.sal between s.losal and s.hisal;

이름 급여 등급

---------- ---------- ----------

MILLER 1300 2

CLARK 2450 4

KING 5000 5

(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...