Databßze

Zßklady

V dneÜnφm dφle si ukß₧eme, jak se p°ipojit k databßzovΘmu serveru, jak vytvß°et databßze, tabulky a jak data do tabulek nejen vklßdßt, ale takΘ zφskßvat.

P°ipojenφ k MySQL serveru

Jak jsme si ji₧ °ekli v minulΘm dφle, vyu₧ijeme k p°ipojenφ k MySQL serveru mysql.exe klienta. Existujφ takΘ jinΘ klientskΘ programy na sprßvu databßzovΘho serveru, mezi kterΘ pat°φ zejmΘna phpMyAdmin, MySQL Manager atd.

Nynφ si spustφme p°φkazov² °ßdek a p°ejdeme do bin adresß°e MySQL serveru. K p°ipojenφ k databßzi vyu₧ijeme ·Φet root s prßzdn²m heslem (pozd∞ji si ukß₧eme, jak vytvß°et dalÜφ u₧ivatele a m∞nit jejich hesla). Pro p°ipojenφ zadejte nßsledujφcφ ·daje:

c:\mysql\bin>mysql -u root -p <ENTER>
Enter password: <ENTER>

Po ·sp∞ÜnΘm p°ipojenφ by se nßm m∞la zobrazit uvφtacφ obrazovka podobnß tΘto:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13 to server version: 3.23.56-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

UkonΦenφ naÜφ seance provedeme jednoduch²m p°φkazem:

mysql> quit <ENTER>
Bye

Vytvß°enφ databßzφ

Po p°ipojenφ k MySQL serveru m∙₧eme takΘ vylistovat vÜechny dostupnΘ databßze:

mysql> SHOW DATABASES; <ENTER>
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

Poznßmka: p°φkazy, kterΘ si budeme uvßd∞t m∙₧eme psßt takΘ mal²mi pφsmeny.

Pro vytvo°enφ novΘ databßze pou₧ijeme p°φkaz, kter² mß nßsledujφcφ strukturu:

CREATE DATABASE <nßzev databßze>;

Za nßzev databßze dosadφme jmΘno, kterΘ bude mφt nov∞ vytvo°enß databßze. JednotlivΘ p°φkazy, kterΘ budeme vklßdat musφ b²t ukonΦeny st°ednφkem. MySQL toti₧ umo₧≥uje zadßvat jednotlivΘ SQL p°φkazy pro p°ehlednost na vφce °ßdk∙.

Nynφ si vytvo°φme databßzi "chip", se kterou budeme pracovat:

mysql> CREATE DATABASE chip; <ENTER>
Query OK, 1 row affected (0.12 sec)

V²sledkem bude zprßva, kdy nßm MySQL potvrdφ zadan² SQL p°φkaz, zobrazφ poΦet °ßdk∙ ovlivn∞n²ch tφmto p°φkazem a dobu zpracovßnφ tohoto p°φkazu.

V p°φpad∞, ₧e s touto databßzφ budeme chtφt pracovat, musφme ji vybrat:

mysql> USE chip; <ENTER>
Database changed

Vytvß°enφ tabulek

Pro vytvß°enφ tabulek slou₧φ nßsedujφcφ SQL p°φkaz:

CREATE TABLE <nßzev tabulky>(
<1. polo₧ka>   <typ>,
<2. polo₧ka>   <typ>,
......
<n. polo₧ka>   <typ>,
)

JednotlivΘ polo₧ky musφ mφt urΦeny sv∙j datov² typ (jako v ostatnφch programovacφch jazycφch). Mezi hlavnφ datovΘ typy pat°φ:

