실습에 사용하는 테이블 관계를 나타낸 ERD

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줄까지 포스팅

 

+ Recent posts