MySQL Funktsioonid: string, numbriline, kasutaja määratud, salvestatud

⚡ Nutikas kokkuvõte

MySQL Funktsioonid teisendavad andmeid enne nende salvestamist või hankimist, tagastades ühe arvutatud tulemuse. See artikkel selgitab sisseehitatud stringi-, numbri- ja kuupäevafunktsioone ning seejärel näitab, kuidas salvestatud ja kasutaja määratletud funktsioonid laiendavad andmebaasimootorit ennast.

  • 🔤 Stringifunktsioonid: UCASE, LCASE ja CONCAT kujundavad teksti päringu ajal ümber; nimetavad arvutatud veeru AS-iks, et tulemuste komplektil oleks loetav päis.
  • 🔢 Arv- Operators: DIV teostab täisarvude jagamise, / tagastab kümnendjagatise ja % (või MOD) tagastab jagamisjäägi.
  • 📅 Kuupäevafunktsioonid: DATE_FORMAT teisendab salvestatud YYYY-MM-DD väärtuse mis tahes kuvamismustriks, näiteks %d-%m-%Y, ilma ühtegi rakenduskoodi rida muutmata.
  • 🛠️ Salvestatud funktsioonid: CREATE FUNCTION registreerib serveris korduvkasutatava loogika; deklareerib selle NOT DETERMINISTILISEKS iga kord, kui keha kutsub CURDATE() või NOW().
  • ⚙️ Kasutaja defineeritud funktsioonid: C-s või C-s kirjutatud välised rutiinid C++ kompileeritakse serverisse ja käituvad seejärel täpselt nagu natiivfunktsioonid.
  • 🚀 Mõju jõudlusele: Arvutuste andmebaasi sisestamine eemaldab igast kliendirakendusest dubleeritud loogika ja vähendab võrgu edasi-tagasi reise.

Mis on MySQL Funktsioonid?

MySQL saab teha palju enamat kui lihtsalt andmete salvestamine ja toomine. Võib ka andmetega manipuleerimine enne selle taastamist või salvestamist. See on koht, kus MySQL Funktsioonid tulevad mängu. Funktsioonid on lihtsalt koodijupid, mis sooritavad toimingu ja tagastavad seejärel tulemuse. Mõned funktsioonid aktsepteerivad parameetreid, teised aga mitte ühtegi.

Vaatame lühidalt näidet. Vaikimisi MySQL salvestab kuupäeva andmetüübid vormingus „AAAA-KK-PP“. Oletame, et oleme loonud rakenduse ja meie kasutajad soovivad kuupäeva tagastada vormingus „PP-KK-AAAA“. Me saame kasutada MySQL sisseehitatud funktsioon DATE_FORMAT selle saavutamiseks. DATE_FORMAT on üks enimkasutatud funktsioone MySQLja me vaatleme seda selle õppetunni hilisemas osas üksikasjalikumalt.

Olenemata funktsiooni tüübist tagastab alati ühe väärtuse, võib aktsepteerida nulli või rohkem parameetreid sulgudes ja saab kasutada kõikjal, kus avaldis on lubatud — SELECT-loendis, WHERE-klauslis või ORDER BY-klauslis.

Miks kasutada MySQL Funktsioonid?

Nüüd, kui me teame, mis funktsioon on, on järgmine küsimus, miks me peaksime selle töö üldse andmebaasi sisestama.

Miks kasutada MySQL Funktsioonid

Nagu ülaltoodud diagramm näitab, võtab funktsioon sisendväärtuse, rakendab loogikat andmebaasimootoris olles ja annab ühe tulemuse tagasi igale rakendusele, mis seda küsib.

Programmeerijad võivad mõelda: „Milleks vaeva näha? MySQL „Funktsioonid? Sama efekti saab saavutada skriptimise või programmeerimiskeelega.” On tõsi, et me saame selle saavutada rakendusprogrammis protseduuri kirjutades.

Tagasi meie DATE näite juurde, et meie kasutajad saaksid andmed soovitud vormingus, peaks ärikiht ise vajaliku töötlemise tegema.

See muutub probleemiks, kui rakendus peab integreeruma teiste süsteemidega. Kui kasutame MySQL funktsioonid nagu DATE_FORMAT, see funktsionaalsus on andmebaasi sisse põimitud ja iga rakendus, mis andmeid vajab, saab need vajalikus vormingus. See vähendab äriloogika ümbertöötlemist ja andmete ebajärjekindlust.

Veel üks põhjus, miks kaaluda MySQL funktsioonideks on see, et need aitavad vähendada võrguliiklust klient-serveri rakendustesÄritasand peab kutsuma ainult salvestatud funktsiooni, ilma et peaks võrgust töötlemata ridu nende manipuleerimiseks üles laadima. Keskmiselt võib funktsioonide kasutamine süsteemi üldist jõudlust oluliselt parandada.

