EQUI JOIN에 대해 알아보자.
EQUI JOIN은 테이블과 테이블을 연결하고 교집합만을 가져오는 JOIN이다. 가장 기본적인 JOIN이다.
예제를 통해 알아보자.
SELECT * FROM pub;
-- pNum, pName, pTel
SELECT * FROM book;
-- bCode, bName, bPrice, bcCode, bNum(책코드, 책이름, 가격, 분류코드, 출판사번호)
두 개의 테이블에 무엇이 있는지 확인
두 테이블을 JOIN 해보자.
-- 방법 1 : WHERE 로 JOIN한다.
SELECT bCode, bName, book.pNum, pName, bPrice
FROM book, pub
WHERE book.pNum = pub.pNum;
-- 방법 2 : JOIN 을 이용한다.
SELECT bCode, bName, b.pNum, pName, bPrice
FROM book b
JOIN pub p ON b.pNum = p.pNum;
테이블 book은 b로 별명을 주었기 때문에 book테이블의 pNum은 b.pNum 으로 표현가능하다. 두 테이블에 같은 값을 가지고 있는 pNum을 이용해 EQUI JOIN을 했기 때문에 중복되는 pNum을 SELECT에서 가져오려면 컬럼명 앞에 테이블명을 주어야한다. 안쓰면 에러(ORA-00918 : 컬럼의 정의가 애매하다. )가 발생한다. 주로 이런 상황에서는 먼저있는 테이블을 쓰기 때문에 b.pNum으로 주었다. p.pNum으로 줘도 상관은 없다.
WHERE절을 이용해서도 JOIN이 가능하지만 JOIN까지를 한 테이블로 생각하고 WHERE로 조건을 주는 것이 나는 더 편하기 때문에 방법 2를 주로 사용할 예정이다. (아니면 WHERE 절에 조인도 하고 조건도 줘야되서 조금 헷갈린다. 특히 LEFT OUTER JOIN 나 RIGHT OUTER JOIN사용 시 엄청 헷갈림)
판매현황을 알아보는 실습을 해보자.
테이블 (컬럼) 정보
book (bCode, bName, pNum, bPrice, bcCode)
pub (pNum, pName, pTel)
sale (sNum, sDate, cNum)
dsale (dNum, sNum, bCode, qyt)
cus (cNum, cName, cTel)
-- 출력목록 : 책코드(bCode), 책이름(bName), 책가격(bPrice), 출판사번호(pNum), 출판사이름(pName), 판매일자(sDate), 판매고객번호(cNum), 판매고객이름(cName), 판매수량(qty), 금액(bPrice * qty)
-- EQUI JOIN 조건에 해당하는 것만 가져온다.
-- 방법 1
SELECT b.bCode, bName, bPrice, b.pNum, pName, sDate,
s.cNum, cName, qty, bPrice * qty amt
FROM BOOK b, pub p, dsale d, sale s, cus c
WHERE b.pNum = p.pNum AND b.bCode = d.bCode AND d.sNum = s.sNum AND s.cNum = c.cNum;
-- 방법 2
SELECT b.bCode, pName, bPrice, b.pNum, pName, sDate,
d.sNum, s.cNum, cName, qty, bPrice * qty amt
FROM book b
JOIN pub p ON b.pNum = p.pNum
JOIN dsale d ON b.bCode = d.bCode
JOIN sale s ON d.sNum = s.sNum
JOIN cus c ON s.cNum = c.cNum;
-- 방법 3
SELECT bCode, pName, bPrice, pNum, pName, sDate,
cNum, cName, qty, bPrice * qty amt
FROM book b
JOIN pub USING(pNum)
JOIN dsale USING(bCode)
JOIN sale USING(sNum)
JOIN cus USING(cNum);
-- 컬럼명이 다를 수 있어서 방법2의 EQUI JOIN을 더 많이사용한다.
-- 판매된 책코드(bCode), 책이름(bName), 판매수량(qty) 를 출력하라.
SELECT b.bCode, bName, qty
FROM book b
JOIN dsale d ON b.bCode = d.bCode
ORDER BY b.bCode;
판매수량은 dsale 테이블이 가지고 있으므로 판매된 책코드와 책이름을 알아보기 위해서는 book과 dsale테이블을 JOIN해준다.
-- 판매된 책코드(bCode), 책이름(bName), 판매수량의 합(qty) : 책코드 오름차순
SELECT b.bCode, bName, SUM(qty)
FROM book b
JOIN dsale d ON b.bCode = d.bCode
GROUP BY b.bCode, bName
ORDER BY b.bCode;
SUM() 을 사용할 때 GROUP BY를 넣어서 책코드와 책이름을 묶어주어야 한다.
-- 0812.sql 파일 108줄까지 포스팅
'쌍용강북교육센터 > 8월' 카테고리의 다른 글
0812_Oracle : NATURAL JOIN, CROSS JOIN, SELF JOIN (1) | 2021.08.15 |
---|---|
0812_Oracle : EQUI JOIN (2) (1) | 2021.08.15 |
0812_Oracle : JOIN을 활용한 문제풀이 [210813 수정] (2) | 2021.08.12 |
0812_Oracle : 데이터 사전 확인 (0) | 2021.08.12 |
0811_Oracle : 식별관계/비식별관계, ERD, 참조키 활성화/비활성화 (2) | 2021.08.11 |