MySQL 기능: 문자열, 숫자, 사용자 정의, 저장
⚡ 스마트 요약
MySQL 함수는 데이터를 저장하거나 검색하기 전에 데이터를 변환하여 단일 계산 결과를 반환합니다. 이 문서에서는 내장 문자열, 숫자 및 날짜 함수를 설명하고, 저장된 함수와 사용자 정의 함수를 사용하여 데이터베이스 엔진 자체를 확장하는 방법을 보여줍니다.

무엇인가 MySQL 함수요?
MySQL 데이터를 저장하고 검색하는 것 이상의 일을 할 수 있습니다.. 또한 수 데이터를 조작하다 검색하거나 저장하기 전에. 바로 그곳입니다. MySQL 함수가 등장합니다. 함수는 간단히 말해 연산을 수행하고 결과를 반환하는 코드 조각입니다. 어떤 함수는 매개변수를 받지만, 어떤 함수는 매개변수를 받지 않습니다.
간단한 예를 살펴보겠습니다. 기본적으로, MySQL 날짜 데이터 형식을 "YYYY-MM-DD" 형식으로 저장합니다. 예를 들어, 애플리케이션을 개발했는데 사용자가 날짜를 "DD-MM-YYYY" 형식으로 반환받기를 원한다고 가정해 보겠습니다. 이 경우 다음과 같이 사용할 수 있습니다. MySQL 이를 위해 내장 함수 DATE_FORMAT을 사용할 수 있습니다. DATE_FORMAT은 가장 많이 사용되는 함수 중 하나입니다. MySQL그리고 우리는 이 내용을 이번 수업 후반부에서 자세히 살펴보겠습니다.
함수의 유형과 관계없이, 항상 단일 값을 반환합니다., 매개변수를 0개 이상 허용할 수 있습니다. 괄호 안에 그리고 표현식이 허용되는 모든 곳에서 사용할 수 있습니다. — SELECT 목록, WHERE 절 또는 ORDER BY 절에서 사용됩니다.
왜 사용 하는가? MySQL 함수요?
함수가 무엇인지 알았으니, 다음 질문은 왜 이 작업을 데이터베이스에 저장해야 하는가입니다.
위 다이어그램에서 볼 수 있듯이, 함수는 입력값을 받아 데이터베이스 엔진 내부에서 한 번 논리를 적용한 후, 해당 결과를 요청하는 모든 애플리케이션에 단일 결과를 반환합니다.
프로그래머들은 "굳이 왜 이런 수고를 해야 하지?"라고 생각할지도 모릅니다. MySQL 함수요? 스크립팅 언어나 프로그래밍 언어를 사용하면 똑같은 효과를 얻을 수 있습니다." 응용 프로그램에 프로시저를 작성하면 그런 효과를 얻을 수 있다는 것은 사실입니다.
다시 날짜 예시로 돌아가서, 사용자가 원하는 형식으로 데이터를 얻으려면 비즈니스 계층에서 필요한 처리를 직접 수행해야 합니다.
이는 애플리케이션이 다른 시스템과 통합되어야 할 때 문제가 됩니다. 우리가 사용할 때 MySQL DATE_FORMAT과 같은 함수는 데이터베이스에 내장되어 있으며, 해당 데이터가 필요한 모든 애플리케이션은 원하는 형식으로 데이터를 얻을 수 있습니다. 비즈니스 로직의 재작업을 줄이고 데이터 불일치를 감소시킵니다..
고려해야 할 또 다른 이유 MySQL 이러한 기능의 핵심은 클라이언트/서버 애플리케이션에서 네트워크 트래픽을 줄이는 데 도움이 될 수 있다는 것입니다.비즈니스 계층에서는 네트워크를 통해 원시 데이터를 가져와 조작할 필요 없이 저장된 함수를 호출하기만 하면 됩니다. 평균적으로 함수를 사용하면 시스템 성능이 크게 향상될 수 있습니다.
유형 MySQL 기능
"무엇"과 "왜"가 명확해졌으므로 이제 세 가지 기능 유형을 살펴보겠습니다. MySQL 제공하는 기능으로는 내장 함수, 저장 함수 및 사용자 정의 함수가 있습니다.
내장 기능
MySQL 이 제품에는 이미 구현된 여러 내장 함수가 함께 제공됩니다. MySQL 서버는 데이터에 대해 다양한 유형의 조작을 수행할 수 있도록 해주며, 일반적으로 사용되는 다음과 같은 그룹으로 분류됩니다.
- 문자열 함수 – 문자열 데이터 유형에서 작동
- 숫자 함수 – 숫자형 데이터 유형에서 작동
- 날짜 기능 – 날짜 데이터 유형에서 작동
- 집계 함수 – 위의 모든 데이터 유형을 처리하고 요약된 결과 세트를 생성합니다.
- 다른 기능 - MySQL 이 외에도 다른 유형의 내장 함수도 지원하지만, 이 강의에서는 위에 언급된 그룹에 대해서만 다루겠습니다.
이제 위에서 언급한 각 그룹을 자세히 살펴보겠습니다. "Myflixdb" 샘플 데이터베이스를 사용하여 가장 많이 사용되는 기능들을 설명하겠습니다.
문자열 함수
문자열 함수는 텍스트 값에 대해 작동합니다. 영화 테이블에는 제목이 소문자와 대문자가 혼합되어 저장되어 있습니다. 모든 제목을 대문자로 반환하는 쿼리를 실행하고 싶다고 가정해 보겠습니다. "UCASE" 함수는 매개변수로 문자열을 받아 모든 문자를 대문자로 변환합니다. 아래 스크립트가 이를 보여줍니다.
SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;
여기를 클릭하십시오.
- UCASE(`title`) 이 함수는 제목을 매개변수로 받아 대문자로 반환하는 내장 함수입니다.
- AS `upper_case_title` 계산된 열에 별칭을 지정하여 결과 집합에 원시 표현식 대신 읽기 쉬운 헤더가 포함되도록 합니다.
위 스크립트를 실행하면 MySQL Workbench를 사용하여 Myflixdb를 테스트한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 대문자 제목 |
|---|---|---|
| 16 | 67% 유죄 | 67% 유죄 |
| 6 | 천사와 악마 | 천사와 악마 |
| 4 | Code 이름 블랙 | 코드네임 블랙 |
| 5 | 아빠의 어린 소녀들 | 아빠의 작은 딸들 |
| 7 | 다 빈치 Code | 다빈치 코드 |
| 2 | 사라 마샬을 잊어버림 | 사라 마샬을 잊다 |
| 9 | Honey moon | 꿀 MOONERS |
| 19 | 영화 3 | 영화 3 |
| 1 | 캐리비안의 해적 4 | 캐리비안의 해적 4 |
| 18 | 샘플 영화 | 샘플 영화 |
| 17 | 위대한 독재자 | 위대한 독재자 |
| 3 | 엑스 맨 | X-MEN |
UCASE와 함께 기억할 만한 두 명의 동료가 있습니다. LCASE 문자열을 소문자로 변환합니다. CONCAT 두 개 이상의 문자열을 하나로 결합합니다. 전체 목록은 다음을 참조하세요. MySQL 문자열 함수 참조.
숫자 함수
앞서 언급했듯이 숫자 함수는 숫자 데이터 형식에 대해 작동합니다. 또한 SQL 문에서 숫자 데이터에 대한 수학적 계산을 직접 수행할 수도 있습니다.
산술 연산자
MySQL SQL 문에서 계산을 수행하는 데 사용할 수 있는 다음과 같은 산술 연산자를 지원합니다.
| 이름 | 기술설명 |
|---|---|
| DIV | 정수 나누기 |
| / | 분할 |
| - | 서브trac기 |
| + | 추가 |
| * | 곱셈 |
| % 또는 MOD | 모듈러스 |
각 연산자의 예시는 다음과 같습니다.
정수 나눗셈(DIV) — DIV 연산자는 소수 부분을 버리고 정수 부분만 반환합니다.
SELECT 23 DIV 6;
위 스크립트를 실행하면 다음과 같은 결과가 나옵니다. 3.
나누기 연산자 (/) — DIV 연산자와 달리 나눗셈 연산자는 결과의 소수 부분을 유지합니다.
SELECT 23 / 6;
위 스크립트를 실행하면 다음과 같은 결과가 나옵니다. 3.8333.
서브trac연산자(-)
SELECT 23 - 6;
위 스크립트를 실행하면 다음과 같은 결과가 나옵니다. 17.
덧셈 연산자(+)
SELECT 23 + 6;
위 스크립트를 실행하면 다음과 같은 결과가 나옵니다. 29.
곱셈 연산자 (*)
SELECT 23 * 6 AS `multiplication_result`;
결과 :
| 곱셈_결과 |
|---|
| 138 |
나머지 연산자(% 또는 MOD)
나머지 연산자는 N을 M으로 나누고 나머지를 구합니다. 이전 예제와 동일한 값을 사용하여 나머지 연산자 예제를 살펴보겠습니다.
SELECT 23 % 6; -- OR, equivalently: SELECT 23 MOD 6;
두 스크립트 중 하나를 실행하면 다음과 같은 결과가 나옵니다. 5.
이제 일반적인 숫자 함수 중 일부를 살펴보겠습니다. MySQL.
바닥 이 함수는 숫자의 소수점을 제거하고 가장 가까운 정수로 내림합니다. 아래 스크립트는 이 함수의 사용법을 보여줍니다.
SELECT FLOOR(23 / 6) AS `floor_result`;
결과 :
| 바닥 결과 |
|---|
| 3 |
라운드 이 함수는 숫자를 가장 가까운 정수로 반올림합니다. 23 / 6은 3.8333이므로 ROUND 함수는 4를 반환하고 FLOOR 함수는 3을 반환합니다. 따라서 두 함수는 서로 바꿔 사용할 수 없습니다.
SELECT ROUND(23 / 6) AS `round_result`;
결과 :
| 라운드 결과 |
|---|
| 4 |
RAND 이 함수는 난수를 생성합니다. 생성된 난수의 값은 함수가 호출될 때마다 변경됩니다. 아래 스크립트는 이 함수의 사용법을 보여줍니다.
SELECT RAND() AS `random_result`;
날짜 기능
날짜 관련 함수는 날짜 및 날짜-시간 데이터 형식에 대해 작동합니다. DATE_FORMAT 함수는 서론에서 설명한 "YYYY-MM-DD와 DD-MM-YYYY" 형식 문제를 해결합니다.
날짜 형식 이 함수는 두 개의 매개변수를 받습니다. 하나는 형식을 지정할 날짜 값이고, 다른 하나는 자리 표시자로 구성된 형식 문자열입니다. 아래 스크립트는 사용자들이 요청한 일-월-년 형식으로 각 출시일을 반환합니다.
SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date` FROM `movies`;
가장 자주 사용되는 서식 자리 표시자는 다음과 같습니다.
| 자리 표시 자 | 의미 | 출력 예 |
|---|---|---|
| %d | 월의 일, 두 자리 숫자 | 04 |
| %m | 월, 두 자리 숫자 | 08 |
| %Y | 연도, 네 자리 숫자 | 2012 |
| %M | 월 이름 (전체) | XNUMX 월 |
| %그의 | Hours분, 초 | 14:35:09 |
일상 업무에서 끊임없이 등장하는 날짜 관련 기능은 다음과 같습니다.
- CURDATE () 현재 날짜를 YYYY-MM-DD 형식으로 반환합니다.
- 지금() 현재 날짜를 반환합니다 시간.
- DATEDIFF(d1, d2) 두 날짜 사이의 일수를 반환합니다. 이는 연체 임대 보고서의 기초가 됩니다.
전체 목록은 다음을 참조하세요. MySQL 날짜 및 시간 기능 참조.
저장된 기능
내장 함수는 일반적인 경우를 처리합니다. 비즈니스 규칙이 더 구체적일 때는 직접 함수를 작성하는데, 이때 저장 함수를 사용합니다.
저장 함수는 내장 함수와 똑같이 동작하지만, 직접 정의해야 한다는 점이 다릅니다. 일단 생성되면 저장 함수는 다른 함수처럼 SQL 문에서 사용할 수 있습니다. 기본 구문은 아래와 같습니다.
CREATE FUNCTION sf_name ([parameter(s)]) RETURNS data_type [DETERMINISTIC | NOT DETERMINISTIC] BEGIN -- procedural statements END
여기를 클릭하십시오.
- “함수 sf_name ([매개변수]) 생성” 필수 사항이며 다음과 같이 알려줍니다. MySQL 서버는 괄호 안에 정의된 선택적 매개변수를 사용하여 `sf_name`이라는 이름의 함수를 생성합니다.
- “데이터 유형을 반환합니다” 필수 항목이며 함수가 반환하는 데이터 유형을 지정합니다.
- “결정적” 이 함수는 동일한 인수가 제공될 때마다 동일한 값을 반환함을 선언합니다. "결정론적이지 않음" 정반대를 주장합니다.
- “시작… 끝” 함수가 실행하는 절차적 코드를 래핑합니다.
대여한 영화 중 반납 기한이 지난 영화를 알고 싶다고 가정해 보겠습니다. 반납 기한을 매개변수로 받아 서버의 현재 날짜와 비교하는 저장 함수를 만들 수 있습니다. 현재 날짜가 반납 기한보다 크면 해당 영화는 반납 기한이 지났으므로 "Yes"를 반환하고, 그렇지 않으면 "No"를 반환합니다.
DELIMITER | CREATE FUNCTION sf_past_movie_return_date (return_date DATE) RETURNS VARCHAR(3) NOT DETERMINISTIC BEGIN DECLARE sf_value VARCHAR(3); IF CURDATE() > return_date THEN SET sf_value = 'Yes'; ELSEIF CURDATE() <= return_date THEN SET sf_value = 'No'; END IF; RETURN sf_value; END| DELIMITER ;
⚠️ 경고 — 이 함수에 DETERMINISTIC이라는 레이블을 붙이지 마십시오. 본문에서 CURDATE()를 호출하므로 동일한 인수가 오늘 "아니오"를 반환하고 내일 "예"를 반환할 수 있습니다. 시간에 따라 달라지는 함수를 DETERMINISTIC으로 선언하면 최적화 프로그램이 오도되어 문장 기반 복제에 안전하지 않습니다. 다른 방법을 사용하십시오. 비결정적 본문이 CURDATE(), NOW(), 또는 RAND()를 호출할 때마다.
위 스크립트를 실행하면 `sf_past_movie_return_date`라는 저장 함수가 생성됩니다. 이제 이 함수를 테스트해 보겠습니다.
SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(), sf_past_movie_return_date(`return_date`) AS `is_overdue` FROM `movierentals`;
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb를 테스트한 결과는 다음과 같습니다.
| 영화_ID | 회원_번호 | 반환 기일 | CURDATE () | 기한이 지났습니다 |
|---|---|---|---|---|
| 1 | 1 | NULL | 04-08-2012 | NULL |
| 2 | 1 | 25-06-2012 | 04-08-2012 | 가능 |
| 2 | 3 | 25-06-2012 | 04-08-2012 | 가능 |
| 2 | 2 | 25-06-2012 | 04-08-2012 | 가능 |
| 3 | 3 | NULL | 04-08-2012 | NULL |
두 개의 NULL 행을 확인하세요. `return_date`가 NULL일 경우, 두 비교 모두 TRUE 또는 FALSE가 아닌 NULL로 평가되므로 두 IF 분기 모두 실행되지 않고 함수는 NULL을 반환합니다. 이는 반환되지 않은 영화에는 비교할 반환일이 없으므로 예상되는 결과입니다.
사용자 정의 함수
SQL만으로는 속도가 충분하지 않을 때, MySQL 세 번째 옵션을 제공합니다. 사용자 정의 함수(UDF)는 컴파일 언어로 작성됩니다. C or C++사용자 정의 함수(UDF)는 공유 라이브러리에 내장되어 서버에 등록됩니다. 등록 후에는 다른 함수처럼 호출할 수 있습니다. UDF는 서버 프로세스 내에서 네이티브 코드로 실행되므로 고성능 연산에 적합하지만, 버그가 발생하면 서버가 다운될 수 있으므로 저장 함수보다 사용 빈도가 훨씬 낮습니다.
내장 함수, 저장된 함수, 사용자 정의 함수: 어떤 것을 사용해야 할까요?
이 세 가지 함수 계열은 모두 단일 값을 반환하며 모든 SQL 문에서 호출할 수 있지만, 작성자, 실행 위치 및 위험도 측면에서 차이가 있습니다. 아래 표는 이러한 차이점을 요약한 것입니다.
| 표준 | 내장 기능 | 저장된 기능 | 사용자 정의 함수(UDF) |
|---|---|---|---|
| 누가 썼나요? | 함께 제공 MySQL | SQL에서 당신 | 당신은 C 또는 C++ |
| 그것이 사는 곳 | 서버 내부 | CREATE FUNCTION을 사용하여 생성된 데이터베이스 내부 | 서버에서 로드된 컴파일된 공유 라이브러리 |
| 일반적인 사용 | 서식, 수학, 집계 | 연체 수표와 같은 재사용 가능한 비즈니스 규칙 | SQL로는 표현할 수 없는 CPU 집약적이거나 특수한 로직 |
| 주요 위험 | 없음 | 대규모 테이블에서 행별로 호출하면 속도가 느립니다. | 라이브러리 시스템 오류로 서버가 다운될 수 있습니다. |
일반적으로 내장 함수부터 시작해 보세요. 적합한 함수가 없다면 저장 함수를 작성하여 규칙을 한 곳에 저장해 두세요. 저장 함수의 속도가 현저히 느릴 때만 사용자 정의 함수(UDF)를 사용하세요.

