MySQL Funcții: șir, numeric, definit de utilizator, stocat

⚡ Rezumat inteligent

MySQL Funcțiile transformă datele înainte de a fi stocate sau recuperate, returnând un singur rezultat calculat. Acest articol explică funcțiile de tip șir, numerice și de dată încorporate, apoi arată cum funcțiile stocate și definite de utilizator extind motorul bazei de date în sine.

  • 🔤 Funcții de șiruri de caractere: UCASE, LCASE și CONCAT remodelează textul în momentul interogării; asociază coloana calculată cu AS, astfel încât setul de rezultate să conțină un antet lizibil.
  • 🔢 Numeric Operators: DIV efectuează împărțirea între numere întregi, / returnează un cotient zecimal, iar % (sau MOD) returnează restul unei împărțiri.
  • 📅 Funcții de dată: DATE_FORMAT convertește valoarea stocată AAAA-LL-ZZ în orice model de afișare, cum ar fi %d-%m-%A, fără a modifica nicio linie de cod al aplicației.
  • 🛠️ Funcții stocate: Funcția CREATE FUNCTION înregistrează logica reutilizabilă în cadrul serverului; declară-o NOT DETERMINISTIC ori de câte ori corpul apelează CURDATE() sau NOW().
  • ⚙️ Funcții definite de utilizator: Rutine externe scrise în C sau C++ sunt compilate în server și apoi se comportă exact ca funcțiile native.
  • 🚀 Impactul asupra performanței: Introducerea calculelor în baza de date elimină logica duplicată din fiecare aplicație client și reduce parcurgerea traseelor ​​de rețea.

Care sunt MySQL Funcții?

MySQL poate face mult mai mult decât doar stocarea și preluarea datelor. Poate deasemenea efectuează manipulări asupra datelor înainte de a-l recupera sau salva. Acolo este locul unde MySQL Funcțiile intervin. Funcțiile sunt pur și simplu bucăți de cod care efectuează o operație și apoi returnează un rezultat. Unele funcții acceptă parametri, în timp ce altele nu acceptă niciunul.

Să luăm pe scurt un exemplu. În mod implicit, MySQL salvează tipurile de date de tip dată în formatul „AAAA-LL-ZZ”. Să presupunem că am construit o aplicație și utilizatorii noștri doresc ca data să fie returnată în formatul „ZZ-LL-AAAA”. Putem folosi MySQL funcția încorporată DATE_FORMAT pentru a realiza acest lucru. DATE_FORMAT este una dintre cele mai utilizate funcții în MySQLși vom analiza acest lucru în detaliu mai târziu în această lecție.

Indiferent de tipul său, o funcție returnează întotdeauna o singură valoare, poate accepta zero sau mai mulți parametri între paranteze și poate fi folosit oriunde este permisă o expresie — într-o listă SELECT, o clauză WHERE sau o clauză ORDER BY.

De ce folosiți MySQL Funcții?

Acum, că știm ce este o funcție, următoarea întrebare este de ce ar trebui să inserăm această lucrare în baza de date.

De ce sa folosim MySQL funcţii

După cum arată diagrama de mai sus, o funcție primește o valoare de intrare, aplică logica odată ce se află în motorul bazei de date și returnează un singur rezultat fiecărei aplicații care îl solicită.

Programatorii s-ar putea gândi: „De ce să te mai deranjezi să MySQL „Funcții? Același efect poate fi obținut cu un limbaj de scripting sau de programare.” Este adevărat că putem obține acest lucru scriind o procedură în programul aplicației.

Revenind la exemplul nostru DATE, pentru ca utilizatorii noștri să obțină datele în formatul dorit, nivelul business ar trebui să efectueze singur procesarea necesară.

Aceasta devine o problemă atunci când aplicația trebuie să se integreze cu alte sisteme. Când folosim MySQL funcții precum DATE_FORMAT, această funcționalitate este încorporată în baza de date și orice aplicație care are nevoie de date le obține în formatul necesar. Aceasta reduce reluarea logicii de business și reduce inconsecvențele datelor.

Un alt motiv de luat în considerare MySQL funcțiile este că pot ajuta la reducerea traficului de rețea în aplicațiile client/serverNivelul business trebuie doar să apeleze funcția stocată, fără a extrage rânduri brute din rețea pentru a le manipula. În medie, utilizarea funcțiilor poate îmbunătăți considerabil performanța generală a sistemului.

