본문 바로가기

SQL

MySQL 문법 - Union, Group by, Having, ...

1. UNION : 중복되지 않고, Customers와 Suppliers 테이블들에 있는 도시 값들을 리턴해줌. 

 

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

중복되는 값까지 모두 합쳐서 보여주고 싶다면, UNION ALL 을 대신 사용.

 

2. GROUP BY :

 

- row 중 동일한 값을 가진 것들끼리 그룹지어줌. ex) 각 국가마다 중복되지 않는 고객의 수는 얼마인가? 

- COUNT, MAX, MIN, SUM, AVG 등의 statement와 함께 쓰인다. 

SELECT COUNT(DISTINCT CustomerID), Country
FROM Customers
GROUP BY Country;

 

- JOIN과 함께 자주 쓰임. 예제 ) 각 Shipper로부터 보내진 Order 개수 세기 

SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;

 

3. HAVING

- WHERE가 aggregate function과 함께 쓰일 수 없기 때문에 추가되었다. (GROUP BY 이후에는 WHERE 사용 못함) 

- 예제 : 각 국가마다 고객의 수가 5개 이상인 경우를 리턴 

SELECT COUNT(CustomerID) As CustomerNum, Country
FROM Customers
GROUP BY Country
HAVING CustomerNum > 5;

 

- 예제2 : 10건 이상의 주문을 한 employees들을 리턴 

SELECT Employees.LastName, Employees.FirstName, COUNT(Orders.OrderID) As NumberOfOrders
From Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
GROUP BY Employees.EmployeeID
HAVING NumberOfOrders > 10

 

4. EXISTS

- (subquery)에 해당하는 기록이 존재하는지 테스트하는 쿼리문 TRUE/FALSE

- WHERE EXISTS (SELECT column_name FROM table WHERE condition); 식으로 쓰인다. 

 

- 예제 : 제품 가격이 20$보다 적은 상품을 공급하는 supplier 기록

방법1 : EXISTS 사용 

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price < 20);

방법2 : JOIN 사용

SELECT Suppliers.SupplierName, Products.Price, Products.ProductName
FROM Suppliers
LEFT JOIN Products ON Suppliers.SupplierID = Products.SupplierID
WHERE Products.Price < 20
GROUP BY SupplierName
ORDER BY Suppliers.SupplierID;

 

5. ANY / ALL

- ANY : Boolean 값 리턴, 서브쿼리 값들 중 하나라도 주어진 조건을 만족하면 TRUE

- ALL : Boolean 값 리턴, 서브쿼리 값들이 모두 주어진 조건을 만족하면 TRUE / SELECT, WHERE, HAVING과 함께 쓰임. 

 

- 예제 : 만약 OrderDetails Table에 Quantitly가 10과 동일한 값이 하나라도 있다면 productName을 리턴해라.

SELECT ProductName, ProductID
FROM Products
WHERE ProductID = ANY 
	(SELECT ProductID FROM OrderDetails WHERE Quantity = 10);

 

6. INSERT INTO SELECT 

- 한 테이블로부터 데이터를 카피하고 다른 테이블에 이를 insert

- source와 target table의 데이터 타입이 동일해야함.

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

 

7. IFNULL

-  IFNULL(변수명, 대체값) 으로 해당 변수에 NULL이 있다면 값을 바꿀 수 있음.

SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products;