- 서브쿼리 사용하기
OrderItems 테이블에서 제품 ID가 'RGAN01'인 주문 번호를 가져오기 -> Order 테이블에서 해당 주문 번호인 고객 ID를 가져오기 -> Customers 테이블에서 해당 고객 ID인 고객 명과 고객 연락처 가져오기
- 테이블 조인
SQL의 유용한 기능 중 하나는 데이터 검색 쿼리에서 바로 테이블 조인이 가능
조인에 대해 알기 전에 관계형 테이블부터 이해해야 함
* 관계형 테이블 이해하기
테이블은 정보를 쪼개 여러 개의 테이블에 저장하도록 설계해야됨
테이블은 공통 컬럼을 통해 연결되야 함 -> 고유한 특성을 갖는 주 키를 통해 연결
=> 관계형 데이터는 효율적으로 저장되고 쉽게 조작가능하다는 점에서 확장성이 좋음
* 조인을 하는 이유
SELECT 구문 안에서 테이블을 연결할 때 사용하는 메커니즘
조인은 각 테이블에서 적절한 행을 서로 연결시키는 역할
- 조인 생성하기
판매사 ID를 통해 Products 및 Vendors 테이블에서 공통적으로 존재하는 판매사 명, 제품명, 제품 가격 가져오기
* 여러 개의 테이블 조인하기
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;
주문 번호가 '20007'인 제품을 가져오기 -> 해당 제품은 OrderItems 테이블에서 제품 ID와 함께 저장되고, 제품 ID는 Products 테이블에 제품을 참조할 때 사용 -> 제품은 판매처 ID로 Vendors 테이블과 연결됨 -> 세 개의 테이블에서 제품 명, 판매사 명 제품 가격, 수량 가져오기
- 고급 테이블 조인 생성하기
* 테이블 별칭
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')' AS vend_title FROM Vendors ORDER BY vend_name;
테이블 별칭을 사용하는 이유는 SQL 문장의 수를 줄이고 하나의 SELECT 구문에서 같은 테이블을 여러번 사용하기 위함
* 셀프 조인
같은 테이블에서 조인을 수행
SELECT c1.cust_id, c1.cust_name, c1.cust_contact FROM Customers AS c1, Customers AS c2 WHERE c1.cust_name = c2.cust_name AND c2_cust_contact = 'Jim';
* 자연 조인
여러 번 반복되는 컬럼을 제거하여 각 컬럼이 한번만 반환되게 하는 것
SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price FROM Customers AS C, Orders AS O, OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';
와일드카드가 첫 번째 테이블에서 사용되었고 나머지 모든 컬럼은 컬럼명으로 나열했으므로 중복된 컬럼을 가져오지 않음
*외부 조인
한 테이블에서가 아닌 외부 테이블과 함께 조인
SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
LEFT를 통해 외부테이블에서 왼쪽에 있는 테이블을 가져오기
*그룹 함수와 조인 사용하기
SELECT Customers.cust_id, COUNT(Orders.order_num) AS num_ord FROM Customers INNER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
Customers와 Orders 테이블을 연결하기 위해 내부 조인 사용 -> Group BY 절에서 고객으로 그룹핑하기 때문에 COUNT(Orders.order_num)을 이용하여 각 고객이 주문한 수량을 셀 수 있고, 그 수량은 num_ord로 반환됨
출처: 손에 잡히는 10분 SQL
'Computer Science > SQL' 카테고리의 다른 글
SQL 정리-(5) (0) | 2018.11.28 |
---|---|
SQL 정리-(4) (0) | 2018.11.28 |
SQL 정리-(2) (0) | 2018.11.22 |
SQL 정리-(1) (0) | 2018.11.22 |