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.
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
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
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)
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)
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)
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
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)
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.