Tipuri de MySQL funcţii

Odată ce „ce”-ul și „de ce”-ul sunt clarificate, putem acum analiza cele trei familii de funcții MySQL oferă: funcții încorporate, funcții stocate și funcții definite de utilizator.

Funcții încorporate

MySQL vine la pachet cu o serie de funcții încorporate — funcții deja implementate în MySQL server. Acestea ne permit să efectuăm multe tipuri de manipulări asupra datelor și se încadrează în următoarele grupuri utilizate în mod obișnuit.

  • Funcții șiruri – operați pe tipuri de date șir
  • Funcții numerice – operați pe tipuri de date numerice
  • Funcții de dată – operați pe tipuri de date de date
  • Funcții agregate – operați pe toate tipurile de date de mai sus și produceți seturi de rezultate rezumate.
  • Alte funcții - MySQL acceptă și alte tipuri de funcții încorporate, dar limităm această lecție la grupurile menționate mai sus.

Să analizăm acum în detaliu fiecare dintre grupurile menționate mai sus. Vom explica cele mai utilizate funcții folosind baza noastră de date exemplu „Myflixdb”.

Funcții șiruri

Funcțiile de tip șir de caractere operează asupra valorilor text. În tabelul nostru de filme, titlurile sunt stocate folosind o combinație de litere mici și majuscule. Să presupunem că dorim o interogare care returnează titlurile cu majuscule. Funcția „UCASE” primește un șir de caractere ca parametru și convertește fiecare literă în majuscule, așa cum demonstrează scriptul de mai jos.

SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;

AICI

  • UCASE(`titlu`) este funcția încorporată care primește titlul ca parametru și îl returnează cu litere majuscule.
  • AS `titlu_cu_majuscule` oferă coloanei calculate un alias, astfel încât setul de rezultate poartă un antet lizibil în loc de expresia brută.

Executarea scriptului de mai sus în MySQL Workbench-ul împotriva Myflixdb ne oferă rezultatele prezentate mai jos.

movie_id titlu titlu_cu_majuscule
16 67% vinovat 67% VINOVAȚI
6 ingeri si Demoni ÎNGERI ȘI DEMONI
4 Code Nume Black NUME DE COD NEGRU
5 Fetițele lui Tati FETIȚELE LUI TATA
7 Da Vinci Code CODUL DA VINCI
2 Uitând-o pe Sarah Marshal Uitând de Sarah Marshall
9 Honey mooners MIERE MOONRHS
19 filmul 3 FILM 3
1 Piratii din Caraibe 4 PIRATII DIN CARAIBE 4
18 film exemplu FILM EXEMPLU
17 The Great Dictator MARELE DICTATOR
3 X-Men X-MEN

Doi parteneri merită amintiți alături de UCASE: LCASE convertește un șir de caractere în litere mici și CONCAT unește două sau mai multe șiruri de caractere într-unul singur. Pentru lista completă, consultați MySQL referință funcție șir.

Funcții numerice

Așa cum am menționat anterior, funcțiile numerice operează asupra tipurilor de date numerice. De asemenea, putem efectua calcule matematice asupra datelor numerice direct în instrucțiunile noastre SQL.

Operatori aritmetici

MySQL acceptă următorii operatori aritmetici, care pot fi utilizați pentru a efectua calcule în instrucțiunile SQL.

Nume Descriere
DIV Diviziunea întregi
/ diviziune
- SubtracTION
+ Plus
* Multiplicare
% sau MOD coeficient

Urmează exemple pentru fiecare operator.

Împărțirea între numere întregi (DIV) — DIV elimină partea fracționară și returnează doar numărul întreg.

SELECT 23 DIV 6;

Executarea scriptului de mai sus ne oferă 3.

Operator de divizie (/) — spre deosebire de DIV, operatorul de împărțire păstrează partea zecimală a rezultatului.

SELECT 23 / 6;

Executarea scriptului de mai sus ne oferă 3.8333.

Subtracoperatorul de țiune (-)

SELECT 23 - 6;

Executarea scriptului de mai sus ne oferă 17.

Operator de adăugare (+)

SELECT 23 + 6;

Executarea scriptului de mai sus ne oferă 29.

operator de multiplicare (*)

SELECT 23 * 6 AS `multiplication_result`;

Rezultat:

multiplicare_rezultat
138

Operator modulo (% sau MOD)

