-- 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 |