Dobrým zvykem je, aby každý záznam v databázi měl vlastní idetifikaci. Dělám to tak (a asi i většina datařů), že do každé tabulky přiřadím sloupeček “id(int)” s hodnutou “auto_increment”. Při každém insertu do tabulky se záznamu přiřadí unikátní číselné id. Pro vazební tabulky mezi dvěma datovýma tabulkama potom stačí vložit akorát id záznamů. Aktuální id insertu se dá získat pomocí příkazu :
MySQL_Insert_id();.
Mysql: poslední autoinkrement při insertu
Informix: pomalost vícenásobného outer joinu
Měl jsem tu 3 tabule, které jsem potřeboval outer joinovat na hlavní tabuli. Udělal jsem vícenásobný outer join a ani po dvou dnech jsem nedostal výsledek. Tak jsem rozsekal velký dotaz na 3 poddotazy a proběhlo to všechno během minuty.
Poučení: informix nezvládá multi outer joiny a je potřeba je rozsekat na mezitabule s jednoduchýma outer joinama.
SQL - poslední dny v měsících
Trošku teorie: mám objednávky od zákazníků a poseldní den v měsíci nepracuji
Takže všechny objednávky učiněné poslední den v měsíci přesunu na jiný den než poslední den v měsíci. jak ale v záplavě datumů v yberu poslední den v měsíci?
Troška praxe:Ve sloupci datového typu date má datum formát “DD.MM.RRRR”. SQLko umí z toho preparovat jednotlivé části datumu. Vytvořím si tempovou tabulku, kam nacpu datumy, které jsou poslední dny v měsících a tu potom zpětně propojím s původní tabulkou datumů. Zde uvádím select (informix), kterým se dá nacpat temp tabulka posledníma datumama:
select year(datum) rok,month(datum) mes, max(datum) datum from smlouvy group by 1,2
into temp t_posledni_datumy with no log;
Mysql - ošetření nulového DATE
Když je sloupeček typu DATE tak při výpisu občas nevypadá pěkně. Má divný tvar a při nulové hodnotě samé nuly. Následující úprava spočívá v tom, že udělá z 2008-08-13 pěkný datum 13.8.2008 a při samých nulách nevypíše nic.
SELECT
CASE splneno
WHEN 0000-00-00 THEN ‘’
ELSE DATE_FORMAT(splneno,’%d.%m.%Y’)
END AS datum_expedice
FROM sledovani;
Informix - export struktury databáze
Aneb jak cvičená opička kreslí ER diagramy z Informixu.
Pomocí Arctelu(nebo jiný terminál) se připojíme na databázový stroj na příkazovou řádku. Do příkazového řádku napíšeme: ” dbschema -d nazev_databaze >nazev_souboru.sql “. Do toho souboru nám to uloží sql pro vytvoření nové kopie databáze. Pokud si nepamatujete některé nastavení, tak si je vypíšete pomocí “set|pg“. Otevřete si Power designer, naimportujete přes File>Reverse Engineer>Database>Using script files. A je to.
Informix: sloučení sloupců
Potřeboval jsem do sloupečku s rodnými čísly doplnit identifikační číslo obchodníka tam kde rodné číslo chybí. Dělal jsem to pomocí update s where sloupeček je null. Ale existuje příkaz NVL(kontrolovaný sloupec,dosazovaný sloupec). Systém se jukne na kontrolovaný sloupec a když zjistí, že je prázdný, tak doplní hodnotu z dosazovaného sloupce.
Zajímavý zápich je o tom u Jan Baštýř: nvl = isnull = iffnull
Mysql v php: rychlé odchytání problémů
Z webových databázových systémů mám nejraději “klasické” mysql. A psát testy na funkčnost výsledků dotazů je pracné. Jsem prostě líný. Ale když něco nefunguje, je potřeba rychle rychle vyhledat v čem je problém. Na to mám princip tří řádků. Ukážu to na příkladu:
mysql_query(”UPDATE tabulka SET sloupecek=’hodnota’”); //dotaz, kde je chyba
echo “UPDATE tabulka SET sloupecek=’hodnota’”; //vypíšu si dotaz na web
echo mysql_error(); //vypíšu případné chyby
echo mysql_affected_rows(); //vypíšu počet ovlivněných řádků
První řádek pod dotazem je vypsání co vůbec na DB(databázi) zkouším za dotaz. Druhý řádek je vypsání nějaké chyby pokud dotaz neproběhne a bude shozen kvůli chybě. A třetí řádek je vypsání počtu ovlivněných řádků, když se nevypíše žádná chyba. Je možné, že dotaz je správně, ale jednoduše prostě nic neudělá (nic nevyhovuje podmínkám) a tehdy se vypíše nula.
Zálohování tabulky mysql databáze v příkazové řádce
Občas je z nějakého důvodu potřeba vytáhnout tabulku z databáze ze stroje u Franty do textového souboru a někde jinde ji do stroje u Lojzy nacpat. Typický příklad jsou nechutně velké tabulky. Databázové stroje většinou (alespoň v mém okolí) jsou linuxové stanice a tak se píšou příkazy v příkazové řádce
1. krok - databáze do texťáku
mysqldump -t nazev_databaze nazev_tabulky>nazev_vysledneho_souboru.sql
mysqldump -t nazev_databaze nazev_tabulky>home/můj_adresar/nazev_vysledneho_souboru.sql (varianta s adresářem)
- “mínus té” znamená jenom data, lze vynechat pokud je potřeba i struktura
- pokud cpeme (z novější na starší) data mezis troji s různými verzema mysql, lze na místo parametr mínus té nacpat verzi mysql, kam se to naleje:
–compatible=mysql40
2. krok - texťák do databáze
mysql nazev_databaze < nazev_souboru.sql
SAS - PROC SQL - poznámky 2
Prázdné(tam kde nic není) hodnoty v CHARech se hledají pomocí “WHERE SLOUPECEK IS NULL” a opakem je “WHERE SLOUPECEK IS NOT NULL” . A na prázdnou hodnotu se dá ptát =. (rovná se tečka)
Prázdné(tam kde nic není) hodnoty v INTEGERech se hledají pomocí “WHERE SLOUPECEK IS MISSING” a opakem je “WHER SLOUPECEK IS NOT MISSING”. A na prázdnou hodnotu se dá ptát =”" (rovná se prázdné uvozovky)
Při hledání pomocí LIKE se jako náhražka kusu textu používá %(procento), například “%ware% najde “software”, ale i “warehouse”. Procento zastupuje neznámý počet znaků. Známý počet znaků lze nahradit _(podtržítkem), které nahrazuje jenom jeden znak, například “____ware” najde jenom “software”. Tedy, čtyři podtržítka = čtyři znaky.
DOUBLE zdvojuje řádky. To znamená, že pod každým řádkem výpisu udělá prázdný řádek (a tak furt dokola). Příklad:
PROC SQL DOUBLE;
SELECT * FROM ZBOZI;
QUIT;
K výpisu bez prokládání prázdnými řádky se dostaneme pomocí :
PROC SQL;
RESET NODOUBLE;
QUIT;
Ve výstupu se můžou i zobrazovat i číslo řádku pomocí
ROC SQL NUMBER;
Dva sloupečky se dají spojit pomocí operátorů(?) “SELECT mesto || ‘, ‘|| ulice AS adresa” nebo pomocí příkazu CATX: “SELECT CATX(’, ‘,mesto,ulice) AS adresa”.
SAS - PROC SQL - poznámky
Jsou jenom dva datové typy NUM a CHAR. NUM má defaultně délku 8 bytů. Do CHAR se vejde maximálně 32K znaků (že by 32 000?) jinak defaultní délka je 8 znaků. NUMerická hodnota ve stavu NULL je prezentována tečkou (vnitřně má být reprezetntována jako mínus nekonečno)
- Vnitřně systém počítá dny od 01/01/1960 a první den je “0″
- Zajímavé klíčové slovo CALCULATED, ukázka kódu:
PROC SQL;
SELECT
NAZEV, TYP, CENA * 0.80 AS CENA_SLEVA FORMAT=DOLAR9.2,
CENA_SLEVA - CALCULATED SLEVA_PRIDEJ AS CENA_PRODELAME FORMAT=DOLLAR7.2
FROM ZBOZI ORDER BY 3;
QUIT;
- Klíčové slovo SCAN, které jsem vůbec nepochopil. Klíčové slovo LEFT(SLOUPECEK) nebo RIGHT(SLOUPECEK) zarovnává výstupní text doprava nebo doleva
- Jak hledat v textu (typicky část názvu zboží):
PROC SQL;
SELECT NAZEV FROM ZBOZI WHERE INDEX(UPCASE(NAZEV),’TELEFON’)>0;
QUIT;
je potřeba dávat pozor na velikost písmen, příklad bude pozitivní při “mobilní telefon”,”telefon do kuchyně”.