MS SQL v příkladech: Dotazy v příkladech
Minule jsme si založili databázi a naplnili ji testovacími daty. Dnes se zaměříme na dotazování. Ukážeme si několik dotazů, některé budou opravdu jednoduché, některé budou složitější přes více tabulek. Seřadil jsem je podle obtížnosti. Dotazy jsou především výběrové (selecty), protože vkládání jsme si procvičili minule při tvorbě testovacích dat.
U dotazů přes více tabulek můžeme používat JOINY nebo klauzuli WHERE. Pokud je ve WHERE složitější podmínka přes více tabulek, MS SQL server si dotaz sám přeloží do JOINŮ. Je tedy v zásadě jedno, ke které možnosti se přikloníme. Ta s JOINy může být o něco rychlejší a můžeme dotaz sami lépe optimalizovat, WHERE je lidsky čitelnější. V článku používám obě možnosti.
Začněme:
Příklad 1: Vypsání komentářů napsaných v druhém kvartálu roku 2012, seřazených podle data.
SELECT Obsah, Datum FROM Komentar WHERE Datum BETWEEN '2012-3-1' AND '2012-6-30' ORDER BY Datum;
Příklad 2: Výpis uživatelů, jejichž přezdívka začíná na určité písmeno (využívá se na webu pro procházení uživatelů).
SELECT Nick, UzivatelID FROM Uzivatel WHERE Nick LIKE 'D%';
Příklad 3: Zjistěte, kolik uživatelů má email se Seznamu.
SELECT COUNT(*) Vysledek FROM Uzivatel WHERE Email LIKE '%@seznam.cz';
Příklad 4: Přejmenování sekce (sekce jsou často přejmenovávány z důvodu SEO optimalizace), u přejmenování jsou parametry starý název a nový název.
UPDATE Sekce SET Nazev = ('České hry') WHERE Nazev = 'Hry';
Příklad 5: Zjistit celkové body (součet jednotlivých score) výsledků testů od určitého uživatele, podle jeho ID.
SELECT SUM(Skore) Vysledek FROM VysledekTestu WHERE UzivatelID = 2;
Příklad 6: Vypsání nejnovějšího článku včetně nicku autora do widgetu na titulní stránce.
SELECT TOP 1 c.Perex, c.PrettyURL, c.Titulek, c.Publikovano, u.Nick FROM Clanek c, Uzivatel u WHERE (u.UzivatelID = c.AutorID) ORDER BY c.Publikovano DESC;
Příklad 7: Vypsání článku a přezdívky autora podle URI článku.
SELECT c.Perex, c.PrettyURL, c.Keywords, c.Titulek, c.Obsah, c.Publikovano, u.Nick FROM Clanek c, Uzivatel u WHERE ((c.PrettyURL = 'co-je-to-algoritmus') AND (c.AutorID = u.UzivatelID));
Příklad 8: Vypsání článků v určité sekci podle názvu sekce.
SELECT Clanek.PrettyURL, Clanek.Titulek FROM Clanek, ClanekSekce, Sekce WHERE (ClanekSekce.ClanekID = Clanek.ClanekID) AND (ClanekSekce.SekceID = Sekce.SekceID) AND (Sekce.Nazev = 'Algoritmy');
Příklad 9: Vyhledání v nadpisu a perexu článku, které vrací informace o nalezených článcích včetně autora a odkazu.
SELECT c.Perex, c.PrettyURL, c.Titulek, u.Nick FROM Clanek c JOIN Uzivatel u ON (c.AutorID = u.UzivatelID) WHERE ((c.Titulek LIKE '%je%') OR (c.Perex LIKE '%je%'));
Příklad 10: Vypsání přehledu testů a výsledků pro jednoho uživatele.
SELECT Titulek, Skore FROM VysledekTestu, Uzivatel, Test WHERE (Uzivatel.UzivatelID = VysledekTestu.UzivatelID) AND (Test.TestID = VysledekTestu.TestID) AND (Uzivatel.UzivatelID = 1);
Příklad 11: Vypsání prvních 15ti komentářů k danému článku, seřazených od nejnovějších po nejstarší podle URI článku a to včetně nicku uživatele, který komentář napsal.
SELECT TOP 15 k.Obsah, k.Datum, c.PrettyURL, u.Nick FROM Komentar k JOIN Clanek c ON (c.ClanekID = k.ClanekID) JOIN Uzivatel u ON (k.UzivatelID = u.UzivatelID) WHERE (c.PrettyURL = 'cheese-mouse-oddechova-plosinovka') ORDER BY k.Datum DESC;
Příklad 12: Vypsání všech komentářů k danému článku, seřazených od nejstarších po nejnovější podle URI článku a to včetně přezdívky uživatele, který komentář napsal.
SELECT k.Obsah, k.Datum, c.PrettyURL, u.Nick FROM Komentar k JOIN Clanek c ON (c.ClanekID = k.ClanekID) JOIN Uzivatel u ON (u.UzivatelID = k.UzivatelID) WHERE (c.PrettyURL = 'cheese-mouse-oddechova-plosinovka') ORDER BY k.Datum;
Příklad 13: Vypsání 15ti nejnovějších komentářů do widgetu na titulní stránce včetně názvu článku a přezdívky autora. Komentáře se týkají všech článů a jsou řazeny od nejnovějšího po nejstarší.
SELECT TOP 15 k.Obsah, k.Datum, c.Titulek, u.Nick FROM Komentar k JOIN Clanek c ON (c.ClanekID = k.ClanekID) JOIN Uzivatel u ON (k.UzivatelID = u.UzivatelID) ORDER BY k.Datum DESC;
Příklad 14: Výpis tabulky uživatelů a jejich článků tak, aby v ní byli všichni uživatelé a všechny články. Pokud uživatel žádný článek nenapasal, bude u něj hodnota NULL.
SELECT u.Nick, c.Titulek FROM Uzivatel u LEFT JOIN Clanek c ON (c.AutorID = u.UzivatelID);
Příště se podíváme na poddotazy.