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;
'SQL' 카테고리의 다른 글
MySQL 날짜 관련 함수 - date_format, period_add, period_diff ... (0) | 2021.09.05 |
---|---|
Programmers SQL 중성화 여부 파악하기 (0) | 2021.09.05 |
Programmers SQL 입양 시각 구하기(2) (0) | 2021.09.05 |
MySQL Join 문법정리 (0) | 2021.08.23 |
MySQL 기본 문법정리 (0) | 2021.08.23 |