Další příkazy pro mysql
Vydáno: 17.06.07 Kategorie:
Pro zopakování a také kvůli následujícím příkazům pro výběr si vytvoříme 2 tabulky a naplníme je počátečními daty.
CREATE TABLE klub /*vytvoř tabulku klub*/
(
id int auto_increment not null primary key, /*primární klíč, který se bude automat. navyšovat*/
nazev varchar(100) not null, /*řetězec o max. délce 100, nesmí být nulový*/
popis text /*popis klubu*/
);
CREATE TABLE hrac
(
id int auto_increment not null primary key,
jmeno varchar(40) not null,
prijmeni varchar(50) not null,
klub_id int, /*Odkaz na id klubu v tabulce klub*/
cislo int(2) not null, /*číslo hráče max. o délce dvou znaků, nesmí být nulový*/
cena int, /*za kolik klub hráče koupil*/
prodej int, /*kolik za hráče nabízí ostatní kluby*/
plat int(7) /*plat hráče za jeden měsíc*/
);
ALTER TABLE klub
add majitel varchar(100) not null; /*přidej do tabulky klub sloupec majitel, pokud bychom chtěli sloupec odebrat tak použijeme drop*/
INSERT INTO klub (nazev, popis) VALUES ('Sigma Olomouc', 'Sigma ted hraje nic moc'), ('Sparta Praha', 'Jedno z Pražských S'), ('Banik Ostrava', 'Baník a jeho raubíři') /*vlož do tabulky klub >> do sloupcu nazev a popis tyto hodnoty*/;
INSERT INTO hrac VALUES ('', 'Petr', 'Labuda', '2', '12', '200000', '3400000', '23000'), ('', 'Robert', 'Kloučeneček', '1', '21', '450000', '600000', '50000'), ('', 'Ivan', 'Skřivan', '1', '19', '450000', '', '25000'), ('', 'Petr', 'Klouček', '2', '7', '300000', '480000', '23000');
A dále následují příkazy, které nám z daných tabulek data vytáhnou. Od základních sql příkazů pro výběr se liší v tom, že můžeme s těmito daty nadále pracovat za pomocí sql. Například sčítat, násobit, vybírat na základě určité podmínky atd.
/* Základní syntaxe pro výběr
SELECT seznam sloupců
FROM seznam tabulek
[WHERE restrikce]
[GROUP BY výrazy pro seskupení]
[HAVING doplňující restrikce pro skupinu]
*/
SELECT jmeno, prijmeni, nazev, plat /*vyber z databáze jméno,...*/
FROM hrac h /*z tabulky hrac; nastav zkraktu h*/
LEFT JOIN klub k ON (h.klub_id = k.id) /*propoj s tabulkou klub a nastav zkratku k, kde klub_id v tabulce hrac je stejné jako id v tabulce klub. LEFT nám říká že obsah první tabulky vypíše vždy - tedy i pro hráče bez klubu.
PROPOJENí tabulek kde musí být podmínka vždy splněna - FROM hrac, klub, dalsi_tabulky WHERE hrac.klub_id = klub.id*/
ORDER by nazev, prijmeni, jmeno;
/* MATEMATICKÉ FUNKCE - možno použít standartní mat. fce, plus, mínus, dělení, atd.*/
SELECT jmeno, prijmeni, (prodej - cena) AS hodnota /*vyber jméno,..,a od sloupce prodej odečti cena a zobraz jako sloupec hodnota */
FROM hrac /*z tabulky hrac*/
WHERE (prodej - cena) > 1 /*kde prodej mínus cena je větší než 1*/;
/*PRÁCE S ŘETĚZCI v Mysql*/
/*Výběr části řetězce SUBSTRING*/
SELECT jmeno, prijmeni
FROM hrac
WHERE SUBSTRING(prijmeni, 2, 3) = 'lou' /*SUBSTRING vrací část řetězce, vstupujícího jako její první parametr, definovanou pozicí kde výřez začíná a počtem vrácených znaků.
Tedy navrať 3 znaky od druhé pozice ze sloupce prijmeni. */;
/*Výběr části řetězce na základě první nebo poslední pozice > LEFT nebo RIGHT*/
SELECT jmeno, prijmeni
FROM hrac
WHERE RIGHT(prijmeni, 3) = 'ček' /*Vyber ze sloupce prijmeni kde 3 znaky od poslední pozice se rovná ček*/;
/*Sloučení polí CONCAT*/
SELECT CONCAT(jmeno,' ', prijmeni) AS cele_jmeno
FROM hrac;
/*Zjištění délky řetězce LENGTH*/
SELECT jmeno, prijmeni
FROM hrac
WHERE LENGTH(jmeno) > 4 /*Kde počet znaků v sloupci jmeno je větší než 4*/;
/* LOGICKÉ FUNKCE */
/* IF - tři parametry > 1. logický výraz, 2.pokud je splněno, 3.pokud není splněno. TADY dát majzla na poslední čárku u SELECTU neboť posledním sloupcem je komentar!!! */
SELECT jmeno, prijmeni, plat,
IF(plat>24000, 'Tento hráč bere více jak 24000', 'Tento hráč si moc nevydělá') AS komentar
FROM hrac;
/* CASE - obdoba switch v php */
SELECT jmeno, prijmeni, plat,
CASE plat
WHEN "23000" THEN "zkladní" /* pokud je plat 23000 pak má základní platovou_tridu */
WHEN "25000" THEN "vyšší"
ELSE "jiná"
END AS platova_trida /* nezapomenout na END!! - ukonči a zobraz v sloupci jako platova_trida */
FROM hrac;
/* AGREGAČNÍ FUNKCE */
/* COUNT - vrátí počet záznamů */
SELECT COUNT(*) as pocet_klubu
FROM klub;
/* MIN, MAX - vrátí nejmenší nebo největší hodnotu */
SELECT MAX(plat) AS nejvyssi_plat /* vrátí nejvyšší plat hráče */
FROM hrac;
/* SUM - součet datového sloupce, AVG - výpočet průměrné hodnoty datového sloupce */
SELECT SUM(plat) as celkova_vyplata_vklubu /* Sečte všechny hodnoty v poli plat u tabulky hrač, kde hráči spadají pod klub jenž má id 2. Tedy zobrazí kolik klub musí vysolit za měsíc na platy hráčů */
FROM hrac
WHERE klub_id = 2;
/* Můžeme si však nechat vypsat kolik vyplatí všechny kluby za 1 měsíc pro hráče */
SELECT klub.nazev, SUM(hrac.plat) as celkova_vyplata_vklubu /* vyber název klubu, sečti platy hráčů a vypiš je jako celková výplata v klubu */
FROM klub /* z tabulky klub */
LEFT JOIN hrac ON (klub.id = hrac.klub_id) /* připoj ještě tabulku hráč a provázej je pomocí id v tabulce klub a klub_id v tabulce hráč. LEFT JOIN zaručuje že vypíše všechny záznamy z tabulky klub i pokud nesplňuje podmínku */
GROUP BY klub_id /* seskup záznamy podle klub_id */
ORDER BY celkova_vyplata_vklubu DESC /* a setříď výstup podle celkové výplaty v klubu od nejvyšší po nejnižší */;
/* GROUP BY - Seskupování záznamů, HAVING - obdoba WHERE po seskupení */
SELECT klub.id, klub.nazev, COUNT(*) as pocet_hracu
FROM klub
LEFT JOIN hrac ON (klub.id = hrac.klub_id)
GROUP by klub.id /* seskup podle id klubu */
HAVING COUNT(*) > 1; /* kde vrácených záznamů je více než 1. HAVING je obdobné WHERE. WHERE omezuje výběr dat před seskupením a HAVING až výsledný seskupený výběr */
/*
Zejména ještě doporučuji prostudovat:
http://interval.cz/clanky/sql-dotazy-s-agregaci/
http://www.linuxsoft.cz/article.php?id_article=819 - filtrace dat
http://www.linuxsoft.cz/article.php?id_article=837 - klauzele join
http://www.linuxsoft.cz/article.php?id_article=872 - group by
Spojení více taublek kluazulí join >
select hlavicka_faktury.*, polozky_faktury.*, zakaznik.nazev
from hlavicky_faktury inner join polozky_faktury on hlavicka_fatkury.id = polozky_faktury.hlavicka
left join zakaznik on faktura.zakaznik = zakaznik.id;
*/