목차
1. GROUP BY구문(SQL에서 가장 중요)
HAVING
2. IF/CASE
3. JOIN
HAVING절은 SQL의 GROUP BY절과 함께 사용되며 그룹화된 결과에 조건을 적용하는 데 사용함.
- WHERE절과 차이점
WHERE절은 개별 테이블에 대한 조건을 적용하는 반면, HAVING절은 그룹화된 결과의 집계값에 대한 조건을 적용함# SQL Code 처리 순서 SELECT 컬럼 FROM 테이블 WHERE 조건 GROUP BY 조건 HAVING 조건 ORDER BY 조건HAING : 그룹화 조건 확인
항상 GROUP BY 뒤에 위치하며 GROUP BY 이후 그룹화 된 테이블에 조건 적용
SELECT productline, COUNT(productline)
FROM products
GROUP BY productline
HAVING COUNT(productline) > 20 ;
SELECT productline, avg(buyprice)
FROM products
GROUP BY productline
HAVING avg(buyprice) < 50;
SELECT productcode, SUM(quantityordered)
FROM orderdetails
WHERE orderlinenumber = 1
GROUP BY productcode
HAVING productcode LIKE 'S10%'
;
❔ 문제 1: orders 테이블에서 연도별 주문 건수가 100건을 초과하는 연도를 조회하라 (orderDate와 orderNumber 컬럼 사용)
SELECT YEAR(orderDate) AS OrderYear, COUNT(orderNumber) AS TotalOrders
FROM orders
GROUP BY YEAR(orderDate)
HAVING TotalOrders > 100
;
❔ 문제 2: orderdetails 테이블에서 상품별 총 주문량이 500개 이상인 상품코드를 조회하라(productCode와 quantityOrdered 컬럼 사용)
SELECT productCode, SUM(quantityOrdered)
FROM orderdetails
GROUP BY productCode
HAVING SUM(quantityOrdered) >= 500
;
❔ 문제 3: payments 테이블에서 고객별 총 결제 금액이 $150,000을 초과하는 고객 번호를 조회하라 (customerNumber와 amount 컬럼 사용)
SELECT customerNumber, SUM(amount)
FROM payments
GROUP BY customerNumber
HAVING SUM(amount) > 150000
;
❔ 문제 4: customers 테이블에서 국가별 고객 수가 10명 이상인 국가를 조회하라 (country와 customerNumber 컬럼 사용)
SELECT country, COUNT(customerNumber) AS totalcustomer
FROM customers
GROUP BY country
HAVING totalcustomer >= 10
;
SELECT checkNumber, amount, IF(amount > 50000, 'Large', 'Samll') AS orderSize
FROM payments
;
❔ 문제 5: products 테이블을 사용하여 상품별로 가격이 $100을 초과하면 Expensive로, 그렇지 않으면 Cheap으로 표시하는 쿼리를 작성하라 (products.productName, products.buyPrice 컬럼 사용)
SELECT productName, buyPrice, IF(buyPrice >100, 'Expensive', 'Cheap') AS category
FROM products
ORDER BY buyPrice desc
;
CASE문은 여러 조건을 테스트하고 여러 결과 중 하나를 반환
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE result END as ~
SELECT productName, buyPrice,
CASE
WHEN buyPrice < 20 THEN 'Cheap'
WHEN buyPrice BETWEEN 20 AND 50 THEN 'Moderate'
ELSE 'Expensive'
END AS priceCategory
FROM products;
❔ 문제 6: employees 테이블을 사용하여, 각 직원의 직책(jobTitle)에 따라 다음과 같이 분류하라. (Sales Rep : Sales Team, VP Sales : Management, VP Marketing : Management, 그 외 : Other Positions)
SELECT firstName, lastName, jobTitle,
case jobTitle
WHEN 'Sales Rep' THEN 'Sales Team'
WHEN 'VP Sales' THEN 'Management'
WHEN 'VP Marketing' THEN 'Management'
ELSE 'Other Positions'
END AS PositionCategory
FROM employees;