본문 바로가기

Computer Science/SQL

SQL 정리-(3)

  • 서브쿼리 사용하기
서브쿼리란 쿼리 안에 있는 쿼리
너무 많이 쓰면 성능이 저하될 수 있지만 적당한 서브쿼리는 유연한 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'));

OrderItems 테이블에서 제품 ID가 'RGAN01'인 주문 번호를 가져오기 -> Order 테이블에서 해당 주문 번호인 고객 ID를 가져오기 -> Customers 테이블에서 해당 고객 ID인 고객 명과 고객 연락처 가져오기 


  • 테이블 조인

SQL의 유용한 기능 중 하나는 데이터 검색 쿼리에서 바로 테이블 조인이 가능 

조인에 대해 알기 전에 관계형 테이블부터 이해해야 함


* 관계형 테이블 이해하기 

테이블은 정보를 쪼개 여러 개의 테이블에 저장하도록 설계해야됨 

테이블은 공통 컬럼을 통해 연결되야 함 -> 고유한 특성을 갖는 주 키를 통해 연결 


=> 관계형 데이터는 효율적으로 저장되고 쉽게 조작가능하다는 점에서 확장성이 좋음 


* 조인을 하는 이유 

SELECT 구문 안에서 테이블을 연결할 때 사용하는 메커니즘 

조인은 각 테이블에서 적절한 행을 서로 연결시키는 역할 


  • 조인 생성하기
SELECT vend_name, prod_name, prod_price FROM Vendors, Products WHERE Vendors.vend_id = Products.vend_id;
판매사 ID를 통해 판매사 및 제품 테이블에서 판매사 명, 제품 명, 제품 가격을 가져오기 
=> 조인 또는 이퀴 조인 

* 내부 조인 

두 개의 테이블에 있는 공통 컬럼의 값이 같은 것을 결과로 가져옴 
SELECT vend_name, prod_name, prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

판매사 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