Kde se naučit SQL

Re:Kde se naučit SQL
« Odpověď #15 kdy: 21. 10. 2017, 07:09:24 »
degradovat SQL databázi

Často není víc potřeba.
A poměrně často je to naprosto ideální řešení.
Příkladem budiž webový e-shop, matlat data do MySQL, řešit složitou strukturu...

Databáze jsou nástroje, když máš dobrý nástroj, jde práce rychle od ruky.
Člověk si zvykne používat kladivo, můžeš se s ním naučit i sádrovat, ale špachtlí to jde prostě líp.

Mimochodem, já bych začal právě tou NoSQL databází, protože se potupně dostane k nástrojům, které se snaží z SQL databáze udělat NoSQL databázi.

Každá technologie má svůj use-case. Pokud se databáze používá pouze jako storage a ještě netransakční, pak NoSQL databáze mohou excelovat. V okamžiku, kdy se začne mluvit o konzistenci dat, zabezpečení dat, reportingu, pak naopak excelují SQL databáze, kde se tato funkcionalita implementuje 30 let. Na netu je dneska hromada blogů, kdy se firmy vrátily k SQL z důvodu většího výkonu, ztrát dat v NoSQL, případně pracnosti reportingu nad NoSQL a slabému výkonu. Samozřejmě, že jsou data, kde nepotřebuji silnou konzistenci (a těch je celá řada), jsou data nad kterými téměř nikdy nebudu dělat reporty. Pak je na místě uvažovat o NoSQL. V jiném případě určitě SQL, případně pro specifickou zátěž NewSQL.


Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Kde se naučit SQL
« Odpověď #16 kdy: 21. 10. 2017, 09:05:27 »
... No a pak člověk zjistí, že ty NoSQL se dotazují také přes SQL jazyk, že dospělé databáze se naučili s nimi transparentně na pozadí komunikovat a že kontroly konzistence, integrity a další chujoviny jsou najednou také možné.

Abys mohl jít na pohovor a říct, že umíš SQL za mě potřebuješ znát obecnou teorii o práci s daty, normalizacích a něco málo z teorie čísel a umět designovat databázové tabulky. Poté musíš znát konkrétní implementaci SQL v konkrétní db, jsou v tom neskutečné rozdíly, co funguje na jedné, nefunguje na druhé a např. obyčejným where column is null dokážeš položit teradatu.

Dokumentace SQL od jednotlivých db nejsou špatnou volbou ke studiu. Osobně mě docela zaujala knížka SQL Cookbook od Anthony Molinaro nebo Database Design od Hernandeze. Řada vysokých škol má materiály a skripta ohledně databází dostupné přes google, zkus si pohledat.

Na trhu jsou dobře hodnocení lidé kolem MSSQL a Oracle, u něho jeho PL/SQL je už programovací jazyk a s tím se neztratíš, stojí na tom půlka korporátů.

Těch cest jsou ale tisíce a dokud neřekneš kam chceš směrovat a co chceš třeba za dva roky dokázat, těžko se ti dá poradit něco konkrétního.

Re:Kde se naučit SQL
« Odpověď #17 kdy: 21. 10. 2017, 10:15:29 »
Těch cest jsou ale tisíce a dokud neřekneš kam chceš směrovat a co chceš třeba za dva roky dokázat, těžko se ti dá poradit něco konkrétního.

Proto můj dotaz na začátku byl na to, jestli má tazatel nějaký projekt, na kterém to chce zkoušet. Podle toho by se dala tipnout technologie nebo use case, který bude tazateli nejblíž.

qwertz

Re:Kde se naučit SQL
« Odpověď #18 kdy: 21. 10. 2017, 10:16:00 »
A kterému SQL byste se chtěl věnovat? Jazyk mají všechny podobný, ale implementace a tím pádem i nutné návyky programátorů se pak liší.

Aniž bych chtěl slovíčkařit, SQL je defacto jen jedno. V čem se to liší jsou různé procedurální nástavby jako PLSQL (Oracle), T-SQL (MS), atd... Ale to si každý na svém písečku dodělává to co mu ve vanila SQL chybí.

SQL se dá uchopit jednoduše i složitě. V tom jednoduchém případě to lze opravdu jednoduše. Pro psaní dotazů je zásadní pochopení outer JOINů a agregace - ostatní je primitivní. Pro design je pak důležité pochopení tzv normálních forem - zásadní jsou první tři a ty pokud možno v návrhu respektovat. V podstatě existují dvě chyby, které je dobré nedělat při návrhu - emulace dědičnosti a entity attribute value tabulky. Můžete použít moje materiály, které používám na školení SQL: http://www.pgsql.cz/skoleni/skoleni_sql.zip

Pro základy SQL je jedno, kterou SQL databázi použijete - důležité je nedělat z toho vědu. Jakmile člověk SQL umí, tak jej umí na SQLite, MySQL, Oracle, Postgresu, ... Samozřejmě, že tam jsou určité rozdíly, ale základ je stejný - to je jedna z výhod SQL (je to něco jako pravidla silničního provozu - téměř všude jsou stejná. Pak se samozřejmě musím přizpůsobit jestli jedu s osobákem nebo dodávkou nebo kamiónem). Použijte takovou databázi, do které se umíte přihlásit, a do které umíte poslat dotaz, a podívat se na výsledek.

Přesně tak. Důležité je, k čemu to chce člověk používat. Základ je naučit se SELECT + spojování a aggregační funkce. Pak umíte SQL. Podle toho jestli chcete dělat DBA, BI, ETL atd... se pak dá pak pokračovat dál. Není to žádné raketové inženýrství. Učí se to poměrně dobře  ;D

A kterému SQL byste se chtěl věnovat? Jazyk mají všechny podobný, ale implementace a tím pádem i nutné návyky programátorů se pak liší.
[/quote]

Re:Kde se naučit SQL
« Odpověď #19 kdy: 21. 10. 2017, 11:02:23 »
A kterému SQL byste se chtěl věnovat? Jazyk mají všechny podobný, ale implementace a tím pádem i nutné návyky programátorů se pak liší.

Aniž bych chtěl slovíčkařit, SQL je defacto jen jedno. V čem se to liší jsou různé procedurální nástavby jako PLSQL (Oracle), T-SQL (MS), atd... Ale to si každý na svém písečku dodělává to co mu ve vanila SQL chybí.
[/quote]

S tím bych nesouhlasil. Pro optimální využití vlastností té či oné databáze musíte znát její specifika i to, na co je optimalizovaná. Např. MSSQL má rádo subselecty, PostgreSQL je neumí optimalizovat. Zase umí lépe optimalizovat joiny. Složité dotazy v každé databázi budete psát jinak, byť je jazyk prakticky stejný.

Pokud ale databázi používáte jen na dotazy key-value (KVS), pak je lepší zvolit mysql nebo nějaké nosql. Ale to je skill, který ovládá kdekdo, na to se asi tazatel neptá.


jozko

Re:Kde se naučit SQL
« Odpověď #20 kdy: 21. 10. 2017, 11:43:20 »