Typ Popis
TINYINT ╚φslo v rozmezφ -128 a₧ 128.
SMALLINT ╚φslo v rozmezφ -32768 a₧ 32767.
MEDIUMINT ╚φslo v rozmezφ -8388608 a₧ 8388607.
INT ╚φslo v rozmezφ -2147483648 a₧ 2147483647.
INT ╚φslo v rozmezφ -2147483648 a₧ 2147483647.
BIGINT ╚φslo v rozmezφ -9223372036854775808 a₧ 9223372036854775807.
FLOAT ╚φslo v plovoucφ °ßdovΘ Φßrce.
NUMBER(a,b) DesetinnΘ Φφslo s a Φφslicemi p°ed desetinnou Φßrkou a b desetinn²mi mφsty.
DATE Datum ve formßtu 'YYYY-MM-DD' (rok, m∞sφc,den).
DATETIME Datum a Φas ve formßtu 'YYYY-MM-DD HH:MM:SS'.
TIME ╚as ve formßtu 'HH:MM:SS'.
CHAR(n) Textov² °et∞zec o velikosti n (maximßlnφ poΦet znak∙ m∙₧e b²t 255).
VARCHAR(n) Textov² °et∞zec o velikosti n (maximßlnφ poΦet znak∙ m∙₧e b²t 255).
TINYTEXT Textov² °et∞zec o maximßlnφm poΦtu znak∙ 255.
TEXT, BLOB Textov² °et∞zec o maximßlnφm poΦtu znak∙ 65535.
MEDIUMTEXT, MEDIUMBLOB Textov² °et∞zec o maximßlnφm poΦtu znak∙ 16777215.
LONGTEXT, LONGBLOB Textov² °et∞zec o maximßlnφm poΦtu znak∙ 4294967295.
ENUM V²Φtov² typ - hodnoty, ze kter²ch si vybφrßme. Maximßln∞ m∙₧eme dosadit 65535 r∙zn²ch hodnot.
SET TextovΘ hodnoty o velikosti 0 nebo vφce. Maximßln∞ m∙₧eme dosadit 64 r∙zn²ch hodnot.

Kdy₧ jsme si nynφ ukßzali datovΘ typy, tak se m∙₧eme pustit do tvorby ukßzkovΘ tabulky. Tabulka se bude jmenovat "autori" a bude obsahovat jmΘna autor∙ knih. JednotlivΘ polo₧ky budou:

Jak jsme si ji₧ v minulΘm dφle °ekli o primßrnφch klφΦφch, m∙₧eme jako primßrnφ klφΦ zvolit id autora. Polo₧ka, kterß je nastavena jako primßrnφ klφΦ nesmφ mφt prßzdnou hodnotu - p°i°adφme jφ tedy vlastnost "NOT NULL". Vlastnost "AUTO_INCREMENT" zajistφ to, ₧e u ka₧dΘho novΘho vlo₧enΘho zßznamu se id zv∞tÜφ o jedniΦku. Nynφ ji₧ struktura tabulky (<ENTER> oznaΦuje stisknutφ klßvesy Enter :-):

mysql> CREATE TABLE autori ( <ENTER>
    -> id INT NOT NULL AUTO_INCREMENT, <ENTER>
    -> jmeno VARCHAR(30), <ENTER>
    -> prijmeni VARCHAR(30), <ENTER>
    -> PRIMARY KEY (id) <ENTER>
    -> ); <ENTER>
Query OK, 0 rows affected (0.14 sec)

Seznam tabulek v databßzi m∙₧eme zobrazit zadßnφm:

mysql> show tables; <ENTER>
+----------------+
| Tables_in_chip |
+----------------+
| autori         |
+----------------+
1 row in set (0.02 sec)

Vklßdßnφ dat do tabulek

Nynφ kdy₧ mßme vytvo°enu tabulku "autori", m∙₧eme do nφ vklßdat data. SQL p°φkaz, kter² zajiÜ¥uje vlo₧enφ dat do tabulky mß nßsledujφcφ syntaxy:

INSERT INTO <nßzev tabulky> VALUES ('<1. polo₧ka>', '<2. polo₧ka>', .., '<n. polo₧ka>')

