SQL
/*
[group by {column_name | expr | position}]
특정 컬럼에 대해 동일한 값을 갖는 행동을 하나의 행으로 처리하는 것
통계 작업에 보편적으로 사용된다
*/
USE sqldb;
-- 사용자별 구매 총액을(sum) 확인하고 싶다면?
SELECT userID, -- group by절에 명세된 컬럼은 select절에 정의가 가능하다
SUM(price * amount) AS 'total_price'
FROM buytbl
GROUP BY userID
ORDER BY total_price DESC;
-- 사용자별 평균 구매 개수를 확인하고 싶다면?
SELECT userID,
AVG(amount)
FROM buytbl
GROUP BY userID;
USE encore;
-- 부서번호가 50번이거나 부서가 없는 사원의 이름, 급여를 출력하되 급여가 많은 사원부터 조회하겠다
SELECT emp_name,
salary
FROM employee
WHERE dept_id = 50 || dept_id IS NULL
ORDER BY salary DESC;
-- 사원테이블에서 입사일이 2003년 이후인 사원의 이름, 입사일, 부서를 조회
-- 부서번호를 기준으로 내림차순 정렬
-- 부서번호가 동일하면 입사일을 기준으로 오름차순 정렬
-- 입사일이 동일하면 이름을 기준으로 오름차순 정렬
SELECT emp_name, hire_date, dept_id
FROM employee
WHERE YEAR(hire_date) > 2003
ORDER BY dept_id DESC, hire_date ASC, emp_name ASC; -- 기준 컬럼을 열거할 수 있다
-- 부서별 평균 급여를 조회하고 싶다면?
SELECT dept_id,
ROUND(AVG(salary), -4) -- 정수자리 4자리에 맞춰 반올림
FROM employee
GROUP BY dept_id
ORDER BY 2 desc;
-- 성별에 따른 평균 급여를 조회하고 싶다면?
SELECT case
when SUBSTRING(emp_no, 8, 1) = 1 then '남'
when SUBSTRING(emp_no, 8, 1) = 2 then '여'
END AS '성별',
ROUND(AVG(salary), -4) AS '급여'
FROM employee
GROUP BY 성별
ORDER BY 급여 DESC;
-- 서브쿼리(쿼리를 포함하는 쿼리)
SELECT *,
MIN(salary)
FROM employee;
SELECT *
FROM employee
WHERE salary = (SELECT MIN(salary) FROM employee);
USE sqldb;
SELECT *
FROM usertbl;
-- 키가 가장 작은 사원과 가장 큰 사원의 정보를 조회하고 싶다면?
SELECT *
FROM usertbl
WHERE height = (SELECT MIN(height) FROM usertbl) || height = (SELECT MAX(height) FROM usertbl);
-- having : 그룹에 대한 조건
-- where : 테이블에 대한 조건. where절은 그룹함수를 사용할 수 없다.
USE encore;
-- 부서별 급여 총합이 9000000 이상인 부서만 조회
SELECT dept_id,
SUM(salary)
FROM employee
GROUP BY dept_id;
SELECT dept_id,
SUM(salary)
FROM employee
GROUP BY dept_id
HAVING SUM(salary) >= 9000000;
/* -- error
where절에는 그룹함수를 사용할 수 없다
SELECT dept_id,
SUM(salary)
FROM employee
WHERE SUM(salary) >= 9000000
GROUP BY dept_id;
*/
USE sqldb;
/* -- error
SELECT userID AS '사용자',
SUM(price * amount) AS '총 구매액'
FROM buytbl
WHERE SUM(price * amount) > 100
GROUP BY userID;
*/
SELECT userID AS '사용자',
SUM(price * amount) AS '총 구매액'
FROM buytbl
GROUP BY userID
HAVING SUM(price * amount) > 100;
-- rollup() 함수 : 중간 합계와 총합을 출력. group by 절에 가장 먼저 작성한 컬럼을 기준으로 삼는다.
SELECT *
FROM buytbl;
-- 구매한 목록 중 그룹이름별로 구매비용을 조회하고 싶다면?
SELECT num,
groupName,
SUM(price * amount) AS '구매비용'
FROM buytbl
GROUP BY groupName, num
WITH ROLLUP;
SELECT groupName, -- 중간합계는 출력되지 않고 누적 총합만 출력된다.
SUM(price * amount) AS '구매비용'
FROM buytbl
GROUP BY groupName
WITH ROLLUP;
-- 순위함수 : 결과에 순번 또는 순위를 정의하는 함수(rank(), row_number(), dense_rank() etc.....)
-- row_number() : 행이 만들어진 순번(order by에 의한 순서)
SELECT *
FROM usertbl;
SELECT *
FROM usertbl
ORDER BY height DESC;
SELECT ROW_NUMBER() OVER(ORDER BY height DESC, NAME ASC) AS '행 번호',
NAME,
addr,
height
FROM usertbl;
-- 지역별로 키 큰 순위를 정의하고 싶다면?
SELECT ROW_NUMBER() OVER(PARTITION BY addr ORDER BY height DESC, NAME ASC) AS '행 번호',
NAME,
addr,
height
FROM usertbl;
-- dense_rank() : 동률이 있는 경우 1개로 간주하고 다음 등수를 매기는 함수
SELECT DENSE_RANK() OVER(ORDER BY height DESC) AS '행 번호',
NAME,
addr,
height
FROM usertbl;
-- rank() : 동률이 있는 경우 그 수만큼 다음 등수
SELECT RANK() OVER(ORDER BY height DESC) AS '행 번호',
NAME,
addr,
height
FROM usertbl;
'한화시스템 BEYOND SW캠프 > TIL' 카테고리의 다른 글
[2주차] 24.01.17 수요일 (0) | 2024.01.17 |
---|---|
[2주차] 24.01.16 화요일 (0) | 2024.01.16 |
[1주차] 24.01.12 금요일 (1) | 2024.01.12 |
[1주차] 24.01.11 목요일 (0) | 2024.01.11 |
[1주차] 24.01.10 수요일 (0) | 2024.01.10 |