MySQL aneb u?íme se SQL jazyk (VIII.)

Autor: Ji?í Luká? <jirilukas(at)supersvet.cz>, Téma: MySQL, Vydáno dne: 31. 10. 2000

Zhruba po m?sí?ní pomlce vás op?t vítám u dal?ího v po?adí ji? osmého dílu na?eho seriálu "MySQL aneb u?íme se SQL jazyk", který si klade za cíl seznámit vás prost?ednictvím databázového serveru MySQL s rela?ními databázovými systémy a SQL jazykem.

Dnes dokon?ím výklad SQL p?íkazu SELECT a za?nu výklad p?íkazu DELETE, s jeho? pomocí se vymazávají data z tabulky, nikoli v?ak tabulka samotná (viz. pátý díl)!

Ov?em je?t? ne?-li se za?neme zabývat vý?e nazna?enými úkoly, rád bych roz?í?il mno?ství dat v na?í tabulce o n?co málo záznam?, aby lépe vynikly ní?e probírané p?íkazy.

INSERT INTO zamestnanec VALUES (3,"Jiri","Lopata",5000);
INSERT INTO zamestnanec VALUES (4,"David","Mikes",6500);
INSERT INTO zamestnanec VALUES (5,"Tomas","Privratsky",6500);
INSERT INTO zamestnanec VALUES (6,"Petr","Vomacka",9000);

Seskupování ?ádk? v tabulce

Pro seskupení ?ádk? se stejnými hodnotami ve specifikovaném sloupci a jejich nahrazení jednou hodnotou odpovídající spole?né hodnot? se pou?ívá pod p?íkaz GROUP BY jména_sloupc?, který je sou?ástí SQL p?íkazu SELECT. Jeliko? si myslím, ?e pravou hodnotu tohoto p?íkazu lze pochopit jen z n?jakého reálného p?íkladu, nebudu vás dále zat??ovat slovním popisem tohoto p?íkazu a rad?ji ihned p?istoupím k ukázkovému p?íkladu.

Vzorový p?íklad ?íslo sedm: (Zadání: A) Prove?te výb?r/výpis tabulky "zamestnanec" tak, aby byly shodné hodnoty ve sloupci "plat" seskupeny do jedné ?ádky a neopakovaly se tak ?ádky se stejnou hodnotou v tomto sloupci. B) Prove?te tentý? výb?r s tím, ?e na míst? v syntaxi ozna?ené jako "specifikace_výstupních_sloupc?" (viz. ?estý díl) nepou?ijete zástupný symbol hv?zdi?ku, ale p?ímo specifikujete sloupec "plat" a sou?tovou funkci "count(plat)", která ke ka?dé hodnot? sloupce "plat" se?te po?et shodných záznam?.)

?e?ení A:

mysql> SELECT * FROM zamestnanec
    -> GROUP BY plat;
+----------------+-------+----------+---------+
| poradove_cislo | jmeno | prijmeni | plat    |
+----------------+-------+----------+---------+
|              2 | NULL  | Ryba     |    NULL |
|              1 | Petr  | Novak    | 5000.00 |
|              4 | David | Mikes    | 6500.00 |
|              6 | Petr  | Vomacka  | 9000.00 |
+----------------+-------+----------+---------+
4 rows in set (0.05 sec)

?e?ení B:

mysql> SELECT plat,count(plat) FROM zamestnanec
    -> GROUP BY plat;
+---------+-------------+
| plat    | count(plat) |
+---------+-------------+
|    NULL |           0 |
| 5000.00 |           2 |
| 6500.00 |           2 |
| 9000.00 |           1 |
+---------+-------------+
4 rows in set (0.05 sec)

