1 June, 2009

Mysql: poslední autoinkrement při insertu

Filed under: Sql — jersywoo @ 4:13 pm

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();.

19 March, 2009

Informix: pomalost vícenásobného outer joinu

Filed under: Sql — jersywoo @ 9:58 am

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.

15 January, 2009

SQL - poslední dny v měsících

Filed under: Sql — jersywoo @ 11:23 am

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;

13 August, 2008

Mysql - ošetření nulového DATE

Filed under: Sql — jersywoo @ 9:03 am

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;

4 June, 2008

Informix - export struktury databáze

Filed under: Sql — jersywoo @ 2:45 pm

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.

18 April, 2008

Informix: sloučení sloupců

Filed under: Sql — jersywoo @ 9:10 am

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

1 April, 2008

Mysql v php: rychlé odchytání problémů

Filed under: Sql — jersywoo @ 1:35 pm

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.

5 September, 2007

Zálohování tabulky mysql databáze v příkazové řádce

Filed under: Sql — jersywoo @ 3:01 pm

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

13 August, 2007

SAS - PROC SQL - poznámky 2

Filed under: Sql — jersywoo @ 3:11 pm

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í :P 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”.

6 August, 2007

SAS - PROC SQL - poznámky

Filed under: Sql — jersywoo @ 1:29 pm

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ě”.