$ psql rimmer1
Vytvořil jsem tabulku se jménem dluznici, která obsahuje sloupce se jménem a příjmením dlužníka, výši dluhu a datum, kdy se dlužník zadlužil. Jak vidíte, dluh je číslo s jedním desetinným místem (halíře) a maximální dluh může být 9 999 999,9. Můžete dokonce zadat i dluh záporný (to když si od někoho půjčíte). Věřím že nebudete nikomu půjčovat více jak 10 miliónů :)).rimmer1=> CREATE TABLE dluznici (jmeno VARCHAR(10),prijmeni VARCHAR(15), rimmer1(> dluh_kc NUMERIC(8,1),zadluzen DATE); CREATE
Nyní naplňte tabulku těmito hodnotami.
rimmer1=> INSERT INTO dluznici VALUES ('Martin','Doktor',5000,
rimmer1(> '2002-09-20');
INSERT 18655 1
rimmer1=> INSERT INTO dluznici VALUES ('Linus','Torvalds',6030,
rimmer1(> '2002-09-21');
INSERT 18656 1
rimmer1=> INSERT INTO dluznici VALUES ('Jan Jakub','Ryba',10.5,
rimmer1(> '2002-09-21');
INSERT 18657 1
rimmer1=> INSERT INTO dluznici VALUES ('Martin','Ryba',10.5,
rimmer1(> '2002-09-21');
INSERT 18658 1
Chcete-li si hodnoty v tabulce prohlédnout (že tam opravdu jsou),
použijte příkaz SELECT.
Řekněme, že chcete vypsat jen ty dlužníky, kteří Vám dluží 5000Kč a více. Na konec příkazu SELECT tedy přidáme podmínku WHERE.
Jestli napíšete podmínku ve tvaru sloupec >= hodnota nebo hodnota <= sloupec je jedno, ovšem kde napíšete příkaz WHERE již jedno není. (Nemůžete napsat WHERE dluh_kc >= 5000 SELECT * FROM dluznici;).rimmer1=> SELECT * FROM dluznici WHERE dluh_kc >= 5000; jmeno | prijmeni | dluh_kc | zadluzen --------+----------+---------+------------ Martin | Doktor | 5000.0 | 2002-09-20 Linus | Torvalds | 6030.0 | 2002-09-21 (2 rows) rimmer1=>
Existují následující podmínky za WHERE:
| Podmínka | Užití | Význam |
|---|---|---|
| = | sloupec = hodnota | Vyberou se ty řádky, které mají v sloupci zadanou hodnotu |
| <> | sloupec <> hodnota | Vyberou se ty řádky, které nemají v sloupci zadanou hodnotu |
| != | sloupec != hodnota | To samé jako <>, jen jinak zapsáno. |
| < | sloupec < hodnota | Vyberou se ty řádky, které mají v sloupci menší hodnotu, než je hodnota v podmínce. |
| > | sloupec > hodnota | Vyberou se ty řádky, které mají v sloupci větší hodnotu, než je hodnota v podmínce. |
| <= | sloupec <= hodnota | Vyberou se ty řádky, které mají v sloupci menší nebo stejnou hodnotu, jako je hodnota v podmínce. |
| >= | sloupec >= hodnota | Vyberou se ty řádky, které mají v sloupci větší nebo stejnou hodnotu, jako je hodnota v podmínce. |
| IS NULL | sloupec IS NULL | Vyberou se ty řádky, které mají v sloupci hodnotu NULL |
| IS NOT NULL | sloupec IS NOT NULL | Vyberou se ty řádky, které nemají v sloupci hodnotu NULL |
| LIKE | sloupec LIKE 'retezec' | Vyberou se ty řádky, kde ve sloupci (s datovým typem řetězec)
odpovídá hodnota retezci za klíčovým slovem LIKE. Tento řetězec
může obsahovat dva zástupné znaky. % (procento) zastupuje řetězec libovolné délky (i délky 0) s libovolnými znaky. _ (podtržítko) zastupuje právě jeden libovolný znak. Například podmínka WHERE sloupec LIKE '_%A' vybere ty sloupce, kde je řetězec končící písmenem velké A a který má před ním minimálně jeden (libovolný) znak. |
| IN (ALL,ANY...) | sloupec IN (množina hodnot) | Tyto podmínky již nejsou tak triviální a budou vysvětleny v kapitole SELECT IV - poddotazy. Zatím se jimi nezabývejte. |
Pro pořádek připomínám, že hodnota NULL se ničemu nerovná (proto podmínky IS [NOT] NULL).
Vyberte všechny záznamy o dluzích Jan Jakuba Ryby (ne Martina Ryby!), které přesahují dlužnou částku 10 Kč.
rimmer1=> SELECT * FROM dluznici WHERE jmeno='Jan Jakub' AND rimmer1-> prijmeni = 'Ryba' AND dluh_kc > 10; jmeno | prijmeni | dluh_kc | zadluzen -----------+----------+---------+------------ Jan Jakub | Ryba | 10.5 | 2002-09-21 (1 row)
Vyberte všechny záznamy Jana Jakuba Ryby a Linuse Torvaldse, kde dluhy jsou vyšší než 10 Kč.
rimmer1=> SELECT * FROM dluznici WHERE rimmer1-> ((jmeno = 'Linus' AND prijmeni = 'Torvalds') OR rimmer1(> (jmeno = 'Jan Jakub' AND prijmeni = 'Ryba')) AND dluh_kc > 10; jmeno | prijmeni | dluh_kc | zadluzen -----------+----------+---------+------------ Linus | Torvalds | 6030.0 | 2002-09-21 Jan Jakub | Ryba | 10.5 | 2002-09-21 (2 rows)
Rozhodnete-li se odpustit dluh všem, kteří Vám dluží méně jak 10 Kč, smažete je z tabulky takto:
Při úspěšném provedení příkazu DELETE se vám ukáže na obrazovce DELETE n, kde n je počet smazaných řádků. Jelikož v tabulce nebyl nikdo s dluhem menším než 10 Kč, nebyl smazán žádný řádek.rimmer1=> DELETE FROM dluznici WHERE dluh_kc < 10; DELETE 0
Teď už pro Vás určitě nebude problém smazat všechny dluhy Martina Ryby.
rimmer1=> DELETE FROM dluznici WHERE jmeno = 'Martin' AND rimmer1-> prijmeni = 'Ryba'; DELETE 1
Vaše tabulka dlužníci by měla momentálně vypadat takhle:
Řekněme že Vám Martin Doktor vrátil 2000 Kč a dluží Vám tedy jen 3000. Hodnotu jeho dlužné částky změníte takto:rimmer1=> SELECT * FROM dluznici; jmeno | prijmeni | dluh_kc | zadluzen -----------+----------+---------+------------ Martin | Doktor | 5000.0 | 2002-09-20 Linus | Torvalds | 6030.0 | 2002-09-21 Jan Jakub | Ryba | 10.5 | 2002-09-21 (3 rows)
Pozor! Pokud by jste měli více záznamů o dluhu Martina Doktora, nastavili by jste je takto všechny na 3000! Proto by bylo ještě třeba přidat podmínkurimmer1=> UPDATE dluznici SET dluh_kc = 3000 WHERE prijmeni = 'Doktor'; UPDATE 1
Pokud by jste z nějakého důvodu uložili do tabulky několik dluhů jednoho člověka v jeden den, a několik těchto dluhů by bylo 5000kč, už by jste byli s takovouto tabulkou nahraný! Jakou podmínkou určit správný řádek? Takový problém se vyřeší buď zavedením primárho klíče nebo sloupcovým omezením UNIQUE (probereme později).
SQL umí řešit i jednoduché matematické výrazy. Chcete-li například odpustit všem 20Kč dluh, pak nejdříve smažete všechny řádky, kde je dluh menší než 20Kč, ale větší než 0 (své dluhy nemůžete smazat!) a poté dosadíte do sloupce dluh_kc hodnotu dluh_kc-20 pro řádky, kde je dluh větší než 0.
Následující příklad není příliš smysluplný, je tu jen pro ukázku změny více sloupců najednou. Co tento příkaz provede jistě odhadnete sami.rimmer1=> DELETE FROM dluznici WHERE dluh_kc < 20 AND dluh_kc > 0; DELETE 1 rimmer1=> UPDATE dluznici SET dluh_kc = dluh_kc-20 WHERE dluh_kc > 0; UPDATE 2
rimmer1=> UPDATE dluznici SET dluh_kc = dluh_kc/2+100,zadluzen='2002-09-22'; UPDATE 2
Tabulka dluznici již existuje jen pod jménem dluhy.rimmer1=> ALTER TABLE dluznici RENAME TO dluhy; ALTER
rimmer1=> ALTER TABLE dluhy RENAME dluh_kc TO dluh; ALTER
rimmer1=> \d dluhy
Table "dluhy"
Column | Type | Modifiers
----------+-----------------------+-----------
jmeno | character varying(10) |
prijmeni | character varying(15) |
dluhy | numeric(8,1) |
zadluzen | date |
Nyní přidáme nový sloupec navrat_dluhu, který bude typu DATE.
Jak vidíte přibyl nám nový sloupec, který je však celý prázdný (přesněji řečeno obsahuje pro všechny řádky hodnotu NULL).rimmer1=> ALTER TABLE dluhy ADD navrat_dluhu DATE; ALTER rimmer1=> SELECT * FROM dluhy; jmeno | prijmeni | dluhy | zadluzen | navrat_dluhu --------+----------+--------+------------+-------------- Linus | Torvalds | 3105.0 | 2002-09-22 | Martin | Doktor | 1590.0 | 2002-09-22 | (2 rows)
Použijeme tedy příkaz UPDATE a dáme všem dlužníkům čas 30 dní na splacení dluhu.
Poznámka pro pokročilé: UPDATE dluhy SET navrat_dluhu = zadluzen + interval '1 month';rimmer1=> UPDATE dluhy SET navrat_dluhu = zadluzen+30; UPDATE 2 rimmer1=> SELECT * FROM dluhy; jmeno | prijmeni | dluhy | zadluzen | navrat_dluhu --------+----------+--------+------------+-------------- Linus | Torvalds | 3105.0 | 2002-09-22 | 2002-10-22 Martin | Doktor | 1590.0 | 2002-09-22 | 2002-10-22 (2 rows)
rimmer1=>ALTER TABLE dluhy DROP COLUMN navrat_dluhu; ALTER TABLE
