반응형
목차
조인
- 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용하는 방식
- 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
- IN
비교할 열이 여러 개인 다중열 서브쿼리
- 괄호로 묶은 데이터와 같은 자료형 데이터를 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
반응형
'Database' 카테고리의 다른 글
4/25 - 트랜잭션, DDL, 객체 종류 (0) | 2025.04.27 |
---|---|
4/24 - DDL (0) | 2025.04.27 |
4/22 - 데이터베이스, 데이터 처리와 가공을 위한 오라클 함수, 다중행 함수와 데이터 그룹화 (0) | 2025.04.27 |
4/21 - SQL 데이터 정의어, 오라클 함수 (0) | 2025.04.27 |
4/18 - 데이터 베이스, 관계형 데이터 베이스 (0) | 2025.04.19 |