MySQL Funzioni: stringa, numerica, definita dall'utente, memorizzata

⚡ Riepilogo intelligente

MySQL Le funzioni trasformano i dati prima che vengano memorizzati o recuperati, restituendo un singolo risultato calcolato. Questo articolo illustra le funzioni predefinite per stringhe, numeri e date, e mostra come le funzioni memorizzate e definite dall'utente estendono le funzionalità del motore di database.

  • 🔤 Funzioni stringa: UCASE, LCASE e CONCAT rimodellano il testo al momento dell'interrogazione; assegnano un alias AS alla colonna calcolata in modo che il set di risultati abbia un'intestazione leggibile.
  • 🔢 Numerico Operatori: DIV esegue la divisione intera, / restituisce il quoziente decimale e % (o MOD) restituisce il resto della divisione.
  • ???? Funzioni di data: DATE_FORMAT converte il valore memorizzato nel formato YYYY-MM-DD in qualsiasi formato di visualizzazione, come %d-%m-%Y, senza modificare una singola riga di codice dell'applicazione.
  • Funzioni memorizzate: CREATE FUNCTION registra la logica riutilizzabile all'interno del server; dichiarala NOT DETERMINISTIC ogni volta che il corpo chiama CURDATE() o NOW().
  • ⚙️ Funzioni definite dall'utente: Routine esterne scritte in C o C++ vengono compilate nel server e si comportano esattamente come funzioni native.
  • 🚀 Impatto sulle prestazioni: L'inserimento dei calcoli nel database elimina la duplicazione della logica da ogni applicazione client e riduce i viaggi di andata e ritorno sulla rete.

Che cosa sono MySQL Funzioni?

MySQL può fare molto di più che semplicemente archiviare e recuperare dati. Può anche eseguire manipolazioni sui dati prima di recuperarlo o salvarlo. È lì che MySQL Entrano in gioco le funzioni. Le funzioni sono semplicemente porzioni di codice che eseguono un'operazione e restituiscono un risultato. Alcune funzioni accettano parametri, mentre altre non ne accettano.

Vediamo brevemente un esempio. Per impostazione predefinita, MySQL salva i tipi di dati data nel formato "AAAA-MM-GG". Supponiamo di aver creato un'applicazione e che i nostri utenti desiderino che la data venga restituita nel formato "GG-MM-AAAA". Possiamo usare il MySQL funzione integrata DATE_FORMAT per raggiungere questo obiettivo. DATE_FORMAT è una delle funzioni più utilizzate in MySQLe lo analizzeremo in dettaglio più avanti in questa lezione.

Qualunque sia il suo tipo, una funzione restituisce sempre un singolo valore, può accettare zero o più parametri tra parentesi, e può essere utilizzato ovunque sia consentita un'espressione — in un elenco SELECT, in una clausola WHERE o in una clausola ORDER BY.

Perché usare MySQL Funzioni?

Ora che sappiamo cos'è una funzione, la domanda successiva è perché dovremmo inserire questo lavoro nel database.

Perché usare MySQL funzioni

Come mostra il diagramma sopra, una funzione riceve un valore in input, applica la logica una sola volta all'interno del motore del database e restituisce un singolo risultato a ogni applicazione che lo richiede.

I programmatori potrebbero pensare: "Perché preoccuparsi di MySQL Funzioni? Lo stesso effetto si può ottenere con un linguaggio di scripting o di programmazione. È vero che possiamo ottenerlo scrivendo una procedura nel programma applicativo.

Tornando al nostro esempio relativo alla DATA, affinché i nostri utenti possano ottenere i dati nel formato desiderato, il livello business dovrebbe occuparsi autonomamente dell'elaborazione necessaria.

Questo diventa un problema quando l'applicazione deve integrarsi con altri sistemi. Quando usiamo MySQL funzioni come DATE_FORMAT, tale funzionalità è incorporata nel database e qualsiasi applicazione che necessiti dei dati li ottiene nel formato richiesto. Questo Riduce le rilavorazioni nella logica aziendale e riduce le incongruenze dei dati..

Un altro motivo da considerare MySQL La loro funzione è quella di contribuire a ridurre il traffico di rete nelle applicazioni client/server.Il livello business deve solo richiamare la funzione memorizzata, senza dover scaricare i dati grezzi dalla rete per elaborarli. In media, l'utilizzo delle funzioni può migliorare notevolmente le prestazioni complessive del sistema.

