MySQL Funksjoner: streng, numerisk, brukerdefinert, lagret

⚡ Smart oppsummering

MySQL Funksjoner transformerer data før de lagres eller hentes, og returnerer et enkelt beregnet resultat. Denne artikkelen forklarer innebygde streng-, numeriske og datofunksjoner, og viser deretter hvordan lagrede og brukerdefinerte funksjoner utvider selve databasemotoren.

  • 🔤 Strengfunksjoner: UCASE, LCASE og CONCAT omformer tekst ved spørring; alias den beregnede kolonnen med AS slik at resultatsettet har en lesbar overskrift.
  • 🔢 Numerisk Operators: DIV utfører heltallsdivisjon, / returnerer en desimalkvotient, og % (eller MOD) returnerer resten av en divisjon.
  • 📅 Datofunksjoner: DATE_FORMAT konverterer den lagrede YYYY-MM-DD-verdien til et hvilket som helst visningsmønster, for eksempel %d-%m-%Y, uten å endre en eneste linje med applikasjonskode.
  • 🛠️ Lagrede funksjoner: CREATE FUNCTION registrerer gjenbrukbar logikk inne i serveren; erklærer den som NOT DETERMINISTIC hver gang brødteksten kaller CURDATE() eller NOW().
  • ⚙️ Brukerdefinerte funksjoner: Eksterne rutiner skrevet i C eller C++ kompileres inn i serveren og oppfører seg deretter nøyaktig som native funksjoner.
  • 🚀 Ytelsespåvirkning: Å pushe beregninger inn i databasen fjerner duplisert logikk fra alle klientapplikasjoner og reduserer nettverksrunder.

Hva er MySQL Funksjoner?

MySQL kan gjøre mye mer enn bare å lagre og hente data. Det kan også utføre manipulasjoner på dataene før den hentes eller lagres. Det er der MySQL Funksjoner kommer inn. Funksjoner er rett og slett kodebiter som utfører en operasjon og deretter returnerer et resultat. Noen funksjoner godtar parametere, mens andre ikke godtar noen.

La oss kort se på et eksempel. Som standard, MySQL lagrer datodatatyper i formatet «ÅÅÅÅ-MM-DD». Anta at vi har bygget et program og brukerne våre ønsker at datoen skal returneres i formatet «DD-MM-ÅÅÅÅ». Vi kan bruke MySQL innebygd funksjon DATE_FORMAT for å oppnå dette. DATE_FORMAT er en av de mest brukte funksjonene i MySQL, og vi ser nærmere på det senere i denne leksjonen.

Uansett type, en funksjon returnerer alltid én enkelt verdi, kan godta null eller flere parametere i parentes, og kan brukes hvor som helst et uttrykk er tillatt — i en SELECT-liste, en WHERE-klausul eller en ORDER BY-klausul.

Hvorfor bruk MySQL Funksjoner?

Nå som vi vet hva en funksjon er, er det neste spørsmålet hvorfor vi i det hele tatt bør legge dette arbeidet inn i databasen.

Hvorfor bruke MySQL Funksjoner

Som diagrammet ovenfor viser, tar en funksjon en inngangsverdi, bruker logikken når den er inne i databasemotoren, og sender tilbake et enkelt resultat til hver applikasjon som ber om det.

Programmerere tenker kanskje: «Hvorfor bry seg med MySQL Funksjoner? Den samme effekten kan oppnås med et skript- eller programmeringsspråk.» Det er sant at vi kan oppnå det ved å skrive en prosedyre i applikasjonsprogrammet.

For å gå tilbake til DATE-eksemplet vårt, må forretningslaget gjøre den nødvendige behandlingen selv for at brukerne våre skal få dataene i ønsket format.

Dette blir et problem når applikasjonen skal integreres med andre systemer. Når vi bruker MySQL funksjoner som DATE_FORMAT, den funksjonaliteten er innebygd i databasen, og alle applikasjoner som trenger dataene får dem i ønsket format. Dette reduserer omarbeid i forretningslogikken og reduserer datainkonsekvenser.

Enda en grunn til å vurdere MySQL funksjonene er at de kan bidra til å redusere nettverkstrafikk i klient/server-applikasjonerForretningslaget trenger bare å kalle den lagrede funksjonen, uten å trekke rå rader over nettverket for å manipulere dem. I gjennomsnitt kan bruk av funksjoner forbedre den generelle systemytelsen betraktelig.