Na Stanforde je celkom fajn kurz a k tomu zadarmo (https://lagunita.stanford.edu/courses/Home/Databases/Engineering/about)
Prejdes od teorii k praxi, od relacnej algebry k CTE v SQL.


sova

Re:Kde se naučit SQL
« Odpověď #21 kdy: 21. 10. 2017, 11:51:43 »
Dávam do pozornosti online kurz na Stanfordovej univerzite (je zdarma), robil som to pred niekoľkými rokmi, keď to spúšťali prvý krát. Väčšia časť kurzu bola o relačných databázach a SQL, pri konci aj niečo o ukladaní dát do XML a JSON. Keď som to robil, bol to kurz s testami v určitom termíne a kurz mal rovnaký rozsah, ako to, čo učia na Stanforde (a zrejme na ďalších vysokých školách - autorka kurzu je spoluautorka jednej z niekoľkých učebníc, ktoré  na amerických univerzitách odporúčajú k úvodným kurzom).
Teraz bude rozsah asi podobný, ale nejako to rozdrobili na menšie časti, z ktorých si môžete vybrať podľa vlastnej úvahy a robiť to keď sa vám to hodí - a možno aj aktualizovali - ani sa mi nechce veriť, že keď som to robil ja, písal sa rok 2011. Stačí sa prihlásiť a môžete študovať: https://lagunita.stanford.edu/courses/DB/2014/SelfPaced/about

Zatiaľ čo som to písal, jozko ma predbehol, je to rovnaký kurz, ako odporúča on.

Re:Kde se naučit SQL
« Odpověď #22 kdy: 21. 10. 2017, 12:01:40 »
A kterému SQL byste se chtěl věnovat? Jazyk mají všechny podobný, ale implementace a tím pádem i nutné návyky programátorů se pak liší.

Aniž bych chtěl slovíčkařit, SQL je defacto jen jedno. V čem se to liší jsou různé procedurální nástavby jako PLSQL (Oracle), T-SQL (MS), atd... Ale to si každý na svém písečku dodělává to co mu ve vanila SQL chybí.

S tím bych nesouhlasil. Pro optimální využití vlastností té či oné databáze musíte znát její specifika i to, na co je optimalizovaná. Např. MSSQL má rádo subselecty, PostgreSQL je neumí optimalizovat. Zase umí lépe optimalizovat joiny. Složité dotazy v každé databázi budete psát jinak, byť je jazyk prakticky stejný.
[/quote]

To už jsou pak další kroky, které se řeší na konkrétním projektu, konkrétních datech, konkrétním železe (běžně 80% dotazů, které člověk napíše běhaji dobře na všem). Pro začátek je dobrý si dát rozumný cíle a zbytečně se nesnažit obsáhnout celý svět. Nehledě na to, že v 90% všech problémů v reálných podnicich se pořeší indexama nebo větší ramkou. Když člověk příliš brzo zabředne do detailů, tak se nikam nedostane  :-\ .

Re:Kde se naučit SQL
« Odpověď #23 kdy: 21. 10. 2017, 12:14:33 »
S tím bych nesouhlasil. Pro optimální využití vlastností té či oné databáze musíte znát její specifika i to, na co je optimalizovaná. Např. MSSQL má rádo subselecty, PostgreSQL je neumí optimalizovat. Zase umí lépe optimalizovat joiny. Složité dotazy v každé databázi budete psát jinak, byť je jazyk prakticky stejný.
To už jsou pak klasický cargo kulty. Optimalizace poddotazů, joinů je ve všech slušnějších databázích dneska z 80% stejná. Liší se kalkulace statistik a tudíž v některých případech některé dotazy jsou na jedné db rychlejší a na jiné pomalejší. Ve 20 procentech jsou rozdíly, ale to jsou dneska spíš obskurní věci, které se dají moderním SQL udělat jinak a rychleji. Je pravda, že MSSQL má agresivnější optimalizace korelovaných poddotazů obsahujících agregace - ale zase, kvůli tomu, má pomalejší planner. Hitne to malé procento dotazů. U Postgresu 90% lidí neví o parametrech JOIN_COLLAPSE_LIMIT a FROM_COLLAPSE_LIMIT, kterými se tato optimalizace řídí - a pak jsou překvapeni.

Re:Kde se naučit SQL
« Odpověď #24 kdy: 21. 10. 2017, 12:46:09 »
To už jsou pak klasický cargo kulty. Optimalizace poddotazů, joinů je ve všech slušnějších databázích dneska z 80% stejná. Liší se kalkulace statistik a tudíž v některých případech některé dotazy jsou na jedné db rychlejší a na jiné pomalejší. Ve 20 procentech jsou rozdíly, ale to jsou dneska spíš obskurní věci, které se dají moderním SQL udělat jinak a rychleji. Je pravda, že MSSQL má agresivnější optimalizace korelovaných poddotazů obsahujících agregace - ale zase, kvůli tomu, má pomalejší planner. Hitne to malé procento dotazů. U Postgresu 90% lidí neví o parametrech JOIN_COLLAPSE_LIMIT a FROM_COLLAPSE_LIMIT, kterými se tato optimalizace řídí - a pak jsou překvapeni.

Moje zkušenost je, že když začnou lidé na mysql, tak tam i zastydnou. Mysql má nízkou režii spojení, málo účinný, ale rychlý planner. Na ostatních databázích, když trochu nepřemýšlí, tak se bez joinů, subselectů neobejdou. Na Mysql je to naopak, joiny je svým výkonem odradí je prakticky používat. Nemluvě o "specifikách" jednotlivých storage enginů, nad kterými mně zůstává rozum stát, ale laik=>začátečník vůbec nepochopí, o čem je řeč.

aaa

Re:Kde se naučit SQL
« Odpověď #25 kdy: 21. 10. 2017, 13:24:30 »
Na Mysql je to naopak, joiny je svým výkonem odradí je prakticky používat. Nemluvě o "specifikách" jednotlivých storage enginů, nad kterými mně zůstává rozum stát, ale laik=>začátečník vůbec nepochopí, o čem je řeč.
MySQL mal svojho casu JOINy dost rychle aspon pri porovnani s korelovanymi poddotazmi. Prepisom subselectov na JOINy som v minulosti (MySQL 5.5) zrychlil generovanie zlozitejsich reportov z jednotiek hodin na sekundy.

Na Oracli sa joiny a ekvivalentne korelovane subselecty vykonavali presne tak isto.

Narychlo vymysleny priklad selectu a subselectu, kde bol rozdiel v MySQL a nie Oracle. Uloha: mame ludi (people) a orientovany graf kamaratov (friends). Najdi vsetkych kamaratov cloveka s urcenym ID:
Kód: [Vybrat]
SELECT p.name FROM people p WHERE id IN (SELECT f.target FROM friends f WHERE f.source=:source_id)
Kód: [Vybrat]
SELECT p.name FROM people p JOIN friends f ON p.id = f.target WHERE f.source = :source_id

Kit

Re:Kde se naučit SQL
« Odpověď #26 kdy: 21. 10. 2017, 13:42:02 »
MySQL mal svojho casu JOINy dost rychle aspon pri porovnani s korelovanymi poddotazmi. Prepisom subselectov na JOINy som v minulosti (MySQL 5.5) zrychlil generovanie zlozitejsich reportov z jednotiek hodin na sekundy.

V MySQL jsem kdysi začínal se subselecty, protože jsem si myslel, že budou rychlejší. Nejsou. Když jsem totéž napsal s JOINem, tak jsem byl příjemně překvapen a od té doby se toho držím. Chce to jen trochu upravit myšlení a spolehnout se na to, že čím méně vychytávek do SQL napíši, tím má planner více prostoru pro optimalizaci.

gll

Re:Kde se naučit SQL
« Odpověď #27 kdy: 21. 10. 2017, 13:45:46 »
To už jsou pak klasický cargo kulty. Optimalizace poddotazů, joinů je ve všech slušnějších databázích dneska z 80% stejná. Liší se kalkulace statistik a tudíž v některých případech některé dotazy jsou na jedné db rychlejší a na jiné pomalejší. Ve 20 procentech jsou rozdíly, ale to jsou dneska spíš obskurní věci, které se dají moderním SQL udělat jinak a rychleji. Je pravda, že MSSQL má agresivnější optimalizace korelovaných poddotazů obsahujících agregace - ale zase, kvůli tomu, má pomalejší planner. Hitne to malé procento dotazů. U Postgresu 90% lidí neví o parametrech JOIN_COLLAPSE_LIMIT a FROM_COLLAPSE_LIMIT, kterými se tato optimalizace řídí - a pak jsou překvapeni.

Moje zkušenost je, že když začnou lidé na mysql, tak tam i zastydnou. Mysql má nízkou režii spojení, málo účinný, ale rychlý planner. Na ostatních databázích, když trochu nepřemýšlí, tak se bez joinů, subselectů neobejdou. Na Mysql je to naopak, joiny je svým výkonem odradí je prakticky používat. Nemluvě o "specifikách" jednotlivých storage enginů, nad kterými mně zůstává rozum stát, ale laik=>začátečník vůbec nepochopí, o čem je řeč.

To není vůbec pravda. Dejte sem příklad toho pomalého Joinu a řeknu vám, co děláte špatně.

Re:Kde se naučit SQL
« Odpověď #28 kdy: 21. 10. 2017, 13:55:08 »
To není vůbec pravda. Dejte sem příklad toho pomalého Joinu a řeknu vám, co děláte špatně.

Je to možné. Já už MySQL na ničem větším dávno neviděl, takže příklad ani nemám. Zastavil jsem se na neřešitelnosti optimalizace u dotazů, kde bylo asi šest a více joinů, o dotazech, kde je třeba 20 joinů mi přišlo, že si MySQL může nechat jen zdát. A pravdou je, že mysql v takových případech opravdu nikde nepotkávám. Většinou potkám MSSQL, Oracle. Výjimečně (bohužel jen výjimečně) PostgreSQL.

Re:Kde se naučit SQL
« Odpověď #29 kdy: 21. 10. 2017, 14:23:43 »
To není vůbec pravda. Dejte sem příklad toho pomalého Joinu a řeknu vám, co děláte špatně.

Je to možné. Já už MySQL na ničem větším dávno neviděl, takže příklad ani nemám. Zastavil jsem se na neřešitelnosti optimalizace u dotazů, kde bylo asi šest a více joinů, o dotazech, kde je třeba 20 joinů mi přišlo, že si MySQL může nechat jen zdát. A pravdou je, že mysql v takových případech opravdu nikde nepotkávám. Většinou potkám MSSQL, Oracle. Výjimečně (bohužel jen výjimečně) PostgreSQL.
Hlavně MySQL má, a to minimálně do verze 5.6 (v 8čce už je to úplně jinak) pouze nested loop - tudíž výkon složitějších, na objem větších dotazů je nesrovnatelně horší než u ostatních databází, které mají a umí používat hash join, merge join. Problém není v optimalizaci, ale vůbec v chybějící implementaci. Ve verzi 8.0 už v mnoha ohledech MySQL vychází z Pg (resp. Pg je použité jako etalon) - což samozřejmě může být šok pro stávající uživatele.