Tipi di MySQL funzioni

Una volta definiti il ​​"cosa" e il "perché", possiamo ora esaminare le tre famiglie di funzioni MySQL Offre: funzioni integrate, funzioni memorizzate e funzioni definite dall'utente.

Funzioni integrate

MySQL viene fornito con una serie di funzioni integrate — funzioni già implementate nel MySQL server. Ci consentono di eseguire molti tipi di manipolazione sui dati e rientrano nei seguenti gruppi comunemente utilizzati.

  • Funzioni di stringa – operare su tipi di dati stringa
  • Funzioni numeriche – operare su tipi di dati numerici
  • Funzioni data – operare su tipi di dati di data
  • Funzioni aggregate – operare su tutti i tipi di dati di cui sopra e produrre set di risultati riepilogativi.
  • altre funzioni - MySQL Supporta anche altri tipi di funzioni integrate, ma in questa lezione ci limiteremo ai gruppi sopra menzionati.

Analizziamo ora nel dettaglio ciascuno dei gruppi menzionati in precedenza. Spiegheremo le funzioni più utilizzate prendendo come esempio il nostro database "Myflixdb".

Funzioni di stringa

Le funzioni stringa operano su valori di testo. Nella nostra tabella dei film, i titoli sono memorizzati utilizzando un mix di lettere minuscole e maiuscole. Supponiamo di voler eseguire una query che restituisca i titoli in maiuscolo. La funzione "UCASE" accetta una stringa come parametro e converte ogni lettera in maiuscolo, come dimostra lo script seguente.

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

QUI

  • UCASE(`title`) è la funzione integrata che prende il titolo come parametro e lo restituisce in lettere maiuscole.
  • COME `titolo_maiuscolo` assegna un alias alla colonna calcolata, in modo che il set di risultati contenga un'intestazione leggibile anziché l'espressione grezza.

Eseguendo lo script precedente in MySQL L'analisi con Workbench su Myflixdb ci fornisce i risultati mostrati di seguito.

id_film titolo titolo_in_maiuscolo
16 67% colpevole 67% COLPEVOLI
6 Angeli e Demoni ANGELI E DEMONI
4 Code Nome Nero NOME IN CODICE BLACK
5 Le bambine di papà LE PICCOLE RAGAZZE DI PAPÀ
7 Da Vinci Code CODICE DAVINCI
2 Dimenticando Sarah Marshal DIMENTICARE SARAH MARSHAL
9 Honey moonERS MIELE MOONERS
19 film 3 FILM 3
1 Pirati dei Caraibi 4 PIRATI DEI CARAIBI 4
18 filmato di esempio FILM DI ESEMPIO
17 Il grande dittatore IL GRANDE DITTATORE
3 X-Men X-MEN

Oltre a UCASE, vale la pena ricordare due compagni: LCA converte una stringa in minuscolo e CONCAT unisce due o più stringhe in una sola. Per l'elenco completo, fare riferimento a MySQL riferimento alla funzione stringa.

Funzioni numeriche

Come accennato in precedenza, le funzioni numeriche operano su tipi di dati numerici. Possiamo anche eseguire calcoli matematici su dati numerici direttamente nelle nostre istruzioni SQL.

Operatori aritmetici

MySQL Supporta i seguenti operatori aritmetici, che possono essere utilizzati per eseguire calcoli nelle istruzioni SQL.

Nome Descrizione
DIV Divisione intera
/ Divisione
- Subtracproduzione
+ Aggiunta
* Moltiplicazione
% o MOD Modulo

Seguono esempi per ciascun operatore.

Divisione intera (DIV) — DIV scarta la parte frazionaria e restituisce solo il numero intero.

SELECT 23 DIV 6;

L'esecuzione dello script sopra riportato ci fornisce 3.

Operatore di divisione (/) — a differenza di DIV, l'operatore di divisione mantiene la parte decimale del risultato.

SELECT 23 / 6;

L'esecuzione dello script sopra riportato ci fornisce 3.8333.

Subtracoperatore di zione (-)

SELECT 23 - 6;

L'esecuzione dello script sopra riportato ci fornisce 17.

Operatore di addizione (+)

SELECT 23 + 6;