NßÜ SQL p°φkaz bude vypadat nap°φklad takto (prßzdnß hodnota id nßm zajistφ vlo₧enφ automatickΘho Φφsla - +1):

mysql> INSERT INTO autori VALUES ('', 'Petr', 'Dole₧al'); <ENTER>
Query OK, 1 row affected (0.17 sec)

V²b∞r dat z tabulky

K Φemu by nßm bylo vklßdßnφ dat do databßze, kdy₧ bychom je zp∞tn∞ neum∞li zase zφskat. K v²b∞ru dat z tabulek slou₧φ nßsledujφcφ SQL p°φkaz (uveden² p°φklad pat°φ mezi zßkladnφ, SQL p°φkaz podporuje mnohem vφce voleb):

SELECT <1. polo₧ka>, .., <n. polo₧ka> FROM <nßzev tabulky> WHERE <podmφnka>

Pro vybrßnφ vÜech sloupc∙ (polo₧ek) m∙₧eme takΘ dosadit zßstupn² znak '*'. Pokud bychom cht∞li vybrat vÜechny zßznamy v tabulce, m∙₧eme vyu₧φt nßsledujφcφ SQL p°φkaz:

mysql> SELECT * FROM autori; <ENTER>
+----+-------+----------+
| id | jmeno | prijmeni |
+----+-------+----------+
|  1 | Petr  | Dole₧al  |
+----+-------+----------+
1 row in set (0.02 sec)

Pro vypsßnφ pouze sloupce id a prijmeni pou₧ijeme SQL dotaz:

mysql> SELECT id, prijmeni FROM autori; <ENTER>
+----+----------+
| id | prijmeni |
+----+----------+
|  1 | Dole₧al  |
+----+----------+
1 row in set (0.00 sec)

Pro praktickΘ vysv∞tlenφ podmφnek SQL dotazu SELECT si vlo₧φme do tabulky dalÜφ zßznamy:

mysql> INSERT INTO autori VALUES ('', 'Josef', 'BeneÜ');
Query OK, 1 row affected (0.03 sec)

mysql> INSERT INTO autori VALUES ('', 'Zden∞k', 'Berger');
Query OK, 1 row affected (0.01 sec)

Pro podmφn∞n² v²b∞r zßznam∙ z tabulky m∙₧eme vyu₧φt klauzuli WHERE a b∞₧nΘ porovnßvacφ operßtory. Nßsledujφcφ SQL dotaz vybere z tabulky "autori" autora, jen₧ mß id = 1.

mysql> SELECT * FROM autori WHERE id = 1; <ENTER>
+----+-------+----------+
| id | jmeno | prijmeni |
+----+-------+----------+
|  1 | Petr  | Dole₧al  |
+----+-------+----------+
1 row in set (0.02 sec)

Nebo takΘ SQL dotaz, jen₧ vybere vÜechny zßznamy s identifikaΦnφm Φφslem v∞tÜφm ne₧ 1.

mysql> SELECT * FROM autori WHERE id > 1; <ENTER>
+----+--------+----------+
| id | jmeno  | prijmeni |
+----+--------+----------+
|  2 | Josef  | BeneÜ    |
|  3 | Zden∞k | Berger   |
+----+--------+----------+
2 rows in set (0.04 sec)

V p°φpad∞, ₧e budeme chtφt vyhledat vÜechny zßznamy, kterΘ obsahujφ urΦit² text, m∙₧eme vyu₧φt operßtor LIKE. Operßtor LIKE m∙₧e b²t takΘ dopln∞n znakem "%", kter² umo₧≥uje nahradit urΦitou Φßst hledanΘho textu. Operßtor LIKE se nehodφ na porovnßvßnφ hesel! Na p°φklad∞ si ukß₧eme SQL dotaz, kter² vybere vÜechny zßznamy, je₧ p°φjmenφ zaΦφnajφ na "Be":