Jak sami vidíte, tak seskupovací pod p?íkaz GROUP BY je sice "silný nástroj" (- v jistém slova smyslu), ale v ur?itých situací jeho pou?itím nezískáme nic, ba naopak. Ukázkou takového ?patné pou?ití je první zadání ozna?ené jako A, které je sice správn? vy?e?eno a po syntaktické stránce je v po?ádku, av?ak jeho provedením nezískáme nic u?ite?ného - zobrazí se v?echny ?ádky, kde dojde poprvé k výskytu dané hodnoty ve sloupci "plat".

Na druhou stranu výstupem druhé varianty tého? p?íkladu ozna?eného jako B je pom?rn? u?ite?ná tabulka, která nám ?íká, kolik zam?stnanc? evidovaných v této tabulce pobírá shodnou ?ástku uvedenou ve sloupci "plat".

Pozor! Sou?tová funkce COUNT(definice_s?ítané_v?ci) nes?ítá ?ádky, ve kterých se vyskytuje hodnota NULL.

Omezení souhrnných ?ádk? v tabulce

Pou?ijete-li v p?íkazu SELECT pod p?íkaz GROUP BY, m??ete pomocí podmínky za klí?ovým slovem HAVING agrega?ní_podmínka omezit, které souhrnné ?ádky budou uvedeny ve výsledku. Pouze souhrnné ?ádky, které splní uvedenou podmínku, jsou za?azeny do výsledného výstupu.

Vzorový p?íklad ?íslo osm: (Zadání: Prove?te výpis tabulky "zamestnanec" dle zadání vzorového p?íkladu 7B s tím, ?e je?t? navíc omezíte výstup souhrnných ?ádk? podmínkou typu HAVING, která ?íká, ?e v?echna výstupní data musí mít ve sloupci "plat" hodnotu vy??í ne? 5000,- K?.)

?e?ení:

mysql> SELECT plat,count(plat) FROM zamestnanec
    -> GROUP BY plat HAVING plat>5000;
+---------+-------------+
| plat    | count(plat) |
+---------+-------------+
| 6500.00 |           2 |
| 9000.00 |           1 |
+---------+-------------+
2 rows in set (0.05 sec)

Jeliko? si myslím, ?e více znalostí k pr?m?rnému ovládání SQL p?íkazu SELECT není zapot?ebí, tak bych tímto vý?e uvedeným vzorových p?íkladem ?íslo osmu tuto kapitolu uzav?el a p?e?el k nové s názvem ...

Vymazávání dat (?ádk?) z tabulky

Proto?e p?edpokládám, ?e asi ka?dý na základ? vý?e uvedeného nadpisu kapitoly tu?í, o ?em bude ?e?, nebudu se zdr?ovat zbyte?nými ?e?mi a hned p?ejdu k syntaxi SQL p?íkazu DELETE, s jeho? pomocí m??eme vymazávat data z tabulky.

Syntaxe: DELETE FROM jméno_tabulky WHERE podmínka

Pokud vám pod p?íkaz WHERE podmínka p?ipadá pon?kud pov?domí, tak máte pravdu, jeliko? jsme se jim ji? zabývali v rámci SQL p?íkazu SELECT a mohu vám ?íci, ?e se jedná o tentý? pod p?íkaz, který se ?ídí stejnými pravidly. Rozdíl je pouze v tom, jaký vliv má tato podmínka na výsledek p?íkazu DELETE oproti p?íkazu SELECT. Zatím co u p?íkazu SELECT jsme za pomoci tohoto pod p?íkazu dosáhli zú?ení vypsaných dat, u p?íkazu DELETE se tento pod p?íkaz pou?ívá ke stanovení konkrétní mno?iny ?ádk?, které mají být z tabulky vymazány.

Pozor! Pokud tento pod p?íkaz úpln? vypustíte z p?íkazu DELETE, tak dojde k vymazání celé tabulky, tedy bude zru?en ve?kerý obsah tabulky, jen? se daný p?íkaz DELETE týká!

P?í?t? dokon?íme výklad SQL p?íkazu DELETE a podíváme se na úpravu dat ulo?ených v tabulce. P?eji p?íjemný týden ...




Copyright supersvet.cz, 1998-2005