MySQL 2일차

진창호·2023년 2월 2일
0

MySQL

목록 보기
2/6

MySQL은 내장 함수를 가진다.

MySQL 내장 함수는 단일행 함수, 다중행 함수가 있다.

단일행 함수부터 살펴보자. 아래와 같은 단일행 함수가 있다.

  1. 숫자 관련 함수
    숫자 관련 함수

TRUNCATE를 쓸 때는 자릿수 표현이 필수임을 기억하자. 실행 결과는 아래와 같다.

  1. 문자 관련 함수
    문자 관련 함수 1
    문자 관련 함수 2

MySQL의 Index는 1부터 시작함을 명심하자.

  1. 날짜 관련 함수
    날짜 관련 함수 1
    날짜 관련 함수 2

DATE_FORMAT의 형식은 아래와 같다.

DATE_FORMAT

  1. 논리 관련 함수
    논리 관련 함수

이번엔 다중행 함수를 살펴보자. 대표적인 다중행 함수는 집계 함수이다.

  1. 집계 함수
    집계 함수

단일행 함수, 다중행 함수는 같은 SELECT에서 사용이 불가능하다.


MySQL은 GROUP BY, HAVING 절을 지원한다.

GROUP BY는 테이블의 행을 그룹으로 묶는 역할을 한다.
HAVING은 그룹에 조건을 주는 역할을 한다.
실행 순서는 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순이다.
하지만 MySQL은 GROUP BY에서 SELECT ALIAS를 접근할 수 있다.

실습 위주로 GROUP BY를 익혀보자. 데이터 구조는 아래와 같다.
데이터 구조

  1. 부서 번호, 부서별 급여의 총합, 평균급여
SELECT department_id, SUM(salary), AVG(salary)
FROM employees
WHERE department_id IS NOT null
GROUP BY department_id;
  1. 각 부서별 최고 급여와 최저 급여
SELECT MAX(salary), MIN(salary)
FROM employees
WHERE department_id IS NOT null
GROUP BY department_id;
  1. 40, 50, 60번 부서에서 근무하는 사원들중 job_id별 급여 합이 50000보다 큰 job_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;
  1. 부서별 평균 급여가 20번 부서의 평균 급여보다 큰 부서의 부서번호, 평균 급여
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);

MySQL은 트랜잭션 작성이 가능하다.

트랜잭션이란 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') 데이터만 들어가 있다.

profile
백엔드 개발자

0개의 댓글