[손에 잡히는 10분 SQL - 벤 포터 지음, 박남혜 옮김] 책의 학습 후 정리자료입니다.
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
FROM Vendors, Products
와 같은 조인은 동등 조인 혹은 이쿼 조인(Equi-Join)이라고 한다. 이 조인은 2개의 테이블에 있는 공통 열의 값이 같은 것을 결과를 가져온다.SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;
SQL 자체에서는 조인하는 테이블의 수에 제한을 두지 않지만, 실제로 많은 DBMS에서는 제한을 두고 있다.
11장에서 RGAN01
제품을 주문한 고객 목록을 가져오는 서브쿼리를 이용한 SQL 문이다.
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id In (SELECT cust_id
FROM Orders
WHERE order_num IN ( SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'))
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND Orders.order_num = OrderItems.order_num
AND prod_id = 'RGAN01';
RGAN01
제품의 데이터를 필터링하기 위해 사용하였다.Customers
테이블에서 고객명(cust_name
)과 Orders
테이블에서 관련된 주문 번호(order_num
)를 가져와, 그 결과를 고객명 그리고 주문 번호순으로 정렬하는 SQL 문을 작성하라. 이퀴 조인 문법과 내부 조인 문법을 사용하여 각각 한번 작성해 보자.-- 이쿼 조인 문법
SELECT cust_name, order_num
FROM Customers, Orders
WHERE Customers.cust_id = Orders.cust_id
ORDER BY cust_name, order_num;
-- 내부 조인 문법
SELECT cust_name, order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
ORDER BY cust_name, order_num;
OrderTotal
이라는 이름의 세 번째 열을 추가해 보자. OrderTotal
에는 각 주문의 총가격이 포함되어 있다. 이를 위해 2가지 방법이 있다. OrderItems
테이블에서 서브쿼리를 사용해 OrderTotal
열을 생성하는 게 첫 번째 방법이다. 두 번째는 기존 테이블에 Orderitems
테이블을 조인한 다음 그룹 함수를 사용할 수 있다. 완전한 열 이름(Fully Qualified Column Name) 사용이 필요할 수도 있다는 점에 유의하자.-- 서브 쿼리
SELECT cust_name,
order_num,
(SELECT SUM(quantity*item_price)
FROM OrderItems
WHERE Orders.order_num = OrderItems.order_num) AS OrderTotal
FROM Customers, Orders
WHERE Customers.cust_id = Orders.cust_id
ORDER BY cust_name, order_num;
-- 조인 쿼리
SELECT cust_name,
Orders.order_num,
(SUM(quantity*item_price)) AS OrderTotal
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND Orders.order_num = OrderItems.order_num
GROUP BY cust_name, Orders.order_num
ORDER BY cust_name, order_num;
BR01
이 주문된 날짜를 가져오는 SQL 문을 작성하라. 이번에는 조인과 간단한 이퀴 조인 문법을 사용한다.SELECT cust_id, order_date
FROM Orders, OrderItems
WHERE Orders.order_num = OrderItems.order_num
AND prod_id = 'BR01'
ORDER BY order_date;
prod_id
로 필터링할 WHERE 절을 잊지 말기 바란다.SELECT cust_email
FROM Customers
INNER JOIN Orders ON Customers.cust_id = Orders.cust_id
INNER JOIN OrderItems ON Orders.order_num = OrderItems.order_num
WHERE OrderItems.prod_id = 'BR01';
Customers
테이블에서 고객명(cust_name
), 그리고 OrderItems
테이블에서 모든 주문의 합계를 가져오는 SQL 문을 작성하라. 이 테이블을 조인하려면 Orders
테이블도 포함해야 한다(Customers
테이블은 Orders
와는 연관되지만 OrderItems
와는 직접 연관되어 있지 않기 때문이다). GROUP BY 와 HAVING 절을 사용해야 한다는 것과 고객명으로 정렬하는 것도 잊지 말자. 간단한 이퀴 조인이나 ANSI 내부 조인 문법을 사용해보자. 욕심이 난다면 두 방법으로 모두 작성해 보자.-- 이퀴 조인
SELECT cust_name, SUM(item_price*quantity) AS total_price
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND Orders.order_num = OrderItems.order_num
GROUP BY cust_name
HAVING SUM(item_price*quantity) >= 1000
ORDER BY cust_name;
-- 내부 조인
SELECT cust_name, SUM(item_price*quantity) AS total_price
FROM Customers
INNER JOIN Orders ON Customers.cust_id = Orders.cust_id
INNER JOIN OrderItems ON Orders.order_num = OrderItems.order_num
GROUP BY cust_name
HAVING SUM(item_price*quantity) >= 1000
ORDER BY cust_name;