본문 바로가기

오라클/조인

EQUI JOIN(inner Join)

-- EQUI 조인

  -- 두개 이상의 테이블의 관계되는 컬럼들의 값들이 일치하는 경우에 사용하는 가장 일반적인  JOIN

  -- EQUI 조인은 단순 JOIN 이라 한다.

  

-- 방법 1

 먼저 테이블 마다 컬럼을 확인

SELECT * FROM book; --b_id, title c_name

SELECT * FROM danga; -- b_id, price

SELECT * FROM panmai;


값이 일치하는 컬럼들을 아래와 같이 묶는다

SELECT book.b_id, title, c_name, price

  FROM book, danga WHERE book.b_id = danga.b_id;

  -- 이름이 길어서 아래와 같이 테이블이름에 별명을 붙인다. 

  

SELECT b.b_id, title, c_name, price

  FROM book b, danga d  WHERE b.b_id = d.b_id;

  -- 테이블끼리 가지고 있는 컬럼이름이 똑같은 것은 테이블마다 이름에 별명을 붙여서 구별해 식별할 수 있다.

  --=> 컴파일 순서에 의해서 별명 사용하는 순서도 생각해야한다.

  

-- 방법 2

SELECT b.b_id, title, c_name, price

  FROM book b

  JOIN danga d on b.b_id = d.b_id;  

  --=> on뒤에 오는 조건으로 출력한다.(book테이블과 danga테이블의 b_id의 값이 똑같으므로 합쳐서 출력한다.)


--방법 3

SELECT b_id, title, c_name, price

  FROM book 

  JOIN danga USING(b_id);

  

SELECT b_id, title, p_su, price, g_name, p_su*price amt

  FROM book b

  JOIN danga USING (b_id) 

  JOIN panmai USING (b_id) 

  JOIN gogaek USING (g_id);

  

--방법 4(매칭되는 컬럼이 여러개 있을 경우 모두 조인 조건으로 사용하므로 성능 안좋음)

SELECT b_id, title, c_name, price

  FROM book NATURAL JOIN danga;


=============================================================== 문제 ======================================================================

 

    -- book : b_id(책코드), title(책이름)

    -- danga : b_id, price(단가)

    -- panmai : b_id, g_id(고객코드), p_su(수량), p_date(판매날짜)

    -- gogaek : g_id(고객코드), g_name(고객명)


 -- 판매금액출력 : 책코드, 책이름, 수량, 단가, 고객명, 금액  

SELECT b_id, title, p_su, price, g_name, p_su*price amt

  FROM book b

  JOIN danga d ON b.b_id=d.b_id -- book과 danga 조인

  JOIN panmai p ON b.b_id=p.b_id -- book과 panmai 조인

  JOIN gogaek g ON p.g_id = g.g_id; -- panmai와 gogaek 조인 으로 각각의 테이블에 있는 같은 컬럼의 데이타를 묶었다.

  --=> 위 쿼리와 아래 쿼리는 동일하다

SELECT b.b_id, title, p_su, price, g_name, p_su*price amt

  FROM book b,danga d, panmai p, gogaek g

  WHERE b.b_id= d.b_id AND b.b_id=p.b_id AND p.g_id=g.g_id;



  --올해년도에 판매된 책 판매현황 출력

    -- 책코드, 책이름, 수량, 단가, 판매일(P_date),고객명,금액

SELECT b_id, title, p_su, price, g_name, p_su*price amt

  FROM book b

  JOIN danga d ON b.b_id=d.b_id

  JOIN panmai p ON b.b_id=p.b_id

  JOIN gogaek g ON p.g_id = g.g_id

  WHERE TO_CHAR(p_date, 'YYYY')= TO_CHAR(SYSDATE,'YYYY');

  

  --판매된 책별(b_id) 판매권수 구하기

  SELECT b.b_id, title, p_su

    FROM book b

    JOIN panmai p ON b.b_id=p.b_id;

    -- => 책별로 합쳐지지 않기 때문에 아래와 같이 해야 한다. 


  SELECT b.b_id, title, SUM(p_su) 누적판매권수

    FROM book b

    JOIN panmai p ON b.b_id=p.b_id

    GROUP BY b.b_id, title;

   -- => 집계함수는 GROUP BY와 같이 써야 일반컬럼과 같이 쓸 수 있다.

GROUP BY에는 집계함수를 제외한 일반 컬럼이 와야 집계함수와 쓸 수 있다.


  -- 올해 판매된 책별(b_id) 누적판매권수 구하기

  SELECT b.b_id, title, SUM(p_su) 누적판매권수, 

    FROM book b

    JOIN panmai p ON b.b_id=p.b_id

    WHERE TO_CHAR(p_date, 'YYYY') = TO_CHAR(SYSDATE,'YYYY')

    GROUP BY b.b_id, title;

    

  -- 올해 한권도 판매되지 않은 책은?

  -- 책코드 책이름

  SELECT b_id, title

    FROM book

    WHERE b_id IN(SELECT b_id FROM panmai WHERE TO_CHAR(p_date,'YYYY') != TO_CHAR(SYSDATE,'YYYY'));

    --=> WHERE 에 IN을 써서 셀렉트문을 한번 더 쓰는 경우는 테이블을 2번이상 추출할때 사용한다.!!!!!!!!!

'오라클 > 조인' 카테고리의 다른 글

SELF JOIN  (0) 2013.06.03
CROSS JOIN  (0) 2013.06.03
FULL JOIN  (0) 2013.06.03
OUTER JOIN  (0) 2013.06.01