L'esecuzione dello script sopra riportato ci fornisce 29.

Operatore di moltiplicazione (*)

SELECT 23 * 6 AS `multiplication_result`;

Risultato:

risultato_moltiplicazione
138

Operatore modulo (% o MOD)

L'operatore modulo divide N per M e ci dà il resto. Vediamo un esempio con l'operatore modulo, usando gli stessi valori degli esempi precedenti.

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

L'esecuzione di uno dei due script ci fornisce 5.

Diamo ora un'occhiata ad alcune delle funzioni numeriche comuni in MySQL.

PAVIMENTO – questa funzione rimuove le cifre decimali da un numero e lo arrotonda per difetto al numero intero più vicino. Lo script mostrato di seguito ne illustra l'utilizzo.

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

Risultato:

risultato_piano
3

ROTONDO – questa funzione arrotonda un numero al numero intero più vicino. Poiché 23 / 6 è uguale a 3.8333, ARROTONDA restituisce 4 mentre FONDO restituisce 3: le due funzioni non sono intercambiabili.

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

Risultato:

risultato_round
4

RAND – Questa funzione genera un numero casuale. Il suo valore cambia ogni volta che la funzione viene chiamata. Lo script mostrato di seguito ne illustra l'utilizzo.

SELECT RAND() AS `random_result`;

Funzioni data

Le funzioni relative alle date operano su tipi di dati data e data-ora. DATE_FORMAT è la funzione che risolve il problema "AAAA-MM-GG contro GG-MM-AAAA" descritto nell'introduzione.

FORMATO DATA Lo script seguente accetta due parametri: il valore della data da formattare e una stringa di formato creata a partire da segnaposto. Lo script restituisce ogni data di rilascio nel formato giorno-mese-anno richiesto dai nostri utenti.

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

Di seguito sono elencati i segnaposto di formato più utilizzati.

segnaposto Significato Esempio di uscita
%d Giorno del mese, due cifre 04
%m Mese, due cifre 08
%Y Anno, quattro cifre 2012
%M Nome del mese per esteso Agosto
%Il suo Hoursminuti, secondi 14:35:09

Altre tre funzioni relative alle date ricorrono costantemente nel lavoro quotidiano:

  • CURDATE() Restituisce la data corrente nel formato AAAA-MM-GG.
  • ADESSO() restituisce la data corrente and tempo.
  • DATA DIFFERENZA (d1, d2) Restituisce il numero di giorni tra due date, ovvero l'elemento base di qualsiasi report sugli affitti non pagati.

Per l'elenco completo, vedere il MySQL Riferimento alla funzione data e ora.

Funzioni memorizzate

Le funzioni integrate coprono i casi più comuni. Quando una regola aziendale è più specifica, ne scriviamo una personalizzata, ed è a questo che serve una funzione memorizzata.

Le funzioni memorizzate si comportano esattamente come le funzioni predefinite, con la differenza che vengono definite dall'utente. Una volta creata, una funzione memorizzata può essere utilizzata nelle istruzioni SQL esattamente come qualsiasi altra funzione. La sintassi di base è mostrata di seguito.

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

QUI

  • “CREA FUNZIONE sf_name ([parametro/i])” è obbligatorio e comunica MySQL server per creare una funzione denominata `sf_name` con parametri opzionali definiti all'interno delle parentesi.
  • “RESTITUISCE il tipo di dati” è obbligatorio e specifica il tipo di dati che la funzione restituisce.
  • "DETERMINISTICO" dichiara che la funzione restituisce lo stesso valore ogni volta che vengono forniti gli stessi argomenti. “NON DETERMINISTICO” dichiara il contrario.
  • “INIZIO… FINE” racchiude il codice procedurale che la funzione esegue.

Supponiamo di voler sapere quali film noleggiati hanno superato la data di restituzione. Possiamo creare una funzione memorizzata che accetta la data di restituzione come parametro e la confronta con la data corrente sul server. Se la data corrente è successiva alla data di restituzione, il film è scaduto e restituiamo "Sì"; altrimenti restituiamo "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 ;

⚠️ Attenzione: non etichettare questa funzione come DETERMINISTICA. Il corpo chiama CURDATE(), quindi lo stesso argomento può restituire "No" oggi e "Sì" domani. Dichiarare una funzione dipendente dal tempo DETERMINISTIC inganna l'ottimizzatore e non è sicuro per la replica basata su istruzioni. Utilizzare NON DETERMINISTICO ogni volta che il corpo chiama CURDATE(), NOW() o RAND().

L'esecuzione dello script sopra riportato crea la funzione memorizzata `sf_past_movie_return_date`. Ora testiamola.

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

Eseguendo lo script precedente in MySQL L'analisi con Workbench su myflixdb ci fornisce i seguenti risultati.

id_film numero_iscrizione data di ritorno CURDATE() è in ritardo
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Si
2 3 25-06-2012 04-08-2012 Si
2 2 25-06-2012 04-08-2012 Si
3 3 NULL 04-08-2012 NULL

Si notino le due righe NULL. Quando `return_date` è NULL, entrambi i confronti restituiscono NULL anziché TRUE o FALSE, quindi nessuno dei due rami IF viene eseguito e la funzione restituisce NULL, il risultato previsto, poiché un film non restituito non ha una data di restituzione con cui confrontarsi.

Funzioni definite dall'utente

Quando SQL da solo non è abbastanza veloce, MySQL consente una terza opzione. Le funzioni definite dall'utente (UDF) sono scritte in un linguaggio compilato come C or C++Le UDF vengono integrate in una libreria condivisa e registrate sul server. Una volta aggiunte, vengono richiamate come qualsiasi altra funzione. Poiché una UDF viene eseguita come codice nativo all'interno del processo del server, è adatta a calcoli complessi, ma un bug al suo interno può mandare in crash il server; per questo motivo, le UDF vengono utilizzate molto meno frequentemente rispetto alle funzioni memorizzate.

Funzioni predefinite, funzioni memorizzate o funzioni definite dall'utente: quale scegliere?

Tutte e tre le famiglie restituiscono un singolo valore e possono essere richiamate da qualsiasi istruzione SQL, ma differiscono per chi le scrive, dove vengono eseguite e quanto rischio comportano. La tabella seguente riassume tali differenze.

Criterio Funzioni integrate Funzioni memorizzate Funzioni definite dall'utente (UDF)
Chi lo scrive Spedito con MySQL Tu, in SQL Tu, in C o C++
Dove vive All'interno del server All'interno del database, creato con CREATE FUNCTION Libreria condivisa compilata caricata dal server
Utilizzo tipico Formattazione, matematica, aggregazione Regole aziendali riutilizzabili come un assegno scaduto Logica complessa o specializzata che richiede un elevato utilizzo della CPU, SQL non può esprimere
Rischio principale Nona Risulta lento se chiamato riga per riga su un tavolo di grandi dimensioni Un crash nella libreria può mandare in crash il server

Come regola generale, inizia con una funzione integrata. Se nessuna è adatta, scrivi una funzione memorizzata in modo che la regola risieda in un unico punto. Ricorri a una UDF solo quando una funzione memorizzata risulta sensibilmente troppo lenta.

DOMANDE FREQUENTI

Una funzione deve restituire esattamente un valore e può essere utilizzata all'interno di un'espressione SELECT, WHERE o ORDER BY. Una stored procedure restituisce zero o più set di risultati, non può essere incorporata in un'espressione e viene richiamata con l'istruzione CALL.

Esegui DROP FUNCTION IF EXISTS sf_name; quindi ricrealo. MySQL Non ha la funzione CREATE OR REPLACE e la funzione ALTER modifica solo caratteristiche come il commento o il tipo di sicurezza, mai il corpo.

Possono. Una funzione racchiusa attorno a una colonna indicizzata in una clausola WHERE impedisce MySQL dall'utilizzo di quell'indice, forzando una scansione completa. Filtra sulla colonna raw e applica la funzione solo nell'elenco SELECT.

Sì. Gli assistenti IA possono generare codice CREATE FUNCTION a partire da una regola in linguaggio naturale. Prima di eseguirlo su un server di produzione, è sempre necessario verificare che il corpo generato contenga la caratteristica DETERMINISTIC, la gestione dei valori NULL e i tipi di dati dei parametri corretti.

No. I modelli di IA possono inventare nomi di funzioni, non gestire i casi NULL o ignorare le differenze di versione. Testa ogni funzione generata su una copia dei dati e conferma i risultati confrontandoli con una query che hai scritto e verificato personalmente.

Riassumi questo post con: