MySQL
CRUD operace
- CREATE (INSERT) - vkládání dat
- READ (SELECT) - čtení dat
- UPDATE - aktualizace dat
- DELETE - mazání dat
-- INSERT - vložení záznamu
INSERT INTO uzivatele (jmeno, email) VALUES ('Jan', 'jan@email.cz');
-- SELECT - výběr dat
SELECT * FROM uzivatele WHERE id = 1;
-- UPDATE - aktualizace
UPDATE uzivatele SET jmeno = 'Petr' WHERE id = 1;
-- DELETE - smazání
DELETE FROM uzivatele WHERE id = 1;
Základní SQL funkce
- Agregační: COUNT(), SUM(), AVG(), MAX(), MIN()
- Textové: CONCAT(), UPPER(), LOWER(), SUBSTRING()
- Datum a čas: NOW(), CURDATE(), DATE_FORMAT()
- Podmínky: IF(), CASE WHEN THEN ELSE END
-- Počet uživatelů
SELECT COUNT(*) FROM uzivatele;
-- Průměrný věk
SELECT AVG(vek) FROM uzivatele;
-- Spojení jména a příjmení
SELECT CONCAT(jmeno, ' ', prijmeni) AS cele_jmeno FROM uzivatele;
JOIN operace
- INNER JOIN - pouze odpovídající záznamy z obou tabulek
- LEFT JOIN - všechny záznamy z levé tabulky + odpovídající z pravé
- RIGHT JOIN - všechny záznamy z pravé tabulky + odpovídající z levé
- FULL OUTER JOIN - všechny záznamy z obou tabulek (MySQL nepodporuje přímo)
-- INNER JOIN - uživatelé s objednávkami
SELECT u.jmeno, o.datum
FROM uzivatele u
INNER JOIN objednavky o ON u.id = o.uzivatel_id;
-- LEFT JOIN - všichni uživatelé (i bez objednávek)
SELECT u.jmeno, o.datum
FROM uzivatele u
LEFT JOIN objednavky o ON u.id = o.uzivatel_id;
Databázové vazby (relace)
- 1:1 (jeden k jednomu) - jeden záznam v tabulce A odpovídá jednomu záznamu v tabulce B
- 1:N (jeden k mnoha) - jeden záznam v tabulce A odpovídá více záznamům v tabulce B
- M:N (mnoha k mnoha) - realizuje se přes spojovací tabulku
Příklady vazeb:
• 1:1 - Uživatel → Profil (každý uživatel má jeden profil)
• 1:N - Kategorie → Produkty (jedna kategorie má více produktů)
• M:N - Studenti ←→ Kurzy (studenti mohou mít více kurzů)
Databázové indexy
- Urychlují vyhledávání v tabulkách
- Primární klíč (PRIMARY KEY) je automaticky indexován
- UNIQUE index - zajišťuje jedinečnost hodnot
- INDEX - běžný index pro urychlení vyhledávání
- FULLTEXT index - pro fulltextové vyhledávání
-- Vytvoření indexu
CREATE INDEX idx_email ON uzivatele (email);
-- Vytvoření unikátního indexu
CREATE UNIQUE INDEX idx_unique_email ON uzivatele (email);
-- Složený index
CREATE INDEX idx_jmeno_prijmeni ON uzivatele (jmeno, prijmeni);
Kolekce a proudy v Javě
Generické vs. obecné kolekce
Typ |
Příklad |
Výhody |
Nevýhody |
Obecné kolekce |
List list = new ArrayList(); |
Kompatibilita se starším kódem |
Chybějící typová kontrola, nutnost přetypování |
Generické kolekce |
List<String> list = new ArrayList<>(); |
Typová bezpečnost, čitelnost kódu |
Méně flexibilní při práci s různými typy |
// Obecná kolekce - problém s typovou kontrolou
List list = new ArrayList();
list.add("text");
list.add(123); // Kompilátor nehlásí chybu
String text = (String) list.get(1); // Runtime error!
// Generická kolekce - typová bezpečnost
List list = new ArrayList<>();
list.add("text");
// list.add(123); // Kompilační chyba
String text = list.get(0); // Žádné přetypování
Hashmapy
- Ukládá data jako dvojice klíč-hodnota
- Klíče jsou unikátní, hodnoty mohou být duplicitní
- Rychlý přístup k hodnotám pomocí klíče (O(1) v ideálním případě)
- Implementace rozhraní Map
// Vytvoření a použití HashMap
Map mapa = new HashMap<>();
mapa.put("Jan", 25);
mapa.put("Petr", 30);
// Čtení hodnoty
int vek = mapa.get("Jan"); // 25
// Kontrola existence klíče
if (mapa.containsKey("Jan")) {
System.out.println("Jan je v mapě");
}
// Iterace přes mapu
for (Map.Entry entry : mapa.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Základní principy Stream API
- Stream - sekvence elementů podporující operace
- Operace mohou být mezilehlé (intermediate) nebo koncové (terminal)
- Líné vyhodnocování - operace se provedou až při volání koncové operace
- Funkcionální přístup - použití lambda výrazů
// Základní operace Stream API
List jmena = Arrays.asList("Jan", "Petr", "Anna", "Eva");
// Filtrování a transformace
List vysledek = jmena.stream()
.filter(jmeno -> jmeno.length() > 3) // pouze jména delší než 3 znaky
.map(String::toUpperCase) // převod na velká písmena
.sorted() // seřazení
.collect(Collectors.toList()); // sebrání do seznamu
// Agregační operace
long pocet = jmena.stream().count();
Optional nejdelsi = jmena.stream()
.max(Comparator.comparing(String::length));
// Seskupování
Map> podleDelky = jmena.stream()
.collect(Collectors.groupingBy(String::length));
Hlavní rozdíly mezi kolekcemi
Rozhraní |
Implementace |
Charakteristika |
Použití |
List |
ArrayList, LinkedList |
Uspořádaná, povoluje duplicity |
Když potřebujete zachovat pořadí |
Set |
HashSet, TreeSet |
Neuspořádaná, žádné duplicity |
Když potřebujete jedinečné hodnoty |
Map |
HashMap, TreeMap |
Klíč-hodnota, klíče jedinečné |
Když potřebujete asociativní pole |
Queue |
LinkedList, PriorityQueue |
FIFO nebo prioritní fronta |
Když potřebujete frontu |
Tip: Stream API je výkonné, ale pro jednoduché operace mohou být tradiční cykly čitelnější a efektivnější.