Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.


 

Všechny články v sekci
Databáze v C# - ADO.NET
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
4 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity