본문 바로가기
Database

4/23 - 조인, 서브 쿼리

by Jiwon_Loopy 2025. 4. 27.
반응형

목차


조인


  • 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용하는 방식
  • UNION(집합)연산자와의 차이점은 집합 연산자는 세로로 합치는 개념이면, JOIN은 가로로 합치는 개념
  • 테이블을 모두 조회하면 단순히 크로스 연산으로 테이블의 행 X 다른 테이블의 행이 되고, 상관없는 데이터들까지 같이 나오게 된다.
  • 유효한 속성 값 끼리 연결하여 조인 테이블을 만들 수 있다.
  • 비교하는 양 쪽의 값이 모두 있어야 데이터가 조회 된다. (하나라도 없으면 출력 되지 않는다.)
  • 조인 종류
    • 크로스 조인
    • 등가 조인 *
    • 비등가 조인
    • 외부 조인 *
    • 자체 조인
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;

출력 결과

7369	SMITH	  CLERK	    7902	80/12/17	 800		20	20	    RESEARCH	DALLAS
7499	ALLEN	  SALESMAN	7698	81/02/20	1600	 300	30	30	SALES	CHICAGO
7521	WARD	  SALESMAN	7698	81/02/22	1250	 500	30	30	SALES	CHICAGO
7566	JONES	  MANAGER	  7839	81/04/02	2975  	    20	20	RESEARCH	DALLAS
7654	MARTIN	SALESMAN	7698	81/09/28	1250  1400	30	30	SALES	CHICAGO
7698	BLAKE	  MANAGER	  7839	81/05/01	2850	  30	30	    SALES	CHICAGO
7782	CLARK	  MANAGER	  7839	81/06/09	2450		    10	10	ACCOUNTING	NEW YORK
7788	SCOTT	  ANALYST	  7566	87/04/19	3000		    20	20	RESEARCH	DALLAS
7839	KING	  PRESIDENT		    81/11/17	5000		    10	10	ACCOUNTING	NEW YORK
7844	TURNER	SALESMAN  7698	81/09/08	1500  	 0	30	30	SALES	CHICAGO
7876	ADAMS	  CLERK	    7788	87/05/23	1100		    20	20	RESEARCH	DALLAS
7900	JAMES	  CLERK	    7698	81/12/03	 950		    30	30	SALES	CHICAGO
7902	FORD	  ANALYST	  7566	81/12/03	3000		    20	20	RESEARCH	DALLAS
7934	MILLER	CLERK	    7782	82/01/23	1300		    10	10	ACCOUNTING	NEW YORK
  • 테이블의 별칭 설정
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;

7369	SMITH	  CLERK	    7902	80/12/17	 800		20	20	    RESEARCH	DALLAS
7499	ALLEN	  SALESMAN	7698	81/02/20	1600	 300	30	30	SALES	CHICAGO
7521	WARD	  SALESMAN	7698	81/02/22	1250	 500	30	30	SALES	CHICAGO
7566	JONES	  MANAGER	  7839	81/04/02	2975  	    20	20	RESEARCH	DALLAS
7654	MARTIN	SALESMAN	7698	81/09/28	1250  1400	30	30	SALES	CHICAGO
7698	BLAKE	  MANAGER	  7839	81/05/01	2850	  30	30	    SALES	CHICAGO
7782	CLARK	  MANAGER	  7839	81/06/09	2450		    10	10	ACCOUNTING	NEW YORK
7788	SCOTT	  ANALYST	  7566	87/04/19	3000		    20	20	RESEARCH	DALLAS
7839	KING	  PRESIDENT		    81/11/17	5000		    10	10	ACCOUNTING	NEW YORK
7844	TURNER	SALESMAN  7698	81/09/08	1500  	 0	30	30	SALES	CHICAGO
7876	ADAMS	  CLERK	    7788	87/05/23	1100		    20	20	RESEARCH	DALLAS
7900	JAMES	  CLERK	    7698	81/12/03	 950		    30	30	SALES	CHICAGO
7902	FORD	  ANALYST	  7566	81/12/03	3000		    20	20	RESEARCH	DALLAS
7934	MILLER	CLERK	    7782	82/01/23	1300		    10	10	ACCOUNTING	NEW YORK
--- ANSI 방식(SQL-99 표준문법)
--, -> JOIN
-- WHER -> ON

SELECT *
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;

크로스 조인


  • 모든 조합 가능한 수 출력

등가 조인


  • 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;

7369	SMITH	  CLERK	    7902	80/12/17	 800		20	20	    RESEARCH	DALLAS
7499	ALLEN	  SALESMAN	7698	81/02/20	1600	 300	30	30	SALES	CHICAGO
7521	WARD	  SALESMAN	7698	81/02/22	1250	 500	30	30	SALES	CHICAGO
7566	JONES	  MANAGER	  7839	81/04/02	2975  	    20	20	RESEARCH	DALLAS
7654	MARTIN	SALESMAN	7698	81/09/28	1250  1400	30	30	SALES	CHICAGO
7698	BLAKE	  MANAGER	  7839	81/05/01	2850	  30	30	    SALES	CHICAGO
7782	CLARK	  MANAGER	  7839	81/06/09	2450		    10	10	ACCOUNTING	NEW YORK
7788	SCOTT	  ANALYST	  7566	87/04/19	3000		    20	20	RESEARCH	DALLAS
7839	KING	  PRESIDENT		    81/11/17	5000		    10	10	ACCOUNTING	NEW YORK
7844	TURNER	SALESMAN  7698	81/09/08	1500  	 0	30	30	SALES	CHICAGO
7876	ADAMS	  CLERK	    7788	87/05/23	1100		    20	20	RESEARCH	DALLAS
7900	JAMES	  CLERK	    7698	81/12/03	 950		    30	30	SALES	CHICAGO
7902	FORD	  ANALYST	  7566	81/12/03	3000		    20	20	RESEARCH	DALLAS
7934	MILLER	CLERK	    7782	82/01/23	1300		    10	10	ACCOUNTING	NEW YORK

비 등가 조인


  • 등가 조인 방식 외의 방식을 의미
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

출력 결과

7369	SMITH	     CLERK	7902	80/12/17	800		20	1	700	1200
7900	JAMES      CLERK	7698	81/12/03	950		30	1	700	1200
7876	ADAMS	     CLERK	7788	87/05/23	1100		20	1	700	1200
7521	WARD	  SALESMAN	7698	81/02/22	1250	500	30	2	1201	1400
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30	2	1201	1400
7934	MILLER	   CLERK	7782	82/01/23	1300		10	2	1201	1400
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30	3	1401	2000
7499	ALLEN	  SALESMAN	7698	81/02/20	1600	300	30	3	1401	2000
7782	CLARK	   MANAGER	7839	81/06/09	2450		10	4	2001	3000
7698	BLAKE    MANAGER	7839	81/05/01	2850		30	4	2001	3000
7566	JONES	   MANAGER	7839	81/04/02	2975		20	4	2001	3000
7788	SCOTT	   ANALYST	7566	87/04/19	3000		20	4	2001	3000
7902	FORD	   ANALYST	7566	81/12/03	3000		20	4	2001	3000
7839	KING	 PRESIDENT		    81/11/17	5000		10	5	3001	9999

자체 조인


  • 하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식
  • 물리적으로 동일한 테이블 여러 개를 사용할 때 발생할 수 있는 문제점을 해결할 수 있다.
 SELECT E1.EMPNO, E1.ENAME, E1.MGR,
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;

출력 결과

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

외부 조인


  • 어느 한 쪽이 NULL임에도 결과를 출력할 때 포함 시켜야 하는 경우
  • 아무 것도 JOIN앞에 쓰지 않을 경우 디폴트는 INNER JOIN (내부 조인)
  • LEFT, RIGHT JOIN은 디폴트가 OUTER JOIN (외부 조인)
  • 내부 조인
    • 등가, 자체 조인
  • 종류
    • 왼쪽 외부 조인
    -- 왼쪽 외부 조인 
    -- 상사가 없는 직원
    
    SELECT E1.EMPNO, E1.ENAME, E1.MGR,
           E2.EMPNO AS MGR_EMPNO,
           E2.ENAME AS MGR_ENAME
    FROM EMP E1, EMP E2
    WHERE E1.MGR = E2.EMPNO(+);
    
    -- ANSI
    SELECT E1.EMPNO, E1.ENAME, E1.MGR,
           E2.EMPNO AS MGR_EMPNO,
           E2.ENAME AS MGR_ENAME
    FROM EMP E1 LEFT JOIN EMP E2
    ON E1.MGR = E2.EMPNO;
    
    출력 결과
    
    7902	FORD	7566	7566	JONES
    7788	SCOTT	7566	7566	JONES
    7900	JAMES	7698	7698	BLAKE
    7844	TURNER	7698	7698	BLAKE
    7654	MARTIN	7698	7698	BLAKE
    7521	WARD	7698	7698	BLAKE
    7499	ALLEN	7698	7698	BLAKE
    7934	MILLER	7782	7782	CLARK
    7876	ADAMS	7788	7788	SCOTT
    7782	CLARK	7839	7839	KING
    7698	BLAKE	7839	7839	KING
    7566	JONES	7839	7839	KING
    7369	SMITH	7902	7902	FORD
    7839	KING
    
    • 오른쪽 외부 조인
    -- 오른쪽 외부 조인
    -- 부하가 없는 상사
    
    SELECT E1.EMPNO, E1.ENAME, E1.MGR,
           E2.EMPNO AS MGR_EMPNO,
           E2.ENAME AS MGR_ENAME
    FROM EMP E1, EMP E2
    WHERE E1.MGR(+) = E2.EMPNO;
    
    -- ANSI
    SELECT E1.EMPNO, E1.ENAME, E1.MGR,
           E2.EMPNO AS MGR_EMPNO,
           E2.ENAME AS MGR_ENAME
    FROM EMP E1 RIGHT JOIN EMP E2
    ON E1.MGR = E2.EMPNO;
    
    출력 결과
    
    7369	SMITH	7902	  7902	FORD
    7499	ALLEN	7698	  7698	BLAKE
    7521	WARD	7698	  7698	BLAKE
    7566	JONES	7839	  7839	KING
    7654	MARTIN	7698	7698	BLAKE
    7698	BLAKE	7839	  7839	KING
    7782	CLARK	7839	  7839	KING
    7788	SCOTT	7566	  7566	JONES
    7844	TURNER	7698	7698	BLAKE
    7876	ADAMS	7788	  7788	SCOTT
    7900	JAMES	7698	  7698	BLAKE
    7902	FORD	7566	  7566	JONES
    7934	MILLER	7782	7782	CLARK
    										7844	TURNER
    										7521	WARD
    										7654	MARTIN
    										7499	ALLEN
    										7934	MILLER
    										7369	SMITH
    										7876	ADAMS
    										7900	JAMES
    

SQL-99 표준 문법


  • 문법에서 다소 차이가 있음
  • 잘 사용하지 않음
  • NATURAL JOIN
    • 등가 조인을 대신해 사용할 수 있는 조인 방식으로 조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인을 해줌
    • 자동으로 조인 기준 열을 지정
    • WHERE, ON이 따로 존재하지 않고, 테이블 명을 그대로 사용
  • JOIN ~ USING
    • USING 키워드에 조인 기준으로 사용할 열을 명시하여 사용
  • JOIN ~ ON
    • 기존 WHERE절에 있는 조건식을 ON 키워드 옆에 작성
    • 조인 기준 조건식은 ON에 명시하고 그 밖의 출력 행을 걸러 내기 위해 WHERE 조건식을 따로 사용

서브쿼리


  • SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문
  • 서브쿼리의 결과 값을 이용하여 기능을 수행하는 영역은 메인쿼리라고 부른다.
  • 다중 열은 오류가 난다.
  • 대부분의 서브쿼리에서는 ORDER BY를 사용할 수 없다.
  • 서브쿼리의 비교하는 개수와 타입은 같아야 한다.
  • 서브쿼리로 JONES의 급여보다 높은 급여를 받는 사원 정보 출력 (JONE이 두 명일 경우 다중행이 되어 오류가 남, 잘못된 예제임, JONES보다는 EMPNO(단일값)으로 비교하는 것이 더욱 맞음
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL
	           FROM EMP
             WHERE ENAME = 'JONES')
            
            

출력 결과

7788	SCOTT	 ANALYST	   7566  	87/04/19	3000	20
7839	KING	 PRESIDENT	  	    81/11/17	5000	10
7902	FORD	 ANALYST	   7566	  81/12/03	3000	20

실행 결과가 하나인 단일 행 서브 쿼리


  • 등호 , 부등호 연산자는 실행 결과가 단 하나의 행으로 나오므로, 단일 행 연산자로 비교해야 한다.

실행 결과가 여러 개인 다중 행 서브 쿼리


  • 실행 결과 행이 여러 개로 나오는 서브 쿼리
  • 종류
    • IN
      • 메인 쿼리의 데이터 중 서브 쿼리의 결과와 일치하는 행이 있다면 TRUE
      SELECT *
      FROM EMP
      WHERE SAL IN (SELECT MAX(SAL)
                    FROM EMP
                    GROUP BY DEPTNO);
                    
                    
                    
                    
      출력 결과
                    
      7698	BLAKE	MANAGER	7839	81/05/01	2850		30
      7788	SCOTT	ANALYST	7566	87/04/19	3000		20
      7839	KING	PRESIDENT		81/11/17	5000		10
      7902	FORD	ANALYST	7566	81/12/03	3000		20
      
    • ANY, SOME
      • 메인 쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 TRUE
    • ALL
      • 메인 쿼리의 조건식을 서브쿼리의 결과가 모두 만족하면 TRUE
    • EXISTS
      • 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) TRUE

비교할 열이 여러 개인 다중열 서브쿼리


  • 괄호로 묶은 데이터와 같은 자료형 데이터를 SELECT절에 명시하여 사용할 수 있음
  • 서브쿼리의 SELECT절에서 비교할 데이터를 여러 개 지정하는 방식
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
                            FROM EMP
                            GROUP BY DEPTNO);
                            
                            
                            
출력 결과

7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10
7902	FORD	ANALYST	7566	81/12/03	3000		20

FROM 절에 사용하는 서브쿼리


  • 인라인 뷰라고도 부름
  • 특정 테이블 전체 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 주어 사용
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT * FROM EMP WHERE DEPTNO = 10) E10,
     (SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;

출력 결과

7782	CLARK	10	ACCOUNTING	NEW YORK
7839	KING	10	ACCOUNTING	NEW YORK
7934	MILLER	10	ACCOUNTING	NEW YORK
  • WITH절 사용하기
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D   AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;

출력 결과

7782	CLARK	10	ACCOUNTING	NEW YORK
7839	KING	10	ACCOUNTING	NEW YORK
7934	MILLER	10	ACCOUNTING	NEW YORK

SELECT 절에 사용하는 서브쿼리


SELECT 
    ENAME, (SELECT DNAME FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO)DNAME
FROM EMP;

출력 결과

SMITH	RESEARCH
ALLEN	SALES
WARD	SALES
JONES	RESEARCH
MARTIN	SALES
BLAKE	SALES
CLARK	ACCOUNTING
SCOTT	RESEARCH
KING	ACCOUNTING
TURNER	SALES
ADAMS	RESEARCH
JAMES	SALES
FORD	RESEARCH
MILLER	ACCOUNTING
SELECT EMPNO, ENAME, JOB, SAL,
      (SELECT GRADE
              FROM SALGRADE
              WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
      DEPTNO,
     (SELECT DNAME
        FROM DEPT
        WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
    FROM EMP E;
    
    
    
출력 결과

7369	SMITH	CLERK	800	1	20	RESEARCH
7499	ALLEN	SALESMAN	1600	3	30	SALES
7521	WARD	SALESMAN	1250	2	30	SALES
7566	JONES	MANAGER	2975	4	20	RESEARCH
7654	MARTIN	SALESMAN	1250	2	30	SALES
7698	BLAKE	MANAGER	2850	4	30	SALES
7782	CLARK	MANAGER	2450	4	10	ACCOUNTING
7788	SCOTT	ANALYST	3000	4	20	RESEARCH
7839	KING	PRESIDENT	5000	5	10	ACCOUNTING
7844	TURNER	SALESMAN	1500	3	30	SALES
7876	ADAMS	CLERK	1100	1	20	RESEARCH
7900	JAMES	CLERK	950	1	30	SALES
7902	FORD	ANALYST	3000	4	20	RESEARCH
7934	MILLER	CLERK	1300	2	10	ACCOUNTING

메모


  • 같은 이름이 있을 경우 컬럼 이름이 같으면 DB가 알아서 _번호 를 붙여준다.
  • 별칭을 지을 때 Oracle은 AS를 사용할 수 없다. (MySql은 가능)
  • 테이블 갯수가 n개이면 조인했을 때, 조인 조건식의 개수 n-1
  • LEFT JOIN, RIGHT JOIN 은 OUTER JOIN

 

  • 단일 행 다중 행에 포커스를 맞추는 것보다는 연산자에 포커스를 맞춰서 공부하기
  • 데이터 ( 차원 : dimension )
    • 0 - 스칼라
    • 1 - 벡터
    • 2 - 행렬
    • 3 이상 - 텐서
728x90
반응형