Modifikácia databázy a tabuľky, SELECT s obmedzeným počtom záznamov
V tejto kapitole si skompletizujeme informácie ohľadom upravovania databázy a tabuľky pomocou príkazov jazyka SQL. Na prvej prednáške sme sa naučili vytvoriť databázu pomocou príkazu CREATE DATABASE a taktiež sme si ukázali, ako pred definovaním príkazov určíme, aby sa vykonávali nad danou databázou (USE). Ak chceme vykonať zmeny už nad vytvorenou databázou, tak asi tušíte, vykoná sa to pomocou príkazu ALTER DATABASE (zmeniť databázu), za ktorým nasleduje názov databázy a následne príkaz, ktorý chceme vykonať, resp. popisuje danú zmenu. Veľa vecí sa už na existujúcej databáze meniť nedá a ani to nie je veľmi bežné, zvykne sa len možno meniť COLLATION nastavenie databázy, ale to si ani nemusíme skúšať, len aby ste vedeli, že sa to dá. Ak si pamätáte, ako sme mazali tabuľku (DROP TABLE), tak podobným spôsobom sa dá zmazať aj celá databáza. Tento príkaz však tiež nie je veľmi bežný, pretože odstráni úplne všetky tabuľky aj dáta a celkovo aj databázu. Len pre info, vykonáva sa to pomocou príkazu DROP DATABASE, za ktorým nasleduje názov databázy, ktorú chceme zmeniť.
Oveľa viac vecí sa dá meniť už na existujúcej tabuľke. Ako sme to viackrát už spravili (nastavili UNIQUE, AUTO_INCEREMENT, NULL a COLLATION), táto zmena sa vykonáva pomocou príkazu ALTER TABLE, za ktorým nasleduje názov tabuľky a následne príkaz na zmenu. My sme zatiaľ použili príkaz ADD (pridať), ktorým sme pridali vlastnosť unique na stĺpec id v tabuľke a potom už len príkaz CHANGE, ktorým sme menili celkovú definíciu konkrétneho stĺpca novým zadefinovaním jeho parametrov (ako pri CREATE TABLE).
Pomocou tohto príkazu vieme ale okrem menenia už existujúceho stĺpca aj celkovo spravovať stĺpce. Vieme pomocou tohto príkazu pridávať stĺpce a rovnako ich aj odoberať. Skúsme si teraz pridať nový stĺpec do našej tabuľky, ktorý si následne aj zmažeme. Pridanie stĺpca sa vykonáva pomocou príkazu ADD COLUMN (pridať stĺpec) a odstránenie stĺpca pomocou príkazu DROP COLUMN. Len na skúšku si to vyskúšajme s ľubovoľnými nastaveniami, mohlo by to vyzerťa asi takto:
ALTER TABLE users ADD COLUMN novy_stlpec BIGINT;
ALTER TABLE users DROP COLUMN novy_stlpec;
Po vykonaní príkazu na pridanie stĺpca si pozrite štruktúru tabuľky a uvidíte, že sa tam stĺpec naozaj nachádza a podobne po príkaze na jeho vymazanie si overte, že tam už nie je. Príkazov, ktoré je možné vykonať sa hlavným príkazom alter table je omnoho viac. Nejdeme sa nimi ale zbytočne nateraz zaťažovať, stačí nám nateraz v podstate príkaz change, pomocou ktorého vieme nanovo nadefinovať pri stĺpci všetko, čo potrebujeme, ako keby sme ho vytvárali cez v príkaze CREATE TABLE.
V tejto kapitole si ukážeme ešte niečo k príkazu SELECT. Ako vieme, tento príkaz slúži na vyťahovanie dát z databázy. Naučili sme sa, že vieme pri ňom použiť nejaké klauzuly, ktoré vrátený výsledok ovplyvnia, resp. podmieňujú aktuálne vyťahovanie dát z databázy. Tabuľky obsahujú vo väčšine veľké množstvo dát a nie vždy ich potrebujeme vyťahovať všetky. Ukázali sme si, že pomocou klauzuly WHERE vieme presne určiť, o ktoré dáta máme záujem.
Použitie tejto klauzuly nám však iba podmieni isté načítanie dát. Ak však potrebujeme mať nejaký podmienený select a jeho výsledok aj tak obsahuje množstvo záznamov, stále načítavame príliš veľké množstvo dát. Spomeňte si na náš projekt z minulého semestra, kde sme mali sekciu O nás, v ktorej sa nachádzala tabuľka používateľov. Predstavme si, že sa tieto dáta v tabuľke naťahujú z tabuľky users v našej databáze a taktiež, že táto tabuľka obsahuje niekoľko tisíc riadkov (používateľov). Okrem toho by táto tabuľka obsahovala ešte stĺpec pohlavie. Následne by sme chceli v našej tabuľke z nejakého dôvodu zobraziť všetkých používateľov ženského pohlavia. Zavolali by sme select, v ktorom by sme v klauzule WHERE mali podmienku na vyťahovanie len tých dát, ktoré majú povedzme v stĺpci gender (pohlavie) hodnotu female (ženské).
Síce by sme zúžili náš výber (select), aj tak by sme dostali niekoľko tisíc záznamov. Naša tabuľka na stránke v sekcii O nás by určite nezobrazovala na jedno načítanie, resp. na jedno zobrazenie stránky povedzme 10 000 záznamov. Bolo by to pomalé, neprehľadné a nie vhodné na čítanie a prezeranie pre používateľa. Mali by sme tam určite použité stránkovanie, podobne ako vo fotogalérii a na jednej stránke by sme povedzme zobrazovali len 10 záznamov. Pre zobrazenie ďalších záznamov by musel používateľ kliknúť na príslušné číslo stránky.
V takomto prípade by sa pri načítaní tejto sekcie na stránke zobrazovalo defaultne len 10 záznamov zo všetkých. To znamená, že by nám pomocou príkazu SELECT stačilo načítať iba prvých 10 záznamov z tabuľky, ostatné nás nezaujímajú. Analogicky na druhej stránke tabuľky (stránkovania) by nám stačilo načítať ďalších 10 záznamov v poradí, čiže záznamy od 10-19 (číslované od 0) a takto dokola. Ako to ale docielime?
Presne na toto slúži veľmi často používaná a efektívna klauzula LIMIT (obmedzenie/hranica), pomocou ktorej vieme zadefinovať selectu, koľko záznamov nám má vrátiť (načítať), resp. od ktorého záznamu a koľko má vybrať. Túto klauzulu je možné použiť dvomi spôsobmi. Ak zadáme za tento príkaz iba jedno číslo, určujeme tým maximálny počet záznamov, ktoré nám má select vrátiť. V tomto prípade nám vráti select prvých x (zadaný počet) záznamov z tabuľky. Príkaz pre načítanie napríklad prvých piatich používateľov z našej tabuľky by vyzeralo takto:
SELECT * from users LIMIT 5;
Po vykonaní tohto príkazu by sme mali dostať záznamy s id od 1 po 5, takže ako vidíte, select splnil našu podmienku na maximálny počet vrátených záznamov. Pre našu tabuľku so stránkovaním však nepotrebujeme dostávať iba prvé záznamy, ale postupne prejsť celú tabuľku po istých častiach. Povedzme si, že budeme zobrazovať dáta po troch záznamoch (na jednej stránke tabuľky budú zobrazení maximálne traja používatelia). Na to použijeme druhý spôsob využitia príkazu limit, kde zadávame za príkazom dve čísla.
V tomto prípade značí prvé číslo miesto, od ktorého záznamu chceme čítať, čiže ktoré všetky záznamy pred týmto poradovým číslom záznamu preskočí. Druhé číslo značí maximálny počet záznamov, ktoré dostaneme. Ak chceme načítať prvé tri záznamy z tabuľky, docielime to pomocou príkazu:
SELECT * from users LIMIT 3;
alebo
SELECT * from users LIMIT 0,3;
Po vykonaní prvého alebo druhého príkazu dostaneme prvé tri záznamy z tabuľky (s ID 1 až 3). Ako sme si povedali, prvé číslo v druhom prípade značí začiatočný záznam, čiže od ktorého sa začína načítavať (nula v tomto prípade značí prvý záznam) a druhé číslo nám hovorí, koľko maximálne dostaneme záznamov. Pre zobrazenie používateľov na druhej stránke našej tabuľky, čiže ľudovo zobrazenie ďalších troch, by príkaz vyzeral takto:
SELECT * from users LIMIT 3,3;
Po vykonaní tohto príkazu dostaneme ďaľšie tri záznamy z tabuľky, konkrétne s ID 4 až 6. Všimnite si dôležitú vec a to, že čísla (parametre) príkazu LIMIT nemajú nič spoločné s hodnotami v stĺpci ID alebo v akomkoľvek stĺpci. Tieto parametre sa týkajú čisto len poradového čísla záznamu v tabuľke, čo sa týka databázy. Čiže ak by aj ďalšie tri záznamy mali id napríklad 10-20-76, a boli by v tabuľke ako štvrtý, piaty a šiesty záznam, po vykonaní tohto príkazu by sa zobrazili.
Príkaz SELECT sa vždy viaže len na záznamy v tabuľke a ich poradia. Ak by sme k poslednému príkazu pridali napríklad zoradenie zostupne (odzadu) napríklad podľa stĺpca ID, dostali by sme v podstate štvrtý,piaty a šiesty záznam odzadu:
SELECT * from users ORDER BY id DESC LIMIT 3,3;
Keď si výsledok tohto príkazu porovnáte s dátami v prehľade tabuľky (sekcia browse), uvidíte, že sme skutočne dostali štvrtý, piaty a šiesty záznam odzadu. Takto by sme postupne prešli všetky dáta tabuľky s tým, že by sme len podľa poradového čísla aktuálne zobrazovanej stránky tabuľky v sekcii O nás menili číslo v príkaze LIMIT, od ktorého sa má začať zobrazovať. V prípade spomenutého filtra len na ženské pohlavie, by náš príkaz iba obsahoval podmienku pomocou klauzuly WHERE (pred ORDER BY) a ďalšie príkazy ako order a limit by sa následne vzťahovali už len na filitrované dáta.