SQL – jak na funkce

27. února 2001

Po delší odmlce se k vám vracím se články o databázích. Dnešním článkem napravím malý rest, kterého jsem se během psaní seriálu o SQL dopustil. Povím vám obecně o funkcích jazyka SQL. V restrikcích příkazu SELECT jsme doposud používali standardní relační operátory. Kromě nich můžete ve výrazech použít i matematické, logické, nebo řetězcové funkce. Základnímu přehledu a popisu funkcí je věnován tento článek.

O funkcích obecně

V databázových systémech najdete dvě základní skupiny funkcí. S jednou z  nich jsme se již setkali v tomto článku. Jednalo se o agregační funkce, jejichž vstupem byly typicky množiny řádků (záznamů) a z nich byla počítána hodnota (pro připomenutí, jednalo se o funkce count, max, min, avg a sum).

Kromě nich jsou v databázových systémech dostupné i tzv. skalární funkce, které se většinou aplikují na jeden argument (sloupec) a vrací opět jednu hodnotu. Databázové systémy obsahují jen malou množinu základních funkcí, která by byla pro všechny stejná. Většinou se setkáte s funkcemi, které jsou specifické pro určité databázové systémy. Lze konstatovat, že čím dražší databázový systém, tím větší počet vestavěných funkcí, a to nejen základních, ale i speciálních, např. pro nějaké konverze, apod. Já se budu držet základu a uvedu zde funkce, které jsou více méně společné pro všechny systémy. O některých speciálních se zmíním jen okrajově.

Funkce můžeme volat ve všech SQL příkazech, zejména pak v dotazech. Samozřejmě, že ne náhodně, ale tam, kde je očekávána hodnota (funkce zase vrací jednu hodnotu, kromě pár výjimek).

Číselné funkce

Nejširší množinu funkcí zastupují číselné funkce. Jejich argumentem bývává zpravidla číselná hodnota a takové funkce zase vrací jednu číselnou hodnotu. Ty nejzákladnější uvedu v jednoduchém výčtu, bez bližšího popisu:

  • abs(X) – absolutní hodnota z čísla X
  • cos(X) – cosinus úhlu X (zadaného v radiánech)
  • exp(X) – e na X-tou
  • sin(X) – sinus úhlu X
  • tan(X) – tangens úhlu X
  • tanh(X) – hyperbolický tangens X
  • round(X) – zaokrouhlení čísla X, někdy i druhý parametr N udávající počet des. míst
  • trunc(X[,n]) – „oříznutí“ čísla X na N des. míst, N nepovinné, není-li uveden, pak X je ořezáno na celé číslo

Uvedený výčet reprezentuje absolutní minimum, které je podporováno ve většině databázových systémů. Další funkce pro konkrétní systém najdete zpravidla v  přiložené dokumentaci.

Práce s řetězci

Vedle číselných funkcí bude velké praktické využití u funkcí řetězcových. Vstupem takových funkcí bývá jeden znak, nebo celý řetězec, výstupem opět znak, nebo řetězec znaků. V některých případech, jak sami uvidíte, může být výstupem i číslo.

  • CHR(N) – vrací znak, jehož ASCII hodnotou je číslo N (z intervalu 0..255); mějte na paměti, že znaky s ASCII hodnotami 0 až 31 jsou obecně netisknutelné
  • CONCAT(řetězec1, řetězec2) – zřetězení dvou řetězců do jednoho; v mnoha systémech lze použít přímo operátor „+“; příklady:
SELECT příjmení+‘, ‚+jméno AS „Celé jméno“
FROM lidé

SELECT CONCAT(příjmení, CONCAT (‚, ‚, jméno)) AS „Celé jméno“
FROM lidé

  • SUBSTR/SUBSTRING – funkce vracející nějaký podřetězec, nejtypičtější jejich použití je se třemi parametry: řetězec, počáteční pozice a kolik znaků se má vrátit; následující příklad vrátí z každého hesla třetí až šesté písmeno:
SELECT substr(heslo, 3, 4)
FROM passwords
  • LENGTH(S) – vrací délku řetězce S; v systémech se můžete ještě setkat s názvem LEN; následující příklad vypisuje seznam osob s jejich adresami, který je seřazen právě podle délky adresy:
SELECT jméno, adresa
FROM lidé_adresy
ORDER BY length(adresa)
  • UPPER/UCASE – převedení řetězce na velká písmena, argumentem je jeden řetězec, výstupem ten samý řetězec převedený na velká písmena
SELECT upper(název), číslo
FROM místnosti
WHERE upper(název) LIKE ‚%ROOM‘

Uvedené názvy funkcí berte s rezervou, je docela možné, že zrovna ve vašem databázovém systému se bude příslušná funkce jmenovat jinak. Že by nebyla vůbec implementovaná, to považuji za nepravděpodobné, neboť zde uvedené funkce považuji za jakési minimum řetězcových funkcí, které mají opodstatněné využití.

Datum

Databázové systémy se ve svých funkcích s datumy liší nejvíce. Základní funkcí je funkce pro získání aktuálního data. Typicky se tato funkce jmenuje DATE, DATETIME, nebo SYSDATE, či NOW. V různých systémech můžete ale narazit na odlišnosti. Standard jazyka SQL definuje typ DATE, na který lze pohlížet jako na řetězec, jež má speciální (předepsaný) formát. Ten závisí na nastavení prostředí systému. Následující příklad zobrazí jména ubytovaných hostů, kteří jsou ubytováni někdy mezi 12. až 16. březnem 2001:

SELECT jméno, pokoj
FROM ubytování
WHERE datum >= ‚2001-MAR-12‘
  AND datum <= ‚2001-MAR-16‘

Většina systémů nabízí řadu konverzních funkcí, které umožňuji programátorovi pracovat s příjemnějším formátem datumu. Typicky taková funkce bude mít jeden z  parametrů vyhrazený pro „masku“ formátu, jehož obsahem by mohlo být např. „DD/MM/RR“. Lepší systémy vám budou nabízet i funkce na samostatné zjištění dne, měsíce, hodiny, vteřiny, funkce na přičtení dnů k určitému datu, apod.

Konverzní funkce

Poslední základní skupinou skalárních funkcí jsou konverzní funkce. Obecně se jedná o převodní funkce z některých typů na číslo nebo řetězec. Pravděpodobně byste v systému hledali funkce jako TO_CHAR, TO_NUMBER, VAL či STR. Mezi ně patří už i zmíněná funkce CHR.

Tento článek v žádném případě nelze brát jako vyčerpávající přehled všech skalárních funkcí, které máme k dispozici. Spíše jsem na tyto funkce chtěl poukázat v obecnější rovině, abyste měli představu, jaké typy funkcí vůbec můžete při konstrukcích dotazů (a nejen při nich) použít. V neposlední řadě stojí za zmínku připomenout, že samozřejmě máte možnost si naprogramovat funkce vlastní, ale s tím vás seznámím až v některém z příštích článků.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *