MySQL 내장 함수는 단일행 함수, 다중행 함수가 있다.
단일행 함수부터 살펴보자. 아래와 같은 단일행 함수가 있다.
- 숫자 관련 함수
TRUNCATE를 쓸 때는 자릿수 표현이 필수임을 기억하자. 실행 결과는 아래와 같다.
- 문자 관련 함수
MySQL의 Index는 1부터 시작함을 명심하자.
- 날짜 관련 함수
DATE_FORMAT의 형식은 아래와 같다.
- 논리 관련 함수
이번엔 다중행 함수를 살펴보자. 대표적인 다중행 함수는 집계 함수이다.
- 집계 함수
단일행 함수, 다중행 함수는 같은 SELECT에서 사용이 불가능하다.
GROUP BY는 테이블의 행을 그룹으로 묶는 역할을 한다.
HAVING은 그룹에 조건을 주는 역할을 한다.
실행 순서는 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순이다.
하지만 MySQL은 GROUP BY에서 SELECT ALIAS를 접근할 수 있다.
실습 위주로 GROUP BY를 익혀보자. 데이터 구조는 아래와 같다.
SELECT department_id, SUM(salary), AVG(salary)
FROM employees
WHERE department_id IS NOT null
GROUP BY department_id;
SELECT MAX(salary), MIN(salary)
FROM employees
WHERE department_id IS NOT null
GROUP BY department_id;
SELECT job_id, AVG(salary)
FROM employees
WHERE department_id in (40, 50, 60)
GROUP BY job_id
HAVING SUM(salary) > 50000
ORDER BY 2 DESC;
SELECT department_id, AVG(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary)
FROM employees
WHERE department_id = 20);
트랜잭션이란 DB의 상태를 변화시키는 연산의 단위를 의미한다.
트랜잭션을 사용자가 작성하기 위해선 AUTOCOMMIT 기능을 꺼야한다. 끄는 방법은 아래와 같다.
select @@autocommit; // autocommit 상태 확인
set autocommit = 0; // autocommit 끄기
AUTOCOMMIT이란 트랜잭션을 자동으로 물리적 DB에 적용하는 걸 의미한다. 따라서 해당 기능을 꺼야 사용자가 트랜잭션을 작성하고 물리적 DB에 적용할 수 있다.
아래 코드는 commit을 수행하는 걸 보여준다.
insert into sam111 values(null, 'a');
insert into sam111 values(null, 'b');
insert into sam111 values(null, 'c');
commit();
-- DDL, DCL 실행 시 COMMIT 자동 실행
select * from sam111;
select 결과는 3개의 데이터가 잘 들어가 있다.
아래 코드는 rollback을 수행하는 걸 보여준다.
insert into sam111 values(null, 'a');
insert into sam111 values(null, 'b');
insert into sam111 values(null, 'c');
rollback();
select * from sam111;
select 결과는 아무것도 출력되지 않는다.
특정 포인트로 이동할 수도 있다. 아래 코드는 이를 보여준다.
insert into sam111 values(null, 'a');
savepoint f1;
insert into sam111 values(null, 'b');
insert into sam111 values(null, 'c');
rollback to f1;
select * from sam111;
select 결과는 values(null, 'a') 데이터만 들어가 있다.