Typer av MySQL Funksjoner

Når «hva» og «hvorfor» er avklart, kan vi nå se på de tre funksjonsfamiliene MySQL tilbyr: innebygde funksjoner, lagrede funksjoner og brukerdefinerte funksjoner.

Innebygde funksjoner

MySQL leveres med en rekke innebygde funksjoner – funksjoner som allerede er implementert i MySQL server. De lar oss utføre mange typer manipulering av dataene, og faller inn i følgende vanlige grupper.

  • Strengefunksjoner – operere på strengdatatyper
  • Numeriske funksjoner – operere på numeriske datatyper
  • Datofunksjoner – operere på datodatatyper
  • Aggregerte funksjoner – operere på alle de ovennevnte datatypene og produsere oppsummerte resultatsett.
  • Andre funksjoner - MySQL støtter også andre typer innebygde funksjoner, men vi begrenser denne leksjonen til gruppene nevnt ovenfor.

La oss nå se nærmere på hver av gruppene nevnt ovenfor. Vi vil forklare de mest brukte funksjonene ved hjelp av vår eksempeldatabase «Myflixdb».

Strengefunksjoner

Strengfunksjoner opererer på tekstverdier. I filmtabellen vår lagres titler ved hjelp av en blanding av små og store bokstaver. Anta at vi ønsker en spørring som returnerer titlene med store bokstaver. «UCASE»-funksjonen tar en streng som parameter og konverterer hver bokstav til store bokstaver, slik skriptet nedenfor viser.

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

HER

  • UCASE(`tittel`) er den innebygde funksjonen som tar tittelen som en parameter og returnerer den med store bokstaver.
  • Som `stor_bokstav_tittel` gir den beregnede kolonnen et alias, slik at resultatsettet har en lesbar overskrift i stedet for det rå uttrykket.

Utfører skriptet ovenfor i MySQL Workbench mot Myflixdb gir oss resultatene vist nedenfor.

movie_id tittel stor_bokstav_tittel
16 67 % skyldig 67 % SKYLDIG
6 engler og demoner ENGLENE OG DEMONER
4 Code Navn Svart KODENAVN SVART
5 Pappas småjenter PAPPAS SMÅJENTER
7 Da Vinci Code DAVINCI-KODEN
2 Glemte Sarah Marshal GLEMMER SARAH MARSHAL
9 Honey moonERS HONNING MOONERS
19 film 3 FILM 3
1 Pirates of the Caribean 4 PIRATES OF THE CARIBEAN 4
18 eksempelfilm EKSEMPELFILM
17 The Great Dictator DEN STORE DIKTATOREN
3 X-Men X-MEN

To ledsagere er verdt å huske ved siden av UCASE: LCASE konverterer en streng til små bokstaver, og KONCAT kobler sammen to eller flere strenger til én. For en fullstendig liste, se MySQL strengfunksjonsreferanse.

Numeriske funksjoner

Som nevnt tidligere, opererer numeriske funksjoner på numeriske datatyper. Vi kan også utføre matematiske beregninger på numeriske data direkte i SQL-setningene våre.

Aritmetiske operatører

MySQL støtter følgende aritmetiske operatorer, som kan brukes til å utføre beregninger i SQL-setninger.

Navn Tekniske beskrivelser
DIV Heltall divisjon
/ Divisjon
- Subtracsjon
+ Addisjon
* Multiplikasjon
% eller MOD modulus

Eksempler på hver operator følger.

Heltallsdivisjon (DIV) — DIV forkaster brøkdelen og returnerer bare hele tallet.

SELECT 23 DIV 6;

Å kjøre skriptet ovenfor gir oss 3.

Divisjonsoperatør (/) — i motsetning til DIV beholder divisjonsoperatoren desimaldelen av resultatet.

SELECT 23 / 6;

Å kjøre skriptet ovenfor gir oss 3.8333.

Subtracsjonsoperator (-)

SELECT 23 - 6;

Å kjøre skriptet ovenfor gir oss 17.

Tilleggsoperatør (+)

SELECT 23 + 6;

Å kjøre skriptet ovenfor gir oss 29.

Multiplikasjonsoperator (*)

SELECT 23 * 6 AS `multiplication_result`;

Resultat:

multiplikasjonsresultat
138

Modulo-operator (% eller MOD)

Modulo-operatoren deler N med M og gir oss resten. La oss se på eksemplet med modulo-operatoren, og bruke de samme verdiene som i de foregående eksemplene.

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

Å kjøre et av skriptene gir oss 5.

La oss nå se på noen av de vanlige numeriske funksjonene i MySQL.

GULV – denne funksjonen fjerner desimalene fra et tall og runder det ned til nærmeste hele tall. Skriptet som vises nedenfor demonstrerer bruken av den.

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

Resultat:

etasjeresultat
3

ROUND – denne funksjonen runder et tall til nærmeste hele tall. Fordi 23 / 6 evalueres til 3.8333, returnerer ROUND 4 mens FLOOR returnerer 3 – de to er ikke utskiftbare.

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

Resultat:

runderesultat
4

RAND – denne funksjonen genererer et tilfeldig tall. Verdien endres hver gang funksjonen kalles. Skriptet nedenfor demonstrerer bruken av det.

SELECT RAND() AS `random_result`;

Datofunksjoner

Datofunksjoner opererer på dato- og dato-klokkeslett-datatyper. DATE_FORMAT er funksjonen som løser problemet «ÅÅÅÅ-MM-DD versus DD-MM-ÅÅÅÅ» som er beskrevet i innledningen.

DATE_FORMAT tar to parametere: datoverdien som skal formateres, og en formatstreng bygget fra plassholdere. Skriptet nedenfor returnerer hver utgivelsesdato i dag-måned-år-stilen brukerne våre ba om.

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

De mest brukte formatplassholderne er listet opp nedenfor.

Plassholder Betydning Eksempel på utdata
%d Månedens dag, to sifre 04
%m Måned, to sifre 08
%Y År, fire sifre 2012
%M Månedens navn i sin helhet August
%Hans Hours, minutter, sekunder 14:35:09

Tre andre datofunksjoner dukker opp konstant i det daglige arbeidet:

  • OPPRETTINGSDATUM() returnerer gjeldende dato som ÅÅÅÅ-MM-DD.
  • NÅ() returnerer gjeldende dato og tid.
  • DATODIFF(d1, d2) returnerer antall dager mellom to datoer – grunnlaget for enhver rapport om forfalt utleie.

For den fullstendige listen, se MySQL referanse for dato- og klokkeslettfunksjon.

Lagrede funksjoner

Innebygde funksjoner dekker vanlige tilfeller. Når en forretningsregel er mer spesifikk, skriver vi vår egen – og det er det en lagret funksjon er til for.

Lagrede funksjoner oppfører seg akkurat som innebygde funksjoner, bortsett fra at du definerer dem selv. Når en lagret funksjon er opprettet, kan den brukes i SQL-setninger akkurat som enhver annen funksjon. Den grunnleggende syntaksen vises nedenfor.

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

HER

  • «OPPRETT FUNKSJON sf_name ([parameter(er)])» er obligatorisk og forteller MySQL server for å opprette en funksjon kalt `sf_name` med valgfrie parametere definert i parentesene.
  • «RETURNERINGER datatype» er obligatorisk og angir datatypen som funksjonen returnerer.
  • "DETERMINISTISK" erklærer at funksjonen returnerer samme verdi hver gang de samme argumentene oppgis. «IKKE DETERMINISTISK» erklærer det motsatte.
  • «BEGYNN … SLUTT» pakker inn prosedyrekoden som funksjonen utfører.

Anta at vi vil vite hvilke leide filmer som har gått ut på returdatoen. Vi kan opprette en lagret funksjon som godtar returdatoen som en parameter og sammenligner den med gjeldende dato på serveren. Hvis gjeldende dato er etter returdatoen, er filmen forfalt, og vi returnerer «Ja»; ellers returnerer vi «Nei».

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 ;

⚠️ Advarsel – ikke merk denne funksjonen DETERMINISTISK. Brødteksten kaller CURDATE(), slik at det samme argumentet kan returnere «Nei» i dag og «Ja» i morgen. Å deklarere en tidsavhengig funksjon DETERMINISTIC villeder optimaliseringen og er utrygt for setningsbasert replikering. IKKE DETERMINISTISK hver gang kroppen kaller CURDATE(), NOW() eller RAND().

Når skriptet ovenfor kjøres, opprettes den lagrede funksjonen `sf_past_movie_return_date`. La oss nå teste den.

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

Utfører skriptet ovenfor i MySQL Arbeidsbenk mot myflixdb gir oss følgende resultater.

movie_id medlemsnummer return_date OPPRETTINGSDATUM() er_forfalt
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Ja
2 3 25-06-2012 04-08-2012 Ja
2 2 25-06-2012 04-08-2012 Ja
3 3 NULL 04-08-2012 NULL

Legg merke til de to NULL-radene. Når `return_date` er NULL, evalueres begge sammenligningene til NULL i stedet for TRUE eller FALSE, så ingen av IF-grenene kjører og funksjonen returnerer NULL – det forventede resultatet, siden en ureturnert film ikke har noen returdato å sammenligne mot.

Brukerdefinerte funksjoner

Når SQL alene ikke er raskt nok, MySQL tillater et tredje alternativ. Brukerdefinerte funksjoner (UDF-er) skrives i et kompilert språk som f.eks. C or C++, innebygd i et delt bibliotek og registrert på serveren. Når de er lagt til, kalles de akkurat som alle andre funksjoner. Fordi en UDF kjører som innebygd kode i serverprosessen, egner den seg for tung beregning – men en feil i en kan krasje serveren, så UDF-er brukes mye sjeldnere enn lagrede funksjoner.

Innebygde vs. lagrede vs. brukerdefinerte funksjoner: Hvilken bør du bruke?

Alle tre familiene returnerer én verdi og kan kalles fra en hvilken som helst SQL-setning, men de er forskjellige i hvem som skriver dem, hvor de kjører og hvor mye risiko de medfører. Tabellen nedenfor oppsummerer disse forskjellene.

Criterion Innebygde funksjoner Lagrede funksjoner Brukerdefinerte funksjoner (UDF-er)
Hvem skriver det Sendes med MySQL Du, i SQL Du, i C eller C++
Hvor den bor Inne i serveren Inne i databasen, opprettet med CREATE FUNCTION Kompilert delt bibliotek lastet inn av serveren
Typisk bruk Formatering, matematikk, aggregering Gjenbrukbare forretningsregler, for eksempel en forfalt sjekk CPU-tung eller spesialisert logikk som SQL ikke kan uttrykke
Hovedrisiko none Sakte hvis kalt rad for rad over en stor tabell Et krasj i biblioteket kan føre til at serveren slår seg av

Som en tommelfingerregel bør du starte med en innebygd funksjon. Hvis ingen av dem passer, skriv en lagret funksjon slik at regelen finnes på ett sted. Bruk bare en UDF når en lagret funksjon er målbart for treg.

Spørsmål og svar

En funksjon må returnere nøyaktig én verdi og kan brukes i et SELECT-, WHERE- eller ORDER BY-uttrykk. En lagret prosedyre returnerer null eller mange resultatsett, kan ikke bygges inn i et uttrykk og kalles med CALL-setningen.

Kjør DROP FUNCTION IF EXISTS sf_name; og lag den deretter på nytt. MySQL har ingen CREATE OR REPLACE FUNCTION, og ALTER FUNCTION endrer bare egenskaper som kommentar eller sikkerhetstype, aldri brødteksten.

De kan. En funksjon som er pakket rundt en indeksert kolonne i en WHERE-klausul forhindrer MySQL fra å bruke den indeksen, noe som tvinger frem en full skanning. Filtrer på den rå kolonnen og bruk funksjonen bare i SELECT-listen.

Ja. AI-assistenter kan utarbeide CREATE FUNCTION-kode fra en regel i vanlig engelsk. Sjekk alltid den genererte teksten for riktig DETERMINISTISK egenskap, NULL-håndtering og parameterdatatyper før du kjører den på en produksjonsserver.

Nei. AI-modeller kan finne opp funksjonsnavn, overse NULL-tilfeller eller ignorere versjonsforskjeller. Test hver genererte funksjon på en kopi av dataene, og bekreft resultatene mot en spørring du har skrevet og verifisert selv.

Oppsummer dette innlegget med: