ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL JOIN
    SQL/01. 데이터 조회와 필터링 2020. 2. 3. 00:38

    NATURAL JOIN

    두 테이블의 동일한 컬럼명을 갖는 컬럼은 모두 조인된다.

     

    -- Natual join 에 사용된 조인 컬럼(deptno)는 한정자(ex: 테이블명, 테이블 별칭)을 사용하지 않고
    -- 컬럼 명만 기술한다. (dept.deptno(에러) --> deptno) (기준으로 사용된 deptno는 한정자를 붙이면 에러가 발생)

     

    SELECT e.empno, e.ename, d.dname, deptno  -->에러 , dept.deptno 
    FROM emp e NATURAL JOIN dept d
    ORDER BY deptno;

     

    ORACLE JOIN 

    -- FROM 절에 조인할 테이블 목록을 , (컴마)로 구분하여 나열한다.
    -- 조인할 테이블의 연결조건을 WHERE 절에 기술한다.

    -- (한정자 필요)

     

    JOIN with USING

    -- 조인하려는 두개의 테이블에 이름이 같은 컬럼이 두개이지만
    -- 하나의 컬럼으로만 조인을 하고자 할 때
    -- 조인하려는 기준 컬럼을 기술;

     

    SELECT emp.ename, dept.dname, deptno
    FROM emp JOIN dept USING (deptno);

     

    ORACLE로 JOIN with USING 표현

    SELECT emp.ename, dept.dname, emp.deptno
    FROM emp, dept
    WHERE emp.deptno = dept.deptno;

    JOIN with ON
    -- 조인하려는 테이블의 컬럼 이름이 서로 다를 사용
    -- 컬럼 이름이 다를 때에도 같을 때에도 사용할 수 있다.(위에 JOIN with NATURAL, JOIN with USING 은 컬럼 이름이 같을 때 사용)

     

    SELECT emp.ename, dept.dname, emp.deptno --< 한정자 쓸 수 있고 헷갈리지 않게 해주는 것이 좋다.

    FROM emp JOIN dept ON (emp.deptno = dept.deptno);

     

    SELECT emp.ename, dept.dname, emp.deptno
    FROM emp, dept
    WHERE emp.deptno = dept.deptno;

     

    SELF JOIN

    -- 동일한 테이블 간의 조인. (따라서 FROM 절에 동일 테이블이 두 번 이상 나타난다.)

    -- 동일 테이블 사이의 조인을 수행하면 테이블과 컬럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 별칭(Alias)를 사용해야한다.

    -- 컬럼에도 모두 테이블 별칭을 사용해서 어느 테이블의 컬럼인지 식별해 줘야 한다.

    ex) 같은 테이블 안에... 스미스 사원의 상사의 '이름'을 알고 싶을 때 쓴다.

     

    SELECT e.empno, e.ename, m.empno, m.ename
    FROM emp e JOIN emp m ON (e.mgr = m.empno);

     

    SELECT e.empno, e.ename, m.empno, m.ename
    FROM emp e, emp m
    WHERE e.mgr = m.empno;

    mgr 컬럼이 null인 PRESIDENT 가 사라져버렸음. --> PRESIDENT(사장을 관리하는 매니저는 없어서) 

     

    equal JOIN : =
    non-equal JOIN : !=, >, <, BETWEEN AND

     

    -- 실습 join0_1
    SELECT e.empno, e.ename, e.deptno, d.dname
    FROM emp e, dept d
    WHERE e.deptno = d.deptno AND e.deptno != 20; 

    SELECT e.empno, e.ename, e.deptno, d.dname
    FROM emp e JOIN dept d ON (e.deptno = d.deptno) AND e.deptno IN(10,30);

     

    -- 실습 join1
    PROD : PROD_LGU
    LPROD : LPROD_GU;

    -- LPROD 품목, PROD는 세부 품목
    SELECT *
    FROM prod;

    SELECT *
    FROM lprod;

     

    -- 실습 join2

    SELECT buyer_id, buyer_name, prod_id, prod_name
    FROM prod, buyer
    WHERE prod_lgu = buyer_lgu;

    SELECT buyer_id, buyer_name, prod_id, prod_name
    FROM prod JOIN buyer ON prod_lgu = buyer_lgu;

     

    -- 실습 join3
    --oracel 문법
    SELECT member.mem_id, member.mem_name, prod.prod_id, prod.prod_name, cart.cart_qty
    FROM member, cart, prod
    WHERE member.mem_id = cart.cart_member
    AND cart.cart_prod = prod.prod_id;

    -- ANSI 문법
    SELECT member.mem_id, member.mem_name, prod.prod_id, prod.prod_name, cart.cart_qty
    FROM member JOIN cart ON (member.mem_id = cart.cart_member)
                JOIN prod ON (cart.cart_prod = prod.prod_id);

     

     

     

    댓글

Designed by Tistory.