Language/mySQL

공부 내용 정리 mySQL :: 예제 정리 4

Cs.Woo 2021. 5. 20. 22:45
# a6 DB 삭제/생성/선택
DROP DATABASE IF EXISTS `a6`;
CREATE DATABASE `a6`;
USE `a6`;

# 부서(홍보, 기획)
CREATE TABLE `dept` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    `name` CHAR(5) NOT NULL,
    regDate DATETIME NOT NULL
);

INSERT INTO dept
SET `name` = '홍보',
regDate = NOW();

INSERT INTO dept
SET `name` = '기획',
regDate = NOW();

INSERT INTO dept
SET `name` = 'IT',
regDate = NOW();

# 사원(홍길동/홍보/5000만원, 홍길순/홍보/6000만원, 임꺽정/기획/4000만원)

CREATE TABLE emp (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    `name` CHAR(5) NOT NULL,
    `deptId` INT(10) NOT NULL,
    `salary` INT(10) NOT NULL,
    regDate DATETIME NOT NULL
);

INSERT INTO emp
SET `name` = '홍길동',
`deptId` = 1,
`salary` = 5000,
regDate = NOW();

INSERT INTO emp
SET `name` = '홍길순',
`deptId` = 1,
`salary` = 6000,
regDate = NOW();

INSERT INTO emp
SET `name` = '임꺽정',
`deptId` = 2,
`salary` = 4000,
regDate = NOW();

# 사원 수 출력
SELECT COUNT(*) AS `사원 수`
FROM emp

# 가장 큰 사원 번호 출력
SELECT MAX(id) AS `가장 큰 사원 번호`
FROM emp


# 가장 고액 연봉
SELECT MAX(salary) AS `고액연봉`
FROM emp

# 가장 저액 연봉
SELECT MIN(salary) AS `저액연봉`
FROM emp

# 회사에서 1년 고정 지출(인건비)
SELECT SUM(salary) AS `1년 고정 지출(인건비)`
FROM emp

# 부서별, 1년 고정 지출(인건비)
SELECT deptId, SUM(salary) AS `부서별 1년 고정 지출(인건비)`
FROM emp
GROUP BY deptId

# 부서별, 최고연봉
SELECT deptId, MAX(salary) AS `부서별 최고연봉`
FROM emp
GROUP BY deptId

# 부서별, 최저연봉
SELECT deptId, MIN(salary) AS `부서별 최저연봉`
FROM emp
GROUP BY deptId

# 부서별, 평균연봉
SELECT deptId, AVG(salary) AS `부서별 평균연봉`
FROM emp
GROUP BY deptId

# 부서별, 사원리스트, 평균연봉, 최고연봉, 최소연봉, 사원수 
## V1(조인 안한 버전)
SELECT deptId AS `부서별`,
GROUP_CONCAT(`name`) AS `사원리스트`,
TRUNCATE(AVG(`salary`),0) AS `평균연봉`,
MAX(`salary`) AS `최고연봉`,
MIN(`salary`) AS `최저연봉`,
COUNT(`id`) AS `사원 수`
FROM emp
GROUP BY deptId


## V2(조인해서 부서명까지 나오는 버전) 부서명
SELECT dept.name AS `부서명`,
GROUP_CONCAT(emp.name) AS `사원 리스트`,
TRUNCATE(AVG(emp.salary),0) AS `평균연봉`,
MAX(emp.salary) AS `최고연봉`,
MIN(emp.salary) AS `최저연봉`,
COUNT(emp.id) AS `사원 수`
FROM emp
INNER JOIN dept
ON emp.deptId = dept.id
GROUP BY emp.deptId

## V3(V2에서 평균연봉이 5000이상인 부서로 추리기)
SELECT dept.name AS `부서명`,
GROUP_CONCAT(emp.name) AS `사원 리스트`,
TRUNCATE(AVG(emp.salary),0) AS `평균 연봉`,
MAX(emp.salary) AS `최고 연봉`,
MIN(emp.salary) AS `최저 연봉`,
COUNT(emp.id) AS `사원 수`
FROM emp
INNER JOIN dept
ON dept.id = emp.deptId
GROUP BY emp.deptId
HAVING `평균 연봉` >= 5000;


## V4(V3에서 HAVING 없이 서브쿼리로 수행)
### HINT, UNION을 이용한 서브쿼리
# SELECT *
# FROM (
#     select 1 AS id
#     union
#     select 2
#     UNION
#     select 3
# ) AS A