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.