MS SQL v příkladech: Dotazy v příkladech

C# .NET Databáze 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.


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentáře

Avatar
lukas kantor
Člen
Avatar
lukas kantor:

Díky, užitečné 8-)

Odpovědět 10.8.2015 23:45
Život je jen plochý kruh.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.