MySQL
MySQL - ANSI SQL 표준과 주요 함수
jiyoon12
2025. 5. 16. 17:30
1. ANSI (미국국가표준협회, American National Standards Institute) SQL 표준
- 데이터베이스 관리 시스템(DBMS)의 호환성, 일관성, 이식성을 보장하기 위해 SQL 표준을 정의한다.
- ANSI SQL은 SQL:1992, SQL:1999, SQL:2011, SQL:2016 등 버전으로 발전하며, 각 버전은 윈도우 함수, JSON 지원 등 새로운 기능을 추가했다.
- 주요 목표: 다양한 DBMS 간 쿼리 호환성 보장, SQL 문법과 기능의 일관된 사용 제공, SQL 코드의 DBMS 간 이식성 향상.
2. 주요 ANSI SQL 함수
2-1. 집계 함수
- COUNT(): 특정 조건을 만족하는 행의 수 반환.
- SUM(): 숫자 열의 합 계산.
- AVG(): 숫자 열의 평균 계산.
- MAX() / MIN(): 열의 최대/최소값 반환.
2-2. 문자열 함수
- CONCAT() 문자열 결합 .
- UPPER() / LOWER(): 문자열을 대문자/소문자로 변환.
- TRIM(): 문자열 양쪽의 특정 문자(예: 공백) 제거.
- SUBSTRING(): 문자열의 특정 부분 추출.
2-3. 논리 및 조건 함수
- CASE: 조건에 따라 다른 결과 반환 (SQL의 조건문).
- COALESCE(): 첫 번째 NULL이 아닌 값 반환.
2-4. 날짜 및 시간 함수
- CURRENT_DATE: 현재 날짜 반환.
- CURRENT_TIME: 현재 시간 반환.
- CURRENT_TIMESTAMP: 현재 날짜와 시간 반환.
- EXTRACT(): 날짜/시간에서 특정 부분(년, 월, 일 등) 추출.
2-5. 형 변환 함수
- CAST(): 데이터 타입 변환 (예: 문자열 → 숫자, 날짜 → 문자열).
- 테이블 생성과 데이터 삽입
-- ANSI 표준 함수 사용해보기
create database my_emp_db;
use my_emp_db;
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10, 2), -- 최대 99999999.99
hire_date DATE
);
INSERT INTO employees (id, name, department, salary, hire_date) VALUES
(1, '김철수', '인사부', 3000000.00, '2024-03-01'),
(2, '박영희', '개발부', 4000000.00, '2024-06-15'),
(3, '이민준', '기획부', 3500000.00, '2023-01-10'),
(4, '최지아', '마케팅부', 3200000.00, '2024-05-21'),
(5, '한수연', '영업부', 2900000.00, '2021-12-30');
select * from employees;
-- 테이블 복사
create table new_employees
as select * from employees;
select * from new_employees;
- ANSI SQL 함수 사용 사용해보기
select * from new_employees;
-- 1. 집계 함수
-- 평균 구하기
select avg(salary) as avg_salary
from new_employees;
-- 반올림, 소수점 n 자리까지 처리
select round (avg(salary), 2) as avg_salary
from new_employees;
-- 행의 수 반환
select count(*) as d_count
from new_employees;
-- 안되는 쿼리(논리적, 물리적)
-- select count(*) as d_count, name
-- from new_employees;
-- 2. 문자열 함수
-- 2.1 문자열에 문자열을 결합하고 대문자, 소문자로 변환
select concat('mr/ms ', name) as formal_name
from new_employees;
-- 대문자
select concat(upper('mr/ms '), name) as formal_name
from new_employees;
-- 소문자
select concat(lower('mr/ms '), name) as formal_name
from new_employees;
-- 문자열 추출 함수(문자열 잘라내기)
select *, substring(name, 1, 2) as formal_name
from new_employees;
-- 잘라낸 문자열에 cncat() 활용해서 문자 붙이기
select *, concat(substring(name, 1, 2), '*') as formal_name
from new_employees;
-- 3. 논리 및 조건 함수
-- 3.1 case when then else 구문
-- 현재 데이터베이스(my_emp_db) 사용
select *,
case when employees.gender = 'M' then '남자' else '여자' end as formal_gender
from employees.employees;
-- employees.employees
-- 4. 날짜 및 시간 함수
-- 4.1 오늘 날짜 반환
select current_date() as today;
select current_date as today; -- () 없이도 가능
-- 4.2 날짜 차이 계산
-- datediff : 두 날짜 간의 일수 차이를 계산하여 반환 하는 함수
-- 날짜 일수 차이 반환
select *,
datediff(current_date, hire_date) as years_working
from new_employees;
-- datediff 날짜 차이 계산 / 365.0 처리
select *,
datediff(current_date, hire_date) / 365.0 as years_working
from new_employees;
-- floor 소수점 버림
select *,
floor(datediff(current_date, hire_date) / 365.0) as years_working
from new_employees;
-- 5. 형 변환 함수
-- dicimal --> 형 변환 -- 문자열 (varchar는 가변길이라서 안됨)
select *, cast(salary as varchar(20)) as salary_text
from new_employees;
-- 5.1 형 변환 함수 사용
-- dicimal --> 형 변환 -- 문자열(고정길이 char 써야함)
select *, cast(salary as char(20)) as salary_text
from new_employees;
-- 5.2 형 변환 함수 + 문자열 더하기 함수 사용
select *, concat(cast( salary as char), "원") as formal_salary
from new_employees;
-- 5.3 형 변환 함수 + 문자열 더하기 함수 사용
select *, concat("$", cast( salary as char), "원") as formal_salary
from new_employees;