Vlastnosti stĺpca (kódovanie, defaultná hodnota, zotriedenie)
Vráťme sa ešte na chvíľu k vlastnosti NULL. V poslednej prednáške sme túto vlastnosť priradili k nášmu stĺpcu pre priezvisko (user_surname). Vyskúšali sme si, že ak túto hodnotu pri takomto stĺpci nezadáme, hodí sa automaticky prázdna hodnota daného dátového typu, v našom prípade prázdny string. V prípade NULL stĺpca (user_name) sa hodí na dané miesto hodnota NULL označujúca prázdno. Aj keď sa táto hodnota zadáva automaticky, pokiaľ nie je pri inserte vyplnená, môžeme ju zadať aj priamo. Napríklad query INSERT INTO users (user_surname) VALUES ('Mak') by spôsobila ten istý výsledok ako query INSERT INTO users (user_name, user_surname) VALUES (NULL,'Mak'). Tento spôsob nemení nič na veci, len aby sme o tom vedeli, že to môžeme zadávať priamo v kóde, ak vieme, že nám nejaká hodnota neprišla, pre lepšiu prehľadnosť v kóde.
Pozastavme sa ešte nad tým, že sa automaticky hodí prázdna hodnota, ak pri inserte nič nezadáme. Niekedy chceme, aby náš stĺpec obsahoval v každom prípade nejakú hodnotu, ak nám aj dáta neprídu, niečo ako defaultnú (prednastavenú) hodnotu. To, čo sa nastaví v prípade nezadania hodnoty môžeme nastaviť pre stĺpec pomocou vlastnosti DEFAULT, za ktorou sa zadáva hodnota, ktorú chceme použiť ako defaultnú. Povedzme, že pri našom stĺpci user_surname nechceme, aby pri nezdaní hodnoty bol v tomto stĺpci uložený prázdy string, ale chceme, aby tam bola hodnota napríklad bez_priezviska. To, aby databáza automaticky vyplnila túto hodnotu, ak nie je zadaná iná, určujeme podobne ako pri vlastnosti NULL pri tvorbe tabuľky. My ju dodatočne zmeníme opäť cez príkaz CHANGE:
ALTER TABLE `users` CHANGE `user_surname` `user_surname` VARCHAR(50) NOT NULL DEFAULT 'bez_priezviska';
Pozrite si štruktúru (structure) tabuľky po vykonaní tohto príkazu. Všimnite si, že v stĺpci Default (prednastavená hodnota stĺpca) sa v riadku user_surname nachádza nami zadaná hodnota bez_priezviska. To znamená, že ak hodnota v tomto stĺpci zadaná nebude, vyplní sa táto hodnota namiesto prázdneho stringu. Poďme si to vyskúšať, či je to skutočne tak, zadajme insert iba s krstným menom, napríklad:
INSERT INTO users (user_name) VALUES ('Lenka');
Pozrite si prehľad (browse) tabuľky po vykonaní tohto príkazu. Ako vidíte, skutočne nám v stĺpci user_surname posledného záznamu vyplnila databáza nami nastavenú hodnotu DEFAULT pre tento stĺpec (bez_priezviska). Pomocou tejto vlastnosti vieme teda nastaviť stĺpcom, aby mali nami žiadanú prednastavenú hodnotu. Využíva sa to v prípadoch, kedy napríklad chceme, aby mali skoro všetci používatelia niečo nastavené rovnako, ale len v špeciálnych prípadoch (ak je to zadané pri inserte) aby mali niektorí inú hodnotu. Napríklad aby všetci nedostávali newsletter, defaultná hodnota v tabuľke tohto stĺpca by bola nie (nedostávať), ale tí, ktorí by o to dodatočne požiadali, by tam mali áno (dostávať newsletter – novinky mailom) a podobne...
Pri zadávaní dát sme sa zatiaľ zaoberali len tým, či sú dáta číselného alebo stringového formátu. Keď rozprávame o stringovom formáte, spomeňte si, ako sme pri webstránke zadávali kódovanie zobrazovaného textu na stránke, aby ho prehliadače zobrazili správne (charset=“UTF-8“). Niečo podobné sa zadáva aj v databázach pri stĺpcoch so stringovým typom. Keďže databáza môže uchovávať dáta v akomkoľvek formáte (naša abeceda, ruská azbuka, čínske znaky a pod.), každý stĺpec má špecifikované, v akom kódovaní sú zadané jeho hodnoty, aby sa správne uchovávali, zobrazovali a následne exportovali/importovali medzi databázami.
Znakové kódovanie sa dá nastaviť všeobecne pre celú databázu pri jej vytváraní, pri tabuľke a nakoniec aj pri samotnom stĺpci. Keďže sme túto vlastnosť nešpecifikovali pri vytváraní databázy alebo tabuľky, máme tam nastavené defaultné hodnoty systému. Môžeme si to skontrolovať v sekcii štruktúry tabuľky users, kde vidíme pri stringových typoch v stĺpci collation (ťažký preklad - niečo ako zotriedenie znakov) momentálne nastavenú hodnotu. Zrejme tam bude mať každý z vás nastavené niečo iné. Hodnôt, ktoré môžu byť nastavené ako collation je neúrekom, pre ukladanie slovenských hodnôt by to mohlo byť napríklad kódovanie utf8_slovak_ci. Stručne si môžeme povedať, že podobne ako pri webstránke UTF-8 je univerzálna sada znakov a konkrétne vo verzii slovak bude určite obsahovať všetky naše znaky.
Túto vlastnosť si dodatočne nastavíme pre naše dva stringové stĺpce – user_name a user_surname nijak inak, ako pomocou príkazu CHANGE príkazu ALTER TABLE. Je to vlastnosť stĺpca, takže sa zadáva podobne ako vlastnoť NULL alebo DEFAULT za znakový typ. Zadáva sa kľúčovým slovom COLLATE, za ktorým nasleduje hodnota tejto vlastnosti. Naše príkazy pre dodatočné nastavenie kódovania by mali vyzerať takto:
ALTER TABLE `users` CHANGE `user_name` `user_name` VARCHAR(50) COLLATE utf8_slovak_ci NULL;
ALTER TABLE `users` CHANGE `user_surname` `user_surname` VARCHAR(50) COLLATE utf8_slovak_ci NOT NULL DEFAULT 'bez_priezviska';
Po vykonaní týchto príkazov si môžete skontrolovať v štruktúre tabuľky, že pri stringových stĺpcoch máme správne nastavené kódovanie, takže by ľubovoľné znaky nemali robiť v databáze žiadny problém. Nastavenie vlastnosti COLLATION má aj iný význam a to konkrétne pri zotrieďovaní údajov v tabuľke, kde sa kódovanie (collation), podľa ktorého chceme zoraďovať, dá dodatočne nastavovať, tým sa ale zatiaľ nejdeme zaoberať.
Ako sme ale spomenuli, dáta sa dajú v tabuľke zotrieďovať. Čo to znamená? Aby ste sa nemýlil, neznamená to to, že môžeme dáta v tabuľke nejakým príkazom triediť, čiže meniť poradie záznamov. To by značne narušilo význam a štruktúru tabuľky s identifikátormi a podobe. Znamená to to, že dáta pri vyťahovaní z databázy vieme počas toho zoradiť ako chceme, resp. vieme ich dostať v želanom poradí. Ak si spomeniete na prácu s poliami v jazyky PHP, v jednom momente sme si tam ukázali, ako vieme dáta v poli zoradiť (napríklad poľa abecedy).
Niečo podobné sa dá spraviť aj v databázach rovno pri vyťahovaní dát (SELECT), takže nie je nutné ich dodatočne triediť podľa požiadaviek v kóde, kde sa s nimi pracuje. Toto je veľmi výhodná vec, pretože to ušetrí jednu dosť zdĺhavú a časovo náročnú operáciu navyše. Dáta sa dajú zatriediť zadaním príkazu ORDER BY za celým príkazom SELECT, za ktorým nasleduje názov stĺpca, podľa ktorého chceme zoradiť dáta a na konci zadáme spôsov zotriedenia - ASC (ascending) pre vzostupné a DESC (descending) pre zostupné triedenie. Ak by sme chceli dáta z našej tabuľky vytiahnuť zotriedenie podľa priezviska podľa abecedy, príkaz by vyzeral takto:
SELECT * FROM users ORDER BY user_surname ASC
Ako vidíte, dáta sme dostali zoradené podľa meny podľa abecedy, dôkaz poprehadzovania dát je viditeľný na číslach v stĺpci ID. Ešte raz si zopakujeme, že dáta v tabuľke po vykonaní tohto príkazy sú zoradené vždy tak, ako sú vkladané. Toto je len podoba dát, ako ich dostaneme po vykonaní tohto príkazy ako odpoveď – ako return tejto funkcie, keď to budeme mať v kóde.
Požiadaviek na zotriedenie dát môžeme mať aj viacej. Vložme si viacej dát napríklad s rovnakým priezviskom, ale iným krstným menom:
INSERT INTO users (user_name, user_surname) VALUES
('Zofia','Harper'),
('Alojz','Harper'),
('Karol','Harper');
Skontrolujte si v prehľade tabuľky (browse), ako vyzerajú dáta v tabuľke. Ako vždy, sú zoradené podľa ID, resp. sú zoradené podľa toho, ako sme ich vkladali. Teraz budeme chcieť dostať dáta zoradené podľa priezviska. Keďže vieme, že niektoré záznamy majú rovnaké priezvisko, tak chceme aj tie dáta ešte mať zoradené, napríklad podľa krstného mena. Viacero požiadaviek na zoradenie zadávame zadávame za sebou a oddeľujeme ich čiarkou. Náš príkaz by mohol vyzerať nasledovne:
SELECT * FROM users ORDER BY user_surname ASC, user_name ASC
Ako vidíte vo výsledku, dáta sú skutočne zoradené tak, ako sme chceli. V systéme phpMyAdmin nám to indikujú aj šípky v hlavičke výsledkovej tabuľky, pri stĺpcoch user_surname a user_name máme šípku smerom nahor (ASC) aj s číslom priority zoradenia (1 – najprv sa zoradilo podľa priezviska, 2 – potom podľa user_name). Klauzula ORDER BY sa používa neustále. Ak surfujete po stránkach, napríklad na eshope a dávate si produkty zoradiť napríklad podľa ceny vzostupne alebo podľa mena, voláte v skutočnosti tieto príkazy v ich systéme:)