-
SQL JOINSQL/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);