mysql> SELECT * FROM autori WHERE prijmeni LIKE 'Be%'; <ENTER>
+----+--------+----------+
| id | jmeno  | prijmeni |
+----+--------+----------+
|  2 | Josef  | BeneÜ    |
|  3 | Zden∞k | Berger   |
+----+--------+----------+
2 rows in set (0.02 sec)

Na dalÜφm p°φklad∞ si ukß₧eme SQL dotaz, jen₧ bude obsahovat n∞kolik podmφnek. Tyto podmφnky uzavφrßme do zßvorek a spojujeme slovem AND:

mysql> SELECT * FROM autori WHERE (prijmeni LIKE 'BE%') AND (id < 3); <ENTER>
+----+-------+----------+
| id | jmeno | prijmeni |
+----+-------+----------+
|  2 | Josef | BeneÜ    |
+----+-------+----------+
1 row in set (0.01 sec)

ZφskanΘ zßznamy m∙₧eme takΘ se°adit pomocφ klauzule ORDER BY. V p°φpad∞, ₧e chceme se°adit data v opaΦnΘm po°adφ, tak dosadφme jeÜt∞ modifikßtor DESC.

mysql> SELECT * FROM autori ORDER BY id; <ENTER>
+----+--------+----------+
| id | jmeno  | prijmeni |
+----+--------+----------+
|  1 | Petr   | Dole₧al  |
|  2 | Josef  | BeneÜ    |
|  3 | Zden∞k | Berger   |
+----+--------+----------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM autori ORDER BY id DESC; <ENTER>
+----+--------+----------+
| id | jmeno  | prijmeni |
+----+--------+----------+
|  3 | Zden∞k | Berger   |
|  2 | Josef  | BeneÜ    |
|  1 | Petr   | Dole₧al  |
+----+--------+----------+
3 rows in set (0.00 sec)

┌prava zßznam∙

Zßznamy takΘ m∙₧eme upravovat pomocφ SQL p°φkazu UPDATE, kter² mß nßsledujφcφ syntaxy:

UPDATE <nßzev tabulky> SET <1. polo₧ka> = <hodnota>, <n. polo₧ka> = <hodnota> WHERE <podmφnka>

Na p°φklad∞ si ukß₧eme SQL p°φkaz, kter² provede ·pravu jmΘna osoby s id = 3:

mysql> UPDATE autori SET jmeno = 'Josef' WHERE id = 3; <ENTER>
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> UPDATE autori SET jmeno = 'Zden∞k' WHERE id > 2; <ENTER>
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Mazßnφ zßznam∙

Pro mazßnφ zßznam∙ slou₧φ SQL p°φkaz DELETE:

DELETE FROM <nßzev tabulky> WHERE <podmφnka>

SQL p°φkaz, kter² sma₧e zßznam s id = 3.

mysql> DELETE FROM autori WHERE id = 3; <ENTER>
Query OK, 1 row affected (0.00 sec)

Vestav∞nΘ funkce

Stejn∞ jako v PHP, tak takΘ v MySQL nalezneme integrovanΘ funkce. Mezi ty nejznßm∞jÜφ pat°φ:

Funkce Popis
AVG(sloupec) Vrßtφ pr∙m∞r Φφsel ze zvolenΘho sloupce.
Count(sloupec) Vrßtφ poΦet nenulov²ch °ßdk∙.
Sum(sloupec) Vrßtφ souΦet hodnot sloupce.
Min(sloupec) Vrßtφ nejmenÜφ hodnotu sloupce.
Max(sloupec) Vrßtφ nejv∞tÜφ hodnotu sloupce.
Distinct(sloupec) Vybere ze sloupce jedineΦnΘ hodnoty.

Pro tento dφl to bude vÜe. V p°φÜtφm dφle si povφme o spoluprßcφ PHP a MySQL a vytvo°φme si prvnφ aplikaci.

Petr Rympler