Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
PHP - Část XXI. (SQL - získávání dat z databázových tabulek III)
22. listopadu 2000, 00.00 | pokračování seriálu o práci s SQL databází pomocí PHP. Dnes hlavně spojování tabulek v dotazu a další funkce spojené s příkazem SELECT.
Dnešní článek přináší objasnění
propojování více databázových tabulek v jednom SQL dotazu - v našem případě
SQL příkazu SELECT. Již v prvním článku, který se zabýval spoluprácí
PHP a MySQL, jsem nastínil problematiku vztahů mezi databázovými tabulkami.
Tabulky, které jsou spolu ve vztahu, jsou propojeny primárním a cizím klíčem,
což jsou položky v tabulkách, které mají pro navzájem související záznamy
stejnou hodnotu. Abychom si vše mohli předvést na příkladu, vytvoříme si
novou databázi s názvem např. 'db
', která bude obsahovat dvě
tabulky. V první budou zaznamenány údaje o zaměstnancích a v druhé budou
údaje o odděleních ve firmě, ve kterých pracují. Jak vytvořit novou databázi
a tabulku již známe z minulých článků, proto si zde uvedeme jen struktury
tabulek. První tabulka bude mít následující strukturu:
CREATE TABLE zamestnanci (
rc char(11) NOT NULL PRIMARY KEY,
jmeno varchar(40),
adresa varchar(60),
plat decimal(10, 2),
oddeleni int);";
Druhá tabulka bude mít následující strukturu:
CREATE TABLE oddeleni (
cislo_oddeleni int NOT NULL PRIMARY KEY,
nazev_oddeleni varchar(25));";
Co která tabulka obsahuje za data by mělo být
jasné z názvu položek - jen uvádím, že v tabulce zamestnanci
je položka oddeleni
, která bude obsahovat číslo oddělení,
shodné s daným číslem oddělení v tabulce oddeleni
. Mnohé z vás
teď jistě napadlo, proč pro uchování údajů o odděleních používat další
tabulku, když název oddělení můžeme napsat u každého zaměstnance přímo.
Důvod je jednoduchý - představte si např., že se někdy v budoucnu přejmenuje
nějaké oddělení, ve kterém pracuje X lidí. Kdybychom na uložení údajů
o oddělení nepoužili samostatnou tabulku, museli bychom název oddělení měnit
u každého zaměstnance zvlášť. Tak ho změníme jen v tabulce obsahující
název oddělení. Nad těmito možnými komplikacemi je vhodné se zamyslet vždy
ještě před návrhem databázové struktury.
Nyní si do tabulek vložte několik pomyslných
zaměstnanců a vytvořte si několik pomyslných oddělení. Nebudu zde uvádět,
jak přidat údaje do tabulky, protože jsem se tomu věnoval někdy v
minulosti. Nyní již k propojení tabulek. Zde je jasné, že máme propojeny
tabulky zamestnanci
a oddeleni
, které jsou ve vztahu oddeleni
= cislo_oddeleni
. Ukážeme si tedy příklad, jak vypsat jména zaměstnanců
a názvy oddělení, ve kterých pracují:
$sql = "SELECT zamestnanci.jmeno,
oddeleni.nazev_oddeleni
FROM zamestnanci, oddeleni
WHERE zamestnanci.oddeleni = oddeleni.cislo_oddeleni;";
Dobrým zvykem je zde v příkazu SELECT uvádět názvy požadovaných položek ve tvaru 'tabulka.položka' a to z toho důvodu, že v rozsáhlejších databázích se mohou vyskytnout v několika tabulkách položky se shodným názvem, které bychom potom jen těžko jednoznačně identifikovali. Za klauzulí FROM musíme uvést všechny relevantní tabulky, ze kterých požadované položky pocházejí. Podmínka za klauzulí WHERE zajišťuje, že ve výsledku bude u každého zaměstnance vypsáno oddělení, které má stejné číslo, jaké je uvedeno u zaměstnance. To je celý princip propojování tabulek v jednom SQL dotazu. Vše se dá ještě kombinovat pomocí klauzulí GROUP BY a HAVING, ale protože tyhle články mají pouze nastínit problematiku jazyka SQL, odkážu zájemce na materiály, které se věnují přímo jazyku SQL (na internetu je jich mnoho i v češtině).
Poslední, co zde u příkazu SELECT uvedu, je možnost výstupu z databáze v setříděné podobě. To se provádí pomocí klauzule ORDER BY, za kterou se uvádí položka tabulky, podle které se mají data na výstupu setřídit. Pokud bychom tedy chtěli vypsat jména a adresy všech zaměstnanců a chtěli bychom mít výpis tříděný abecedně podle jmen zaměstnanců, použili bychom:
$sql = "SELECT jmeno, adresa FROM
zamestnanci ORDER BY jmeno;";
Existuje i možnost sestupného třídění, stačí na konec zapsat modifikátor DESC:
$sql = "SELECT jmeno, adresa FROM
zamestnanci ORDER BY jmeno DESC;";
Ve starších verzích MySQL nastal problém při třídění položek, jejichž hodnoty obsahovaly diakritické znaky. Tento problém by již však v současné verzi měl být vyřešen.
Tím jsme dokončili stručný přehled možností SQL příkazu SELECT, v příštím článku se naučíme mazat a modifikovat záznamy v databázové tabulce.
Obsah seriálu (více o seriálu):
- PHP část I. - Úvod do jazyka
- PHP část II. - Instalace
- PHP - Část V. (Operátory)
- PHP - Část VIII.
- PHP - Část IX. (Vlastní funkce)
- PHP - Část X. (Proměnné ve funkcích)
- PHP - Část XI.
- PHP - Část XII. (Regulární výrazy)
- PHP - Část XIII. (Regulární výrazy podruhé)
- PHP - Část XIV. (PHP a databáze)
- PHP - Část XV. (Instalace MySQL ve Windows)
- PHP - Část XVI. (Instalace MySQL na LINUXu)
- PHP - Část XVII. (MySQL - vytvoření nové databáze)
- PHP - Část XVIII. (Vkládání dat do databáze)
- PHP - Část XIX. (MySQL - získávání dat z databáze)
- PHP - Část XX. (SQL - získávání dat z databáze II.)
- PHP - Část XXI. (SQL - získávání dat z databázových tabulek III)
- PHP - Část XXII. (MySQL - modifikace a mazání dat v tabulce)
- PHP část XXIII. - MySQL - přístupová práva
- PHP část XXIV. - PostgreSQL
- PHP část XXV. - Cookies
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007