[MySQL] #11 SQL 단일 행 함수 실습을 해보자~
-- ################## 문자열 함수 실습 ######################
-- 1) 직원의 이름에 대소문자 상관없이 s가 들어간 직원의 모든 정보를 출력하라.
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
FROM emp
WHERE lower(ename) LIKE '%s%';
-- 2) 직원 정보 중 사원번호, 이름, 급여를 출력한다. 단, 이름은 앞에서 3글자씩만 출력하라.
SELECT empno, left(ename, 3), sal
FROM emp;
-- 3) 이름의 글자수가 6자 이상인 사람의 이름을 앞에서 3자만 구하여 소문자로 이름만을 출력하라.
SELECT lower(left(ename, 3))
FROM emp
WHERE length(ename) >= 6;
-- 4) 직원의 이름과 급여를 출력하라, 단, 금액의 정확도를 위해 급여를 6자리로 출력하고, 앞 여백을 모두 * 로 채워 출력하라.
SELECT ename, lpad(sal, 6, '*')
FROM emp;
-- 5) 직원정보를 입력하던중 아래와 같이 입력 되었다.
insert into emp values(8001,' PARK ', 'IT' , 7900 , '21/11/10', 20000,1000,10);
select * from emp;
-- 이름이 'PARK'인 직원의 정보를 출력하여 보자. / 안됨
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
FROM emp
WHERE ename = 'PARK';
-- 이름 좌우에 공백이 있더라도 공백을 제거하고 이름이 'PARK'인 직원의 정보를 출력하여 보자.
SELECT empno, trim(ename), job, mgr, hiredate, sal, comm, deptno
FROM emp
WHERE trim(ename) = 'PARK';
-- ################## 숫자 함수 실습 ######################
-- 1) 급여가 $1,500부터 $3,000 사이의 사람은 급여의 15%를 회비로 지불하기로 하였다.
-- 이를 이름, 급여, 회비(소수점 두 자리 아래에서 반올림)를 출력하라.
SELECT ename, sal, if(sal >= 1500 AND sal <= 3000, round(sal*0.15, 2), 0) 회비
FROM emp;
-- 2) 급여가 $2,000 이상인 모든 사람은 급여의 5%를 경조비로 내기 로 하였다.
-- 이름, 급여, 경조비(소수점 이하 절삭)를 출력하라.
SELECT ename, sal, if(sal >= 2000, truncate(sal*0.05, 0), 0) 경조비
FROM emp;
-- 3) 이익을 배분하기 위해 comm의 150%를 보너스로 지급하려 한다. comm이 있는 직원들을 대상으로
-- 직원번호, 직원명, 급여, comm의 150%를 소숫점이하 올림하여 출력하라. (comm이 0이거나, null이면 제외)
SELECT empno, ename, sal, ceiling(comm*1.5) bonus
FROM emp
WHERE comm IS NOT NULL AND comm != 0;
-- ################## 날짜 함수 실습 ######################
-- 1)입사일로부터 100일이 지난 후를 구해보자. 사원이름, 입사일, 100일 후의 날, 급여를 출력하라.
SELECT ename, hiredate, date_add(hiredate, interval 100 day) '100일 후의 날', sal
FROM emp;
-- 2) 입사일로부터 6개월이 지난 후의 날짜를 구하려고 한다. 입사일, 6개월 후의 날짜, 급여를 출력하라
SELECT hiredate, date_add(hiredate, interval 6 month) '6개월 후의 날', sal
FROM emp;
-- 3) 입사한 달의 근무일수를 계산하여 부서번호, 이름, 근무일수를 출력하라.
SELECT deptno, ename, datediff(last_day(hiredate), hiredate) + 1 근무일수
FROM emp;
-- 4) 모든 사원의 입사일 기준으로 100일이 지난 후의 월요일의 날짜를 구해서 이름, 입사일,’MONDAY’를 출력하라.
SELECT ename, hiredate, date_add(date_add(hiredate, interval 100 day)
, interval (7 - weekday(date_add(hiredate, interval 100 day))) % 7 day) MONDAY
FROM emp;
-- 5) 입사일로부터 오늘까지의 일수를 구하여 이름, 입사일, 근무일수를 출력하라.
SELECT ename, hiredate, datediff(curdate(), hiredate) + 1 근무일수
FROM emp;
-- 6) 직원의 이름, 근속년수를 구하여 출력하라.
SELECT ename, truncate(datediff(curdate(), hiredate) / 365, 0) 근속년수
FROM emp;
-- 7) 입사일부터 지금까지의 날짜수를 출력하라. 부서번호, 이름, 입사일, 현재일,
-- 근무일수(소수점 이하 절삭), 근무년수, 근무월수(30일 기준), 근무주수를 출력하라.
SELECT
deptno,
ename,
hiredate,
CURDATE(),
DATEDIFF(CURDATE(), hiredate) + 1 근무일수,
TRUNCATE((DATEDIFF(CURDATE(), hiredate) + 1) / 365, 0) 근무년수,
TRUNCATE((DATEDIFF(CURDATE(), hiredate) + 1) / 30, 0) 근무월수,
TRUNCATE((DATEDIFF(CURDATE(), hiredate) + 1) / 7, 0) 근무주수
FROM emp;
#timestampdiff(year, curdate(), hiredate)
SELECT
deptno,
ename,
hiredate,
CURDATE(),
DATEDIFF(CURDATE(), hiredate) + 1 근무일수,
timestampdiff(year, hiredate, curdate()) 근무년수,
timestampdiff(month, hiredate, curdate()) 근무월수,
timestampdiff(week, hiredate, curdate()) 근무주수
FROM emp;
-- ################## 변환 함수 실습 ######################
-- 1) 모든 직원의 이름과 입사일을 ‘1996-5-14’의 형태로 출력 하라.
SELECT ename, date_format(hiredate, '%Y-%m-%d') 입사일
FROM emp;
-- 2) 모든 직원의 이름과 입사년과 입사월만 '1981.05' 형식으로 출력하라
SELECT ename, date_format(hiredate, '%Y.%m') 입사년월
FROM emp;
-- 3) 모든 직원의 번호, 이름, 급여를 출력하라. 단, 급여앞에 화폐표시($), 그리고 천단위(,)표시, 소수점이하 2자리가 표시되도록 하라.
SELECT empno, ename, concat('$', format(sal, 2))
FROM emp;
-- 4) 모든 직원의 이름과 입사한 요일을 출력하라.
SELECT ename, dayname(hiredate) 요일
FROM emp;
SELECT ename, substr('월화수목금토일', weekday(hiredate) + 1, 1) 요일
FROM emp;
SELECT ename, date_format(hiredate, '%a') 요일
FROM emp;
-- 5) 문자로 입력된 '20211123' 이라는 값이 날짜로 인식되도록 변경하여 출력하여 보자.
SELECT convert('20211123', date) 날짜;
SELECT date('20211123') 날짜;
SELECT date_format('20211123', '%Y-%m-%d') 날짜;
SELECT str_to_date('20211123', '%Y%m%d') 날짜;
-- ################## 일반 함수 실습 ######################
-- 1) 모든 직원의 이름, 급여, 커미션을 출력하라. 단, comm이 null이면 '없음'으로 출력하라.
SELECT ename, sal, ifnull(comm, '없음') comm
FROM emp;
-- 2) 모든 직원의 이름, 급여, 커미션, 연봉을 출력하라.
-- 보너스는 comm이 null이면 10
SELECT ename, sal, comm, sal*12+ifnull(comm, 10) 연봉
FROM emp;
-- 3) 모든 직원의 이름, 직무, 급여, 커미션, 보너스를 출력하라.
-- 보너스는 직무가 MANAGER이면 급여의 150%, 그외 직원은 급여의 130% 이다.
SELECT ename, job, sal, comm, sal*if(job='MANAGER', 1.5, 1.3) bonus
FROM emp;
-- 4) mgr2 컬럼을 하나 더 만들어서
-- mgr이 null이면 상위담당자/ null이 아니면 mgr값을 가지도록 한다.
SELECT ename, mgr, ifnull(mgr, '상위담당자') mgr2
FROM emp;