Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
200/627
Obsah:
SQL je standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích. V relační databázi jsou data data uložena v tabulkách, které jsou navzájem v nějakém vztahu -- relaci.
Přístup k databázi je realizován softwarem označovaným jako Systém řízení báze dat. Jednotlivé systémy řízení báze dat se liší. V současné době se ve výuce používáme PostgreSQL. Tato stránka o MySQL je historickým pozůstatkem.
$ aptitude install  mysql-server mysql-client phpmyadmin
Bezprostředně po instalaci je vhodné spustit skript, který se snaží omezit bezpečnostní rizika:
$ mysql_secure_installation
K manipulaci s MySQL a pro spouštění SQL příkazu lze použít MySQL-konzola. Tu spustím příkazem:
$ mysql --user=franta --password=tojetajny mojedabaze 
Abychom nemuseli znovu a znovu zadávat jméno a heslo můžeme si ho "uložit" do
souboru ~/.my.cnf. 
# ~/.my.cnf
##############################
[client]
user=franta
password=tojetajny`--> stáhnout
Souboru je nutné nastavit přístupová práva:
$ chmod 600 ~/.my.cnf
Jedna malé vylepšení: Colour MySQL console
Vytvořil jsem pro vás testovací dadabázi. Předpokládám, že máte
vytvořenou nějakou databázi. Já jsem ji nazval lididb. Pro rychlý a pohodlný
import můžete vložit do příkazové řádky:
$ wget -O - http://hroch.spseol.cz/~nozka/site/sql/lididb.sql | mysql lididb

-- tohle používat jen vyjímečně
SELECT * FROM lidi;
SELECT jmeno, data FROM lidi;
SELECT jmeno, rok_narozeni
FROM lidi 
WHERE rok_narozeni <1980 
ORDER BY rok_narozeni DESC  /* DESC říká, že se bude řadit sestupně*/;
/* ASC by bylo vzestupně */
-- V dotazu lze rok narození přepočítat na věk
SELECT jmeno, Year(CURDATE())-rok_narozeni AS 'věk'
FROM lidi  
WHERE rok_narozeni >1980  ORDER BY rok_narozeni ASC;`--> stáhnout
-- Vypíše všechny kuchaře
SELECT lidi.jmeno, nazev_zamestnani
FROM lidi, zamestnani 
WHERE lidi.id_zamestnani = zamestnani.id_zamestnani 
         AND 
      nazev_zamestnani = 'kuchař';
-- Seřadí lidi podle jejich zaměstnání
SELECT lidi.jmeno, nazev_zamestnani AS zamestnani
FROM lidi, zamestnani 
WHERE lidi.id_zamestnani = zamestnani.id_zamestnani 
ORDER BY zamestnani;      
/* pomocí AS lze přejmenovat sloupec */
-- Všichni kuchaři narozní po a v roce 1990
SELECT lidi.jmeno, lidi.rok_narozeni AS 'rok narození'
FROM lidi JOIN zamestnani ON lidi.id_zamestnani = zamestnani.id_zamestnani
WHERE nazev_zamestnani = 'kuchař' 
         AND 
      lidi.rok_narozeni >=1990;
-- můžeme použít zkratky
SELECT L.jmeno, L.rok_narozeni AS 'rok narození'
FROM lidi L, zamestnani Z  
WHERE L.id_zamestnani = Z.id_zamestnani
        AND 
      Z.nazev_zamestnani = 'kuchař'     
        AND 
      L.rok_narozeni <=1990;
/* ************************ */
-- vypíše zaměstnání a lidi, kteří je vykonávají
SELECT nazev_zamestnani AS zamestnani, jmeno 
FROM lidi JOIN zamestnani ON lidi.id_zamestnani = zamestnani.id_zamestnani 
ORDER BY zamestnani;
-- ... vypíše i lidi bez zaměstnání
SELECT nazev_zamestnani AS zamestnani, jmeno 
FROM lidi LEFT JOIN zamestnani ON  lidi.id_zamestnani = zamestnani.id_zamestnani 
ORDER BY zamestnani;
-- ... vypíše i zaměstnání, která nemají přiřazeno žádného člověka
SELECT nazev_zamestnani AS zamestnani, jmeno 
FROM lidi RIGHT JOIN zamestnani ON  lidi.id_zamestnani = zamestnani.id_zamestnani 
ORDER BY zamestnani;
/* ************************ */
-- osoby a jejich koníčky
SELECT lidi.jmeno, konicky.nazev_konicku 
FROM konicky_lidi 
    JOIN konicky ON konicky_lidi.id_konicku = konicky.id_konicku 
    JOIN lidi ON konicky_lidi.id_osoby = lidi.id_osoby
-- všichni, co milují omalovánky
SELECT lidi.jmeno, konicky.nazev_konicku 
FROM konicky_lidi 
    JOIN konicky ON konicky_lidi.id_konicku = konicky.id_konicku 
    JOIN lidi ON konicky_lidi.id_osoby = lidi.id_osoby
WHERE nazev_konicku='omalovánky'`--> stáhnout
INSERT INTO lidi 
SET jmeno='Ivan', rok_narozeni=1972, id_zamestnani=15 ;
INSERT INTO lidi (jmeno ,rok_narozeni, id_zamestnani ) 
          VALUES ('Franta', '1980', 3);
INSERT INTO zamestnani VALUES (0,'fotograf');
INSERT INTO lidi VALUES ('0' ,'Šimon', '1976','4', 'dobrej borec' ) ; `--> stáhnout
-- můžu upravit jen jeden řádek
UPDATE zamestnani SET nazev_zamestnani = 'řidič'
WHERE nazev_zamestnani = 'řidIč';
-- nebo víc řádků najednou
UPDATE lidi SET data = 'nic o něm nevím' 
WHERE data IS NULL;`--> stáhnout
DELETE FROM lidi WHERE data IS NULL;
DELETE FROM zamestnani WHERE nazev_zamestnani='učitel'
`--> stáhnout
Python řeší přístup k MySQL pomocí modulu MySQLdb.
# aptitude install pyton-mysqldb
import MySQLdb`--> stáhnout
K databázi se nejprve připojíme:
db = MySQLdb.connect(host='localhost',
                     user='franta',
                     passwd='tojetajny',
                     db='moje_databaze')`--> stáhnout
Vytvoříme objekt kurzor:
cursor = db.cursor()`--> stáhnout
Spustíme dotaz: Pokud SQL příkaz mění data, je nutné použít k metodě
execute() ještě metodu commit().
cursor.execute('INSERT INTO obce VALUES(0,'Benátky');')
db.commit()  # nebo nastavím db.autocommit(True)`--> stáhnout
Návratová hodnota metody .execute() je počet řádků, které SQL dotaz vrátil.
cursor.execute('SELECT * FROM jmena;')`--> stáhnout
Data si můžeme vybrat postupně pomocí metody .fetchone():
radek = cursor.fetchone()`--> stáhnout
Každé další zavolání metody .fetchone() vydá další řádek výsledku SQL dotazu.
Po vydání posledního řádku vrací metoda .fetchone() už jen None. Seznam vše
řádků vrátí metoda .fetchall() a zadaný počet řádků metoda
.fetchmany(pocet).
Objekt cursor je iteratovatelný proto lze použí něco jako:
for radek in cursor:
    print radek`--> stáhnout
Nakonec se od databáze odpojíme:
db.close()`--> stáhnout
#!/usr/bin/python
# -*- coding: utf8 -*-
import MySQLdb
db = MySQLdb.connect(host='localhost',
                     user='franta',
                     passwd='tojetajny',
                     db='obybatele')
query="""
SELECT jmeno,vek
FROM lidi
WHERE vek > 50 
"""
cursor = db.cursor()
cursor.execute(query)
data = cursor.fetchall()
db.close()
for radek in data:
    print "jméno:",radek[0],"věk:",radek[1]`--> stáhnout