Operatorul modulo împarte N la M și ne dă restul. Să analizăm exemplul operatorului modulo, folosind aceleași valori ca în exemplele anterioare.

SELECT 23 % 6;
-- OR, equivalently:
SELECT 23 MOD 6;

Executarea oricăruia dintre scripturi ne oferă 5.

Să ne uităm acum la unele dintre funcțiile numerice comune în MySQL.

PODEA – această funcție elimină zecimalele dintr-un număr și îl rotunjește la cel mai apropiat număr întreg. Scriptul prezentat mai jos demonstrează utilizarea sa.

SELECT FLOOR(23 / 6) AS `floor_result`;

Rezultat:

etaj_rezultat
3

RUNDA – această funcție rotunjește un număr la cel mai apropiat număr întreg. Deoarece 23 / 6 se evaluează la 3.8333, ROUND returnează 4, în timp ce FLOOR returnează 3 — cele două nu sunt interschimbabile.

SELECT ROUND(23 / 6) AS `round_result`;

Rezultat:

rezultat_rotunjit
4

MARGINE – această funcție generează un număr aleator. Valoarea sa se schimbă de fiecare dată când funcția este apelată. Scriptul de mai jos demonstrează utilizarea sa.

SELECT RAND() AS `random_result`;

Funcții de dată

Funcțiile de tip dată operează cu tipuri de date de tip dată și dată-oră. DATE_FORMAT este funcția care rezolvă problema „AAAA-LL-ZZ versus ZZ-LL-AAAA” descrisă în introducere.

FORMATUL DATEI primește doi parametri: valoarea datei de formatat și un șir de format construit din substituenți. Scriptul de mai jos returnează fiecare dată de lansare în stilul zi-lună-an solicitat de utilizatorii noștri.

SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date`
FROM `movies`;

Cele mai frecvent utilizate substituente de format sunt enumerate mai jos.

Înlocuitor Sens Exemplu de ieșire
%d Ziua lunii, două cifre 04
%m Lună, două cifre 08
%Y An, patru cifre 2012
%M Numele lunii în întregime August
%Lui Hours, minute, secunde 14:35:09

Alte trei funcții de dată apar constant în munca de zi cu zi:

  • CURDATE () returnează data curentă în format AAAA-LL-ZZ.
  • ACUM() returnează data curentă și timp.
  • DATEDIFF(d1, d2) returnează numărul de zile dintre două date — baza oricărui raport de chirii restante.

Pentru lista completă, consultați MySQL referință funcție dată și oră.

Funcții stocate

Funcțiile încorporate acoperă cazurile comune. Când o regulă de business este mai specifică, ne scriem propria regulă — și acesta este scopul unei funcții stocate.

Funcțiile stocate se comportă exact ca funcțiile predefinite, cu excepția faptului că le definiți singur. Odată creată, o funcție stocată poate fi utilizată în instrucțiuni SQL exact ca orice altă funcție. Sintaxa de bază este prezentată mai jos.

CREATE FUNCTION sf_name ([parameter(s)])
RETURNS data_type
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN
    -- procedural statements
END

AICI

  • „CREATE FUNCTION sf_name ([parametru(i)])” este obligatorie și îi spune MySQL server pentru a crea o funcție numită `sf_name` cu parametri opționali definiți în paranteze.
  • „RETURNĂ tipul_de_date” este obligatorie și specifică tipul de date returnat de funcție.
  • "DETERMINAT" declară că funcția returnează aceeași valoare ori de câte ori sunt furnizate aceleași argumente. „NU DETERMINIST” declară contrariul.
  • „ÎNCEPUT … SFÂRȘIT” încapsulează codul procedural pe care funcția îl execută.

Să presupunem că vrem să știm ce filme închiriate au depășit data de returnare. Putem crea o funcție stocată care acceptă data de returnare ca parametru și o compară cu data curentă de pe server. Dacă data curentă este mai mare decât data de returnare, filmul este scadent și returnăm „Da”; altfel returnăm „Nu”.

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 ;

⚠️ Atenție — nu etichetați această funcție drept DETERMINISTICĂ. Corpul apelează CURDATE(), deci același argument poate returna „Nu” astăzi și „Da” mâine. Declararea unei funcții dependente de timp DETERMINISTIC induce în eroare optimizatorul și nu este sigură pentru replicarea bazată pe instrucțiuni. Folosește NU DETERMINISTICE ori de câte ori corpul apelează CURDATE(), NOW() sau RAND().

Executarea scriptului de mai sus creează funcția stocată `sf_past_movie_return_date`. Să o testăm acum.

SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(),
       sf_past_movie_return_date(`return_date`) AS `is_overdue`
FROM `movierentals`;

Executarea scriptului de mai sus în MySQL Workbench-ul pentru myflixdb ne dă următoarele rezultate.

movie_id numar de membru data_return CURDATE () este_depășit
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Da
2 3 25-06-2012 04-08-2012 Da
2 2 25-06-2012 04-08-2012 Da
3 3 NULL 04-08-2012 NULL

Observați cele două rânduri NULL. Când `return_date` este NULL, ambele comparații se evaluează ca NULL în loc de TRUE sau FALSE, deci nicio ramură IF nu rulează și funcția returnează NULL — rezultatul așteptat, deoarece un film nereturnat nu are o dată de returnare cu care să se compare.

Funcții definite de utilizator

Când SQL singur nu este suficient de rapid, MySQL permite o a treia opțiune. Funcțiile definite de utilizator (UDF-uri) sunt scrise într-un limbaj compilat, cum ar fi C or C++, încorporate într-o bibliotecă partajată și înregistrate la server. Odată adăugate, acestea sunt apelate la fel ca orice altă funcție. Deoarece o UDF rulează ca cod nativ în interiorul procesului serverului, este potrivită pentru calcule intense - dar o eroare într-una dintre ele poate bloca serverul, așa că UDF-urile sunt utilizate mult mai rar decât funcțiile stocate.

Funcții încorporate vs. funcții stocate vs. funcții definite de utilizator: pe care ar trebui să le utilizați?

Toate cele trei familii returnează o singură valoare și pot fi apelate din orice instrucțiune SQL, dar diferă prin cine le scrie, unde rulează și cât de mult risc prezintă. Tabelul de mai jos rezumă aceste diferențe.

Criteriu Funcții încorporate Funcții stocate Funcții definite de utilizator (UDF-uri)
Cine o scrie Livrat cu MySQL Tu, în SQL Tu, în C sau C++
Unde trăiește În interiorul serverului În baza de date, creată cu CREATE FUNCTION Bibliotecă partajată compilată, încărcată de server
Utilizare tipică Formatare, matematică, agregare Reguli de afaceri reutilizabile, cum ar fi un cec restant Logica specializată sau cu consum mare de CPU nu poate exprima
Riscul principal Nici unul Lent dacă este apelat rând cu rând într-un tabel mare O eroare a bibliotecii poate duce la întreruperea serviciului

Ca regulă generală, începeți cu o funcție încorporată. Dacă niciuna nu se potrivește, scrieți o funcție stocată astfel încât regula să rămână într-un singur loc. Folosiți o funcție definită de utilizator (UDF) doar atunci când o funcție stocată este considerabil prea lentă.

Întrebări frecvente

O funcție trebuie să returneze exact o valoare și poate fi utilizată în interiorul unei expresii SELECT, WHERE sau ORDER BY. O procedură stocată returnează zero sau mai multe seturi de rezultate, nu poate fi încorporată într-o expresie și este invocată cu instrucțiunea CALL.

Executați DROP FUNCTION IF EXISTS sf_name; apoi recreați-o. MySQL nu are funcția CREATE OR REPLACE FUNCTION, iar ALTER FUNCTION modifică doar caracteristici precum comentariul sau tipul de securitate, niciodată corpul.

Pot. O funcție înfășurată în jurul unei coloane indexate într-o clauză WHERE previne MySQL de la utilizarea acelui index, forțând o scanare completă. Filtrați pe coloana brută și aplicați funcția numai în lista SELECT.

Da. Asistenții inteligenți artificiali pot crea cod CREATE FUNCTION dintr-o regulă simplă. Verificați întotdeauna corpul generat pentru a identifica corect caracteristica DETERMINISTIC, gestionarea NULL și tipurile de date ale parametrilor înainte de a-l rula pe un server de producție.

Nu. Modelele de inteligență artificială pot inventa nume de funcții, pot omite cazuri NULL sau pot ignora diferențele de versiune. Testați fiecare funcție generată pe o copie a datelor și confirmați rezultatele în raport cu o interogare pe care ați scris-o și verificat-o singur.

Rezumați această postare cu: