Database/MySQL

[MySQL]MYSQL 기본 문법: SELECT절 - NULL과 ORDER BY, GROUP BY, HAVING

GAEBAL 2022. 3. 16. 23:03
728x90

NULL

  • null 의미는 어떠한 값인지 알 수 없음
  • 연산 수행 불가
  • true and null ⇒ null
  • false and null ⇒ false
  • 오름차순정렬: null → 작은값 → 큰값
  • ifnull(값1, 값2) → 값1이 null이면 값2로 대체
  • nullif(값1, 값2)
    • 값1 = 값2 null 반환
    • 값1 ≠ 값2 면 값1 반환

 

ORDER BY

  • 정렬 방법
    • 오름차순: asc(생략 기본)
    • 내림차순: desc(명시적 표기)
  • 정렬데이터 순서
    • abc, 가나다
    • 숫자, 날짜: 작은것 ~ 큰것
  • 정렬대상
    • 컬럼명
    • 컬럼에 대한 별명
    • select 항목에 대한 index번호: index 시작 1번
    • 수식

 

실습:

-- 직원 부서번호, 사번, 직무, 입사일 정보 조회
select department_id, employee_id, job_id, hire_date from employees
order by department_id desc;

 

-- 부서번호 오름 정렬: asc 생략
-- 부서번호 내림 정렬: desc
select department_id, employee_id, job_id, hire_date, salary*12 from employees
order by department_id desc;

 

-- 연봉 높은 순서대로 정렬: 연봉을 가장 많이 받은 사람에게 한턱쏘라고 하기 위함
select department_id, employee_id, job_id, hire_date, salary*12 연봉 from employees
order by 연봉 desc;

 

 

GROUP BY

  • select 절에 제약
    • group by 사용칼럼, 그룹함수
  • group by 그룹핑컬럼명1, 그룹핑컬럼명X having 그룹핑조건
    • having 절만 사용은 할 수 없음 - 그룹핑 결과에 대한 조건이기 때문에
  • 부서별 부서번호, 인원수, 최대 급여 정보 조회
  • having 절에 alias 사용 가능

 

실습:

-- 부서별 부서번호, 인원수, 최대 급여 정보 조회
select department_id, count(*) 인원수, max(salary) 최대급여
from employees
group by department_id;

 

-- 부서별 부서번호, 인원수, 최대급여 정보 조회
-- 최대급여가 10000 이상인 부서만 조회
-- 최대급여 내림차순, 부서번호 오름차순 정렬 조회
select department_id 부서번호, count(*) 인원수, max(salary) 부서최대급여
from employees
group by department_id
having 부서최대급여 >= 10000
order by 부서최대급여 desc, 부서번호;

 

-- 직원에게 특별상여금 = 급여 + 급여*수당율
-- 부서번호, 사번, 급여, 특별상여금 정보 조회
-- 부서번호 오름차순, 특별상여금(내림)이 톺은 순서대로 정렬 조회
-- 수당율이 0이면 급여만큼의 특별상여금 지급
-- 수당율이 null이면 연산수행되지 않음, 특별상여금도 null -> ifnull() 쓰면 됨
select department_id 부서번호, employee_id 사번, salary 급여, (salary+(1+ifnull(commission_pct, 0))) 특별상여금
from employees
order by 부서번호, 특별상여금 desc;

(salary+(1+ifnull(commission_pct, 0))) -> commission_pct가 null 이면 연산할 때 연산 결과가 null이 되므로 null일 경우 0을 대신 대입해서 연산을 한다

 

728x90