SELECT SupplierID, AVG(Price)
FROM Products
GROUP BY SupplierID;
GROUP BY를 사용할때는 특정 카테고리 별로 나뉜 데이터 값을 추출하고 싶을 경우에 사용된다. 전체 데이터에서 SupplierID 별로 그룹을 정했고 그 그룹별로 평균 price를 추출했다.
SELECT SupplierID, AVG(Price)
FROM Products
GROUP BY SupplierID
HAVING AVG(Price) >= 20;
그룹으로 나눠진 테이블을 또 조건을 걸어서 다시 찾아보고 싶다면 HAVING을 사용하면 된다. 위는 AVG(Price)가 20 이상일 때 데이터를 추출한다.
SELECT CASE
WHEN CategoryID = 1 THEN '음료'
WHEN CategoryID = 2 THEN '주류'
ELSE '기타'
END AS 'CategoryName'
FROM Products;
CASE는 CategoryID 별로 나뉘어 새로운 카테고리를 생성해서 데이터를 추출한다. AS를 사용해서 새로운 카테고리 이름을 만든다. ELSE를 생략할 경우에는 ELSE NULL이 자동으로 지정되며 WHEN 절의 조건에 아무것도 부합하지 않은 데이터가 있는 경우 ELSE 절에 값을 지정해 주지 않으면 해당 값은 자동으로 NULL 값을 반환한다.
SELECT AVG(CASE
WHEN CategoryID = 1 THEN price
ElSE NULL END) AS 'category_1_price',
AVG(CASE
WHEN CategoryID = 2 THEN price
ElSE NULL END) AS 'category_2_price'
FROM Products;
Excel 을 사용했다면 피봇을 쉽게 이해한다. 즉 쉽게 말해 피봇은 세로로 표시되는 테이블 결과물을 가로로 보고 싶을 때 사용하는 방법이다. 쿼리 CASE 문을 이용하여 각각의 칼럼에 맞는 데이터만 추출하고 나머지는 null 값을 가지도록 하여, 각 칼럼에서 보고 싶은 연산(COUNT, SUM, AVG 등등)의 결과를 보여줄 수 있다.
SQL Joins Visualizerhttps://sql-joins.leopard.in.ua/
두개 이상의 테이블을 결합하여 봐야하는 상황이 생길수 있다. JOIN은 관련성이 있는 테이블을 이어붙여서 흩어져 있는 정보를 한번에 가져오기 위한 방법이다.
Users의 id와 Orders의 userid를 기준으로 두 테이블을 합친다.
SELECT *
FROM Users
INNER JOIN Orders ON Users.ID = Orders.userID;
쉽게 생각해 INNER JOIN 을 제외한 모든 JOIN을 OUTHER JOIN이라고 생각하면 된다.
Users 테이블에는 id 3가 데이터가 있지만 Orders 테이블에는 데이터가 없는 경우도 커버를 해줘야 한다. 그래서 왼쪽 Users 테이블을 왼쪽에 지정하여 진행한다.
SELECT *
FROM Users
LEFT JOIN Orders ON Users.ID = Orders.userID;
INNER JOIN과 다른 점은 마지막 세 번째 행이 생성된다.
#RIGHT JOIN은 FROM 절 뒤에 테이블 위치만 바꿔주면 간단히 변경된다. 따라서 대부분 LEFT JOIN을 이용해서 쿼리 ㅂ문을 작성한다.