Argumenty jsou data, se kterými se manipuluje nebo které se používají pro získání výsledků funkce. Například funkce MAX(argument) má jeden argument (sloupec). Argumenty se uvádějí v závorce za jménem funkce, pokud jich je více, oddělují se čárkou (nebo středníkem, záleží na nastavení národního prostředí). Funkcí, která nemá argumenty je například funkce current_date, která má jen návratovou hodnotu (aktuální datum).
Návratová hodnota funkce může být číslo, řetězec, tabulka atp. V případě funkce MAX je to největší hodnota ze sloupce, který je jí předán jako argument.
Pokud chcete funkce vyzkoušet "nanečisto", pak je můžete spustit pomocí příkazu SELECT.
rimmer=> select date('25.6.2002');
date
------------
2002-06-25
(1 row)
rimmer1=> SELECT prijmeni,jmeno,LENGTH(prijmeni)+LENGTH(jmeno) AS "Delka jmena" rimmer1-> FROM zamestnanci; prijmeni | jmeno | Delka jmena ----------+---------+------------- Pavova | Lenka | 11 Pavova | Jana | 10 Mala | Jana | 8 Pavova | Lenka | 11 Jerry | Tom | 8 Luter | Martin | 11 King | Leopold | 11 Mann | Tomas | 9 Trn | Vasek | 8 Osel | Stary | 9 Novy | Pan | 7 (11 rows)
Příkladem budiž funkce MAX nebo AVG (=průměr).
rimmer1=> SELECT MAX(plat) FROM zamestnanci;
max
-------
22000
(1 row)
rimmer1=> SELECT MAX(plat) FROM zamestnanci GROUP BY oddeleni_id;
max
-------
12000
15000
22000
(3 rows)
rimmer1=> SELECT oddeleni_id,MAX(plat) FROM zamestnanci GROUP BY oddeleni_id
rimmer1-> HAVING AVG(plat) >= 11000;
oddeleni_id | max
-------------+-------
2 | 15000
3 | 22000
(2 rows)
rimmer1=> SELECT * FROM zamestnanci WHERE oddeleni_id IN
rimmer1-> (SELECT oddeleni_id FROM zamestnanci GROUP BY
rimmer1-> oddeleni_id HAVING AVG(plat) >= 11000);
jmeno | prijmeni | plat | oddeleni_id | rodne_cislo
---------+----------+-------+-------------+-------------
Lenka | Pavova | 15000 | 2 | 8001010604
Tom | Jerry | 15000 | 2 | 8001010605
Martin | Luter | 12000 | 2 | 8001010606
Leopold | King | 13000 | 2 | 8001010607
Tomas | Mann | 22000 | 3 | 8001010608
Vasek | Trn | 16000 | 3 | 8001010609
Stary | Osel | 9000 | 3 | 8001010610
(7 rows)
V posledním příkladě jsem použil poddotaz, abych vypsal všechny zaměstnance,
kteří jsou v odděleních, jejichž průměrný plat je vyšší než 11000.
| Název | Význam | Typ agrumentu |
|---|---|---|
| AVG | Vrátí průměrnou hodnotu. | bigint,double precision, integer, interval, numeric, real, smallint |
| COUNT | Vrátí počet položek v argumentu. | Všechny typy |
| MAX | Vrátí největší hodnotu. | abstime, bigint, date, integer, interval, money, numeric, real, text atd. |
| MIN | Vrátí nejmenší hodnotu. | viz MAX |
| STDDEV | Spočte směrodatnou odchylku. | bigint, double precision, integer, numeric, real, smallint |
| SUM | Vrátí součet hodnot v množině. | bigint,double precision, integer, interval, money, numeric, real, smallint |
| VARIANCE | Rozptyl hodnot v množině. | bigint,variance,double precision, integer, numeric, real, smallint |
| Název | Návratová hodnota |
|---|---|
| ABS(x) | Absolutní hodnota. |
| CINT(x) | Převede jakýkoliv číselný datový typ nebo řetězec (ve kterém je zapsáno číslo) na celé číslo. |
| CBRT(x) | Třetí odmocnina x. |
| COS(x) | Cosínus zadaného úhlu v radiánech. |
| EXP(x) | e na x-tou, kde e=2.7182 a x je reálné číslo (nikoliv celé číslo!). Celé číslo můžete na reálné převést například pomocí funkce ROUND takto: EXP(ROUND(x,0)) (x nesmí být příliš velké číslo). |
| FACTORIAL(x) | faktoriál x, kde x je celé číslo. |
| FLOOR(x) | Vrátí nejbližší celé číslo menší nebo rovno argumentu. |
| MOD(x,y) | Zbytek po celočíselném dělení x/y (x a y jsou celá čísla). |
| RANDOM() | Náhodné číslo v intervalu <0,1> (Bez argumentu, závorky jsou přesto nutné!). |
| ROUND(x,y) | Číslo x se zaokrouhlí na y desetinných míst. |
| SIN(x) | Sínus zadaného úhlu v radiánech. |
| SQRT(x) | Druhá odmocnina x, kde x je reálné číslo (nikoliv celé číslo! viz funkce EXP výše). |
| TAN(x) | Tangens zadaného úhlu v radiánech. |
| Název | Návratová hodnota |
|---|---|
| retezec || retezec |
|| - toto není funkce ale operátor, který spojí dva řetězce v jeden. V jiných databázích (než PostgeSQL) se pro spojování řetězců používá funkce CONCAT nebo operátor +. |
| INITCAP(x) | Převede u všech slov v řetězci x první písmeno na velké a všechna další ve slově na malé. |
| LOWER(x) | Převede všechna písmena v řetězci x na malá. |
| LENGTH(x) | Vrací počet znaků v řetězci. |
| TRIM(x) | Ořízne všechny mezery z leva i z prava řetězce x. |
| UPPER(x) | Převede všechna pímsena v řetězci x na velká. |
| Název | Návratová hodnota |
|---|---|
| current_timestamp | Vrací aktuální datum a čas (např. 2002-12-29 20:22:31.610797+00). Toto není funkce ale makro, proto se nepoužívají závorky! Může se použít třeba v podmínce DEFAULT |
| current_date | Vrací akutální datum. |
| current_time | Vrací aktuální čas. |
| abstime(x) | Převede čas x (date, nebo timestamp) do formátu abstime (např. abstime(current_date) vrátí 2002-12-29 20:22:40+00) |
| date(x) | Převede x na datum. x může být typu date, abstime, text. (např. date('25.6.2002') vrátí 2002-06-25). |
| - | - je samozřejmně operátor odečítání, jen jsem chtěl upozornit, že je možné časy odečítat. Výsledkem je počet dní (pokud odečítáte datumy) nebo čas (pokud odečítáte časy), nebo počet vteřin, pokud odečítáte typ timestamp (datum + čas). |
rimmer=> SELECT date('7.7.2002') - date('9.7.2002');
?column?
----------
-2
rimmer=> select current_time - '21:05';
?column?
--------------------
00:03:14.203089+00
(1 row)
rimmer=> SELECT abstime('9.7.2002') - abstime('7.7.2002');
?column?
----------
172800
(1 row)
