Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

MS SQL v príkladoch: Otázky v príkladoch

Minule sme si založili databázu a naplnili ju testovacími dátami. Dnes sa zameriame na dopytovanie. Ukážeme si niekoľko otázok, niektoré budú naozaj jednoduché, niektoré budú zložitejšie cez viacero tabuliek. Zoradil som ich podľa obtiažnosti. Otázky sú predovšetkým výberové (selecty), pretože vkladanie sme si precvičili minule pri tvorbe testovacích dát.

Pri dotazoch cez viac tabuliek môžeme používať JOINY alebo klauzulu WHERE. Pokiaľ je vo WHERE zložitejšia podmienka cez viac tabuliek, MS SQL server si otázku sám preloží do JOINOV. Je teda v zásade jedno, ku ktorej možnosti sa prikloníme. Tá s JOINmi môže byť o niečo rýchlejšia a môžeme otázku sami lepšie optimalizovať, WHERE je ľudsky čitateľnejšia. V článku používam obe možnosti.

Začnime:

Príklad 1: Vypísanie komentárov napísaných v druhom kvartáli roku 2012, zoradených podľa dátumu.

SELECT
    Obsah,
    Datum
FROM Komentar
WHERE Datum BETWEEN '2012-3-1' AND '2012-6-30'
ORDER BY Datum;

Príklad 2: Výpis užívateľov, ktorých prezývka začína na určité písmeno (využíva sa na webe na prehliadanie užívateľov).

SELECT Nick, UzivatelID FROM Uzivatel
WHERE Nick LIKE 'D%';

Príklad 3: Zistite, koľko užívateľov má email zo Zoznamu.

SELECT
    COUNT(*) Vysledek
FROM Uzivatel
WHERE Email LIKE '%@seznam.cz';

Príklad 4: Premenovanie sekcie (sekcie sú často premenovávané z dôvodu SEO optimalizácie), pri premenovaní sú parametre starý názov a nový názov.

UPDATE Sekce
SET Nazev = ('České hry')
WHERE Nazev = 'Hry';

Príklad 5: Zistiť celkové body (súčet jednotlivých score) výsledkov testov od určitého užívateľa, podľa jeho ID.

SELECT
    SUM(Skore) Vysledek
FROM VysledekTestu
WHERE UzivatelID = 2;

Príklad 6: Vypísanie najnovšieho článku vrátane nicku autora do widgetu na titulnej stránke.

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;

Príklad 7: Vypísanie článku a prezývky autora podľa 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));

Príklad 8: Vypísanie článkov v určitej sekcii podľa názvu sekcie.

SELECT
    Clanek.PrettyURL,
    Clanek.Titulek
FROM Clanek, ClanekSekce, Sekce
WHERE
    (ClanekSekce.ClanekID = Clanek.ClanekID) AND
    (ClanekSekce.SekceID = Sekce.SekceID) AND
    (Sekce.Nazev = 'Algoritmy');

Príklad 9: Vyhľadanie v nadpise a perexe článku, ktoré vracia informácie o nájdených článkoch vrátane 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%'));

Príklad 10: Vypísanie prehľadu testov a výsledkov pre jedného používateľa.

SELECT
    Titulek,
    Skore
FROM VysledekTestu, Uzivatel, Test
WHERE (Uzivatel.UzivatelID = VysledekTestu.UzivatelID) AND
      (Test.TestID = VysledekTestu.TestID) AND
      (Uzivatel.UzivatelID = 1);

Príklad 11: Vypísanie prvých 15tich komentárov k danému článku, zoradených od najnovších po najstaršie podľa URI článku a to vrátane nicku používateľa, ktorý komentár napísal.

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;

Príklad 12: Vypísanie všetkých komentárov k danému článku, zoradených od najstarších po najnovšie podľa URI článku a to vrátane prezývky používateľa, ktorý komentár napísal.

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;

Príklad 13: Vypísanie 15 najnovších komentárov do widgetu na titulnej stránke vrátane názvu článku a prezývky autora. Komentáre sa týkajú všetkých článkov a sú radené od najnovšieho po najstaršie.

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;

Príklad 14: Výpis tabuľky používateľov a ich článkov tak, aby v nej boli všetci používatelia a všetky články. Pokiaľ užívateľ žiadny článok nenapasal, bude u neho hodnota NULL.

SELECT
    u.Nick, c.Titulek
FROM Uzivatel u
    LEFT JOIN Clanek c
        ON (c.AutorID = u.UzivatelID);

Nabudúce sa pozrieme na poddotazy.


 

Všetky články v sekcii
Databázy v C# - ADO.NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity