Lekce 2 - MySQL krok za krokem - Vytvoření databáze a tabulky
V minulé lekci, MySQL krok za krokem - Úvod do MySQL a příprava prostředí, jsme si řekli něco o relačních databázích a připravili jsme si prostředí.
V dnešním MySQL tutoriálu si představíme jazyk SQL. Poté si vytvoříme databázi a přidáme do ní první tabulku s daty.
Jazyk SQL
Akronym SQL označuje Structured Query Language, tedy strukturovaný dotazovací jazyk. SQL je jazyk deklarativní. To znamená, že počítači pouze říkáme, co má být výsledkem. Již nás nezajímá, jak tohoto výsledku počítač dosáhne. U imperativních jazyků pak počítači zadáváme krok po kroku instrukce, které má vykonat.
Databázové dotazy jazyka SQL pak vypadají například takto: "Vrať mi 10 uživatelů s nejvyšším hodnocením". Databáze takový dotaz pochopí, rozloží si ho na nějaké své instrukce a zpracuje jej. Nám poté opravdu vrátí požadovaný výsledek, aniž bychom tušili, jak k němu došla. Pokud vám příkaz přišel jako nadsázka, tak tomu tak není, příkazy opravdu takto vypadají, jen jsou psány anglicky.
SQL se původně jmenovalo SEQUEL (Structured English Query Language) a vzniklo v laboratořích společnosti IBM s cílem vytvořit jazyk, kterým by se dalo komunikovat s databází jednoduchou angličtinou. SQL (relační) databáze se poté rozšiřovaly a ujaly. Dnes se prakticky nic jiného nepoužívá a i když má SQL v objektovém programování značné nevýhody, firmám se nechce přecházet na nic jiného (i když existují alternativní řešení). Ale to jsme odbočili.
Práce s databází v phpMyAdmin
Nejprve si ukážeme, jak vytvořit databázi v nástroji phpMyAdmin. Každý projekt (web) má obvykle jednu databázi, která obsahuje další tabulky.
Tento krok za nás v praxi udělá provozovatel webhostingu a my dostaneme k dispozici často právě jednu databázi, která se jmenuje stejně, jako náš účet.
Vytvoření databáze
Otevřeme si grafické rozhraní phpMyAdmin a klikneme nahoře na záložku
Databáze. Na nové kartě vyplníme název databáze, pojmenujeme ji
databaze_pro_web
. Dále nastavíme kódování databáze na
češtinu, z nabídky tedy vybereme hodnotu utf8_czech_ci
a
klikneme na tlačítko Vytvořit:

Databáze a její položky pojmenováváme bez diakritiky. Protože většina serverů s databází používá jako operační systém Linux, který rozlišuje mezi velkými a malými písmeny, používáme pro jejich názvy pouze malá písmena s podtržítkovou (snake case) notací.
Odstranění databáze
Zkusme si nyní databázi odstranit. Klikneme na ikonu domečku nahoře v
levé panelu, poté znovu na záložku Databáze. Následně
zaškrtneme políčko u názvu databáze_pro_web
a klikneme na
možnost Odstranit:

Poté se otevře dialogové okno, v němž potvrdíme, že chceme vybranou databázi smazat:

Všimněme si SQL příkazu pro odstranění databáze, který je v okně uveden:
DROP DATABASE `databaze_pro_web`;
Do češtiny bychom je přeložili jako: "Zahoď databázi
databaze_pro_web
".
V SQL se příkazy píšou velkými písmeny. To proto, že je to lépe odliší od zbytku dotazu nebo od kódu naší aplikace. Názvy tabulek, sloupců a další identifikátory píšeme malými písmeny s podtržítkovou notací. Je dobrým zvykem je vkládat mezi zpětné apostrofy neboli tzv. tupý přízvuk.
Tupý přízvuk
Tupý přízvuk na české klávesnici můžeme napsat pomocí pravého Alt a písmene ý:

Spuštění SQL dotazu
Nyní si databázi opět vytvoříme, tentokrát však pomocí SQL příkazu. V horní liště klikneme na položku SQL. Otevře se nám okno, kam můžeme psát přímo SQL dotazy.
Vytvoření databáze
Do nového okna napíšeme příkaz pro vytvoření databáze:
CREATE DATABASE `databaze_pro_web` CHARACTER SET utf8 COLLATE utf8_czech_ci;
Části CREATE DATABASE
asi rozumíme,
CHARACTER SET
nastavuje znakovou sadu, COLLATE
upřesňuje porovnávání. Znaková sada je soubor znaků, které může
databáze obsahovat, porovnávání se většinou váže ke znakové sadě a
určuje, jak se znaky za sebe řadí, tedy české "Č" je po "C" a tak dále.
Oboje máme v dotazu nastaveno na utf8
, u porovnávání
upřesňujeme, že chceme češtinu. Písmena ci
jsou zkratkou pro
case insensitive, určujeme tím, že nechceme rozlišovat mezi
velkými a malými písmeny.
Poté klikneme na tlačítko Proveď:

Vidíme, že jsme docílili stejného výsledku.
Kdybychom chtěli opět databázi smazat, použijeme již zmíněný příkaz:
DROP DATABASE `databaze_pro_web`;
Už umíme dva SQL příkazy, jeden pro vytvoření databáze a druhý pro její odstranění. Ani jeden ale v naší aplikaci asi používat nebudeme, protože databázi si stačí vytvořit jen jednou a můžeme to udělat takto jednoduše v administračním nástroji. To samé platí pro tvorbu tabulek. Teprve samotná práce s daty v SQL pro nás bude klíčová, brzy se k ní dostaneme.
Pojďme si ukázat, jak do nové databáze přidat novou tabulku.
Vytvoření databázové tabulky
Klikneme na název databáze v levém sloupci a tím ji otevřeme. phpMyAdmin nám zobrazí nové okno pro vytvoření tabulky.
Pojďme si tedy vytvořit tabulku uživatelů, která bude obsahovat sloupce
pro jméno, příjmení, datum narození a počet článků. K tomu má mít
každá tabulka sloupec, jehož hodnota je pro každou položku unikátní.
Sloupců bude tedy dohromady pět. Tabulka pojmenujeme uzivatele
,
vyplníme požadovaný počet sloupců a potvrdíme:

Otevře se nám opravdu hodně polí, ale těch se vůbec nelekejte:

Vlevo nejdříve vyplníme pod sebe názvy našich sloupců, což jsou:
uzivatele_id
,jmeno
,prijmeni
,datum_narozeni
,pocet_clanku
.
Všimněme si prvního názvu, kde máme kromě id
také prefix
tabulky. Není to nutné, ale pokud budeme mít v databázi více tabulek a
každá z nich by měla sloupec nazvaný pouze id
, brzy bychom se
mezi nimi mohli ztratit.
V druhém sloupci zadáváme datové typy jednotlivých
sloupců tabulky. Přednastavený máme typ INT
reprezentující
celá čísla. Datových typů je v SQL opravdu mnoho, většinou si však
vystačíme jen s několika. Na řádku uzivatele_id
ponecháme
INT
, jmeno
a prijmeni
nastavíme na
VARCHAR
, to je krátký text. datum_narozeni
nastavíme na DATE
. Poslední, pocet_clanku
, bude
opět typu INT
.
Další sloupec, Délka/množina, udává maximální počet znaků
záznamu. Využijeme jej pouze u typu VARCHAR
a jméno i
příjmení nastavíme na 60 znaků.
Ve čtvrtém sloupci, Výchozí, nastavíme hodnotu
NULL
, která označuje nezadáno, pro počet
článků. Předpokládáme totiž, že budeme moci uložit uživatele,
který žádný článek ještě nenapsal.
Pokud jsme ve starších verzích MySQL nezadali data pro
všechny sloupce, databáze do daného pole automaticky vložila nějakou
výchozí hodnotu. Od verze MySQL 5.7 je vypsána chybová hláška:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'xxx' doesn't have a default value
a dotaz se neprovede. Pokud tedy vytváříme sloupec, který
nemusí mít vždy zadanou hodnotu, je třeba mu nastavit nějakou
výchozí.
Primární klíč
Další sloupce přeskočíme, vyplníme již pouze sloupec Index u
uzivatele_id
. Nastavíme zde hodnotu PRIMARY
a
zaškrtneme pole vedle, které je nadepsáno A_I. Tímto jsme sloupec
uzivatele_id
nastavili jako primární klíč
tabulky. Klíče, někdy nazývané indexy, nám umožňují
identifikovat položku v tabulce.
Primární klíč by měla mít každá tabulka. Když například budeme
chtít uživatele vymazat, vymažeme ho podle tohoto klíče, tedy podle
unikátní hodnoty uzivatele_id
. Kdybychom ho mazali podle jména,
mohli bychom smazat několik položek, protože třeba Janů Nováků můžeme
mít v databázi více. Podle primárního klíče vymažeme vždy jen toho
jednoho.
Zaškrtnutím pole A_I (jako Auto Increment) nastavujeme, že se
bude hodnota uzivatele_id
automaticky navyšovat a ID nově
uloženého uživatele bude vždy o 1 větší a tedy vždy unikátní.
V horní části okna si všimněme možnosti Přidat pole. Pokud na začátku zadáme méně sloupců, než potřebujeme, můžeme takto nový sloupec do tabulky doplnit.
Takto vyplněnou tabulku nyní uložíme kliknutím na tlačítko Uložit v pravé dolní části:

SQL dotaz pro tvorbu tabulky
Tabulka se nám objeví v levém sloupci, můžeme ji rozkliknout, ale zatím je prázdná:

SQL dotaz pro vytvoření tabulky vypadá takto:
CREATE TABLE `uzivatele` ( `uzivatele_id` INT NOT NULL AUTO_INCREMENT, `jmeno` VARCHAR(60) NOT NULL, `prijmeni` VARCHAR(60) NOT NULL, `datum_narozeni` DATE NOT NULL, `pocet_clanku` INT NULL DEFAULT NULL, PRIMARY KEY (`uzivatele_id`) );
První řádek je jasný, na dalších řádcích se definují jednotlivé
sloupce tabulky a jejich datový typ. NOT NULL
nám určuje
povinný údaj. U typu VARCHAR
je uveden v závorce i počet
znaků. AUTO_INCREMENT
u uzivatele_id
zajistí, že
databáze každému novému uživateli přiřadí o unikátní ID. Jelikož
počet článku nemusí mít vždy zadanou hodnotu, máme jej zde jako
nepovinný údaj s výchozí hodnotou NULL
. Nakonec zde máme
uveden primární klíč tabulky.
SQL dotazy pro práci s tabulkami nalezneme, když rozklikneme záložku Konzole v dolní části:

Odstranění tabulky
Odstranění tabulky je stejné, jako odstranění databáze. V phpMyAdmin ji odstraníme tlačítkem Odstranit u příslušné tabulky nebo zadáním SQL příkazu:
DROP TABLE `uzivatele`;
Zkuste si takto tabulku odstranit a poté znovu vytvořit pomocí SQL dotazu.
V příští lekci, MySQL krok za krokem - Vkládání a mazání dat v tabulce, si tabulku v databázi naplníme nějakými daty