Tüübid MySQL Funktsioonid

Kui „mida“ ja „miks“ on selgitatud, saame nüüd vaadata kolme funktsioonide perekonda. MySQL pakub: sisseehitatud funktsioone, salvestatud funktsioone ja kasutaja määratletud funktsioone.

Sisseehitatud funktsioonid

MySQL on komplektis mitmete sisseehitatud funktsioonidega — funktsioonidega, mis on juba rakenduses rakendatud MySQL server. Need võimaldavad meil andmetega mitut tüüpi manipuleerimist teha ja jagunevad järgmistesse tavaliselt kasutatavatesse rühmadesse.

  • Stringi funktsioonid – töötada stringi andmetüüpidega
  • Numbrilised funktsioonid – töötada numbriliste andmetüüpidega
  • Kuupäeva funktsioonid – kasutada kuupäeva andmetüüpe
  • Koondfunktsioonid – kasutada kõiki ülaltoodud andmetüüpe ja koostada summeeritud tulemuste komplektid.
  • Muud funktsioonid - MySQL toetab ka muud tüüpi sisseehitatud funktsioone, kuid me piirame seda õppetundi eespool nimetatud rühmadega.

Vaatleme nüüd kõiki ülalmainitud rühmi üksikasjalikumalt. Selgitame enimkasutatud funktsioone meie näidisandmebaasi „Myflixdb” abil.

Stringi funktsioonid

Stringifunktsioonid töötavad tekstiväärtustega. Meie filmide tabelis on pealkirjad salvestatud väike- ja suurtähtede kombinatsioonina. Oletame, et tahame päringut, mis tagastab pealkirjad suurtähtedega. Funktsioon „UCASE” võtab parameetrina stringi ja teisendab iga tähe suurtäheks, nagu allolev skript näitab.

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

SIIN

  • UCASE(`pealkiri`) on sisseehitatud funktsioon, mis võtab parameetrina pealkirja ja tagastab selle suurtähtedega.
  • AS `suurtäheline_pealkiri` annab arvutatud veerule aliase, seega kannab tulemuste komplekt loetavat päist toore avaldise asemel.

Ülaltoodud skripti käivitamine MySQL Workbench Myflixdb-ga võrreldes annab meile allpool näidatud tulemused.

filmi_id pealkiri suurtäheline_pealkiri
16 67% süüdi 67% SÜÜDI
6 Inglid ja deemonid INGLID JA DEEMONID
4 Code Nimi Must KOOD NIMI MUST
5 Isa väikesed tüdrukud ISA VÄIKESED TÜDRUKUD
7 davinci Code DA VINCI KOOD
2 Unustades Sarah Marshali SARAH MARSHALI UNUSTAMINE
9 Honey moontv MESI MOONERS
19 film 3 FILM 3
1 Kariibi mere piraadid 4 Kariibi mere piraadid 4
18 näidisfilm NÄIDISFILM
17 Suur Diktaator SUUR DIKTAATOR
3 X-Men X-MEN

UCASE kõrval tasub meeles pidada kahte kaaslast: LCASE teisendab stringi väiketähtedeks ja KONKUS ühendab kaks või enam stringi üheks. Täieliku loendi leiate MySQL stringifunktsiooni viide.

Numbrilised funktsioonid

Nagu varem mainitud, töötavad numbrilised funktsioonid numbriliste andmetüüpidega. Samuti saame SQL-lausetes otse numbriliste andmetega matemaatilisi arvutusi teha.

Aritmeetilised operaatorid

MySQL toetab järgmisi aritmeetilisi operaatoreid, mida saab kasutada arvutuste tegemiseks SQL-lausetes.

Eesnimi Kirjeldus
DIV Täisarv jagunemine
/ jaotus
- allatracmine
+ Lisamine
* Korrutamine
% või MOD Moodul

Iga operaatori näited järgnevad.

Täisarvude jagamine (DIV) — DIV eemaldab murdosa ja tagastab ainult täisarvu.

SELECT 23 DIV 6;

Ülaltoodud skripti käivitamine annab meile 3.

Jaoskonna operaator (/) — erinevalt funktsioonist DIV säilitab jagamisoperaator tulemuse kümnendosa.

SELECT 23 / 6;

Ülaltoodud skripti käivitamine annab meile 3.8333.

allatractsioonioperaator (-)

SELECT 23 - 6;

Ülaltoodud skripti käivitamine annab meile 17.

Lisaoperaator (+)

SELECT 23 + 6;

Ülaltoodud skripti käivitamine annab meile 29.

Korrutustehter (*)

SELECT 23 * 6 AS `multiplication_result`;

Tulemus:

korrutamise_tulemus
138

Modulo operaator (% või MOD)

Modulo operaator jagab N M-iga ja annab meile jäägi. Vaatame mooduli operaatori näidet, kasutades samu väärtusi nagu eelmistes näidetes.

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

Mõlema skripti käivitamine annab meile 5.

Vaatame nüüd mõnda levinumat numbrifunktsiooni MySQL.

KORRUS – see funktsioon eemaldab arvust kümnendkohad ja ümardab selle lähima täisarvuni. Allolev skript demonstreerib selle kasutamist.

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

Tulemus:

korruse_tulemus
3

ROUND – see funktsioon ümardab arvu lähima täisarvuni. Kuna 23 / 6 annab tulemuseks 3.8333, tagastab ROUND 4, samas kui FLOOR tagastab 3 – need kaks arvu ei ole omavahel asendatavad.

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

Tulemus:

vooru_tulemus
4

RAND – see funktsioon genereerib juhusliku arvu. Selle väärtus muutub iga kord, kui funktsiooni kutsutakse. Allolev skript demonstreerib selle kasutamist.

SELECT RAND() AS `random_result`;

Kuupäeva funktsioonid

Kuupäevafunktsioonid töötavad kuupäeva ja kuupäeva-kellaaja andmetüüpidega. DATE_FORMAT on funktsioon, mis lahendab sissejuhatuses kirjeldatud „AAAA-KK-PP vs PP-KK-AAAA” probleemi.

KUUPÄEVA_VORMING võtab kaks parameetrit: vormindatava kuupäeva väärtuse ja kohatäidetest loodud vormingustringi. Allolev skript tagastab iga väljalaskekuupäeva päev-kuu-aasta stiilis, mida meie kasutajad küsisid.

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

Kõige sagedamini kasutatavad vormingu kohatäited on loetletud allpool.

kohatäitja Tähendus Näidisväljund
%d Kuu päev, kaks numbrit 04
%m Kuu, kaks numbrit 08
%Y Aasta, neli numbrit 2012
%M Kuu täielik nimi August
%H:%i:%s Hours, minutid, sekundid 14:35:09

Igapäevatöös esinevad pidevalt veel kolm kuupäevafunktsiooni:

  • KUUPÄEV() tagastab praeguse kuupäeva kujul AAAA-KK-PP.
  • KOHE () tagastab praeguse kuupäeva ja aega.
  • DATEDIFF(d1, d2) tagastab kahe kuupäeva vahelise päevade arvu – mis on aluseks mis tahes üürivõlgnevuste aruandele.

Täieliku nimekirja leiate aadressilt MySQL kuupäeva ja kellaaja funktsiooni viide.

Salvestatud funktsioonid

Sisseehitatud funktsioonid katavad levinumad juhtumid. Kui ärireegel on spetsiifilisem, kirjutame oma – ja selleks ongi salvestatud funktsioon.

Salvestatud funktsioonid käituvad samamoodi nagu sisseehitatud funktsioonid, välja arvatud see, et defineerite need ise. Kui salvestatud funktsioon on loodud, saab seda SQL-lausetes kasutada täpselt nagu iga teist funktsiooni. Põhisüntaks on näidatud allpool.

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

SIIN

  • „LOO FUNKTSIOON sf_nimi ([parameeter(id)])” on kohustuslik ja annab teada MySQL serveril luua funktsioon nimega `sf_name`, mille sulgudes on defineeritud valikulised parameetrid.
  • „TAGASTAB andmetüübi” on kohustuslik ja määrab funktsiooni tagastatava andmetüübi.
  • "DETERMINISTILINE" deklareerib, et funktsioon tagastab sama väärtuse alati, kui esitatakse samad argumendid. "MITTE DETERMINISTLIK" deklareerib vastupidist.
  • „ALGUS … LÕPP” mähib protseduurilise koodi, mida funktsioon käivitab.

Oletame, et tahame teada, millised renditud filmid on tagastuskuupäevast möödas. Saame luua salvestatud funktsiooni, mis võtab parameetrina tagastuskuupäeva ja võrdleb seda serveris oleva praeguse kuupäevaga. Kui praegune kuupäev on tagastuskuupäevast hilisem, on film tagastustähtajast möödas ja tagastame väärtuse „Jah“; vastasel juhul tagastame väärtuse „Ei“.

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 ;

⚠️ Hoiatus — ärge märgistage seda funktsiooni DETERMINISTILISEKS. Funktsiooni CURDATE() sisu kutsub esile, seega sama argument võib täna tagastada „Ei“ ja homme „Jah“. Ajast sõltuva funktsiooni DETERMINISTIC deklareerimine eksitab optimeerijat ja on lausepõhise replikatsiooni jaoks ohtlik. Kasutage EI OLE DETERMINISTLIK iga kord, kui keha kutsub funktsiooni CURDATE(), NOW() või RAND().

Ülaltoodud skripti käivitamine loob salvestatud funktsiooni `sf_past_movie_return_date`. Testime seda nüüd.

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

Ülaltoodud skripti käivitamine MySQL Workbench myflixdb vastu annab meile järgmised tulemused.

filmi_id liikme_number tagastamise_kuupäev KUUPÄEV() on_tähtaja ületanud
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Jah
2 3 25-06-2012 04-08-2012 Jah
2 2 25-06-2012 04-08-2012 Jah
3 3 NULL 04-08-2012 NULL

Pane tähele kahte NULL rida. Kui `return_date` on NULL, annavad mõlemad võrdlused tulemuseks NULL väärtuse, mitte TRUE või FALSE, seega kumbki IF haru ei käivitu ja funktsioon tagastab NULL väärtuse – oodatava tulemuse, kuna tagastamata filmil pole võrdluskuupäeva.

Kasutaja määratud funktsioonid

Kui ainuüksi SQL-ist ei piisa kiiruseks, MySQL võimaldab kolmandat võimalust. Kasutaja määratletud funktsioonid (UDF-id) on kirjutatud kompileeritavas keeles, näiteks C or C++, mis on jagatud teeki sisse ehitatud ja serveriga registreeritud. Pärast lisamist kutsutakse neid välja nagu iga teist funktsiooni. Kuna UDF töötab serveriprotsessi sees natiivse koodina, sobib see suure arvutusvõimsusega tööks – kuid viga ühes võib serveri krahhi viia, seega kasutatakse UDF-e palju harvemini kui salvestatud funktsioone.

Sisseehitatud vs salvestatud vs kasutaja määratletud funktsioonid: millist peaksite kasutama?

Kõik kolm perekonda tagastavad ühe väärtuse ja neid saab kutsuda mis tahes SQL-lausest, kuid need erinevad selle poolest, kes neid kirjutab, kus neid käivitatakse ja kui suurt riski nad kannavad. Allolev tabel võtab need erinevused kokku.

Kriteerium Sisseehitatud funktsioonid Salvestatud funktsioonid Kasutaja määratletud funktsioonid (UDF-id)
Kes seda kirjutab Tarnitud koos MySQL Sina SQL-is Sina, C-s või C++
Kus see elab Serveri sees Andmebaasi sees, loodud funktsiooniga CREATE FUNCTION Serveri poolt laaditud kompileeritud jagatud teek
Tüüpiline kasutamine Vormindamine, matemaatika, liitmine Korduvkasutatavad ärireeglid, näiteks hilinenud tšekk Protsessorirohke või spetsialiseeritud loogika SQL ei suuda väljendada
Peamine risk mitte ükski Aeglane, kui kutsutakse välja rida-realt suure tabeli kohal Teegi krahh võib serveri maha võtta

Rusikareeglina alusta sisseehitatud funktsiooniga. Kui ükski ei sobi, kirjuta salvestatud funktsioon, et reegel asuks ühes kohas. Kasuta UDF-i ainult siis, kui salvestatud funktsioon on mõõdetavalt liiga aeglane.

KKK

Funktsioon peab tagastama täpselt ühe väärtuse ja seda saab kasutada SELECT-, WHERE- või ORDER BY-avaldise sees. Salvestatud protseduur tagastab null või mitu tulemuskomplekti, seda ei saa avaldisse manustada ja seda kutsutakse välja CALL-lausega.

Käivita DROP FUNCTION IF EXISTS sf_name ja loo see uuesti. MySQL puudub CREATE OR REPLACE FUNCTION ja ALTER FUNCTION muudab ainult omadusi, näiteks kommentaari või turbetüüpi, mitte kunagi sisu.

Nad saavad. WHERE-klauslis indekseeritud veeru ümber mähitud funktsioon takistab MySQL selle indeksi kasutamisest, sundides täielikku skaneerimist. Filtreeri toore veeru järgi ja rakenda funktsiooni ainult SELECT-loendis.

Jah. Tehisintellekti assistendid saavad CREATE FUNCTION koodi mustandit koostada lihtsa inglise keele reegli põhjal. Enne genereeritud sisu käivitamist tootmisserveris kontrollige alati selle õiget DETERMINISTIC karakteristikut, NULL-käsitlust ja parameetrite andmetüüpe.

Ei. Tehisintellekti mudelid saavad funktsioonide nimesid välja mõelda, NULL-juhtumeid vahele jätta või versioonierinevusi ignoreerida. Testige iga genereeritud funktsiooni andmete koopia peal ja kinnitage tulemusi päringuga, mille olete ise kirjutanud ja kontrollinud.

Võta see postitus kokku järgmiselt: