Vsichni tady nadavate na like %xyz% a select * from vam nevadi. Chapu, ze autor chtel udelat co nekratsi dotaz, ale pro ty, co je clanek urcen, je to jen potvrzeni, ze nedelaji chybu, kdyz pouziji tento zpusob vyhledani v DB.
Projekce? Projekce by ubrala nějaké ty sloupce, případně přidala nové. Leda že bychom o každém dotazu prohlásili, že provádí minimálně tzv. "identitní projekci".
Když se změní sloupce v tabulce (někdo přidá další sloupec nebo třeba jen v jiném pořadí provede ALTER TABLE ... ADD COLUMN), tak SELECT * najednou začne vracet něco jiného, než vaše aplikace čeká.
No to mi ovsem nevadi, * pouzivam prave kdyz chci vsechno, jinak by to samozrejme byl problem.
Ne ze by to bylo extra caste, ale pouziti se obcas najde - typicky pokud chci vsechny sloupce z tabulky, ktera ma 20 sloupcu, tak je prece nebudu vypisovat.
Samozrejme je treba brat v uvahu, ze muzu napriklad zbytecne prijit o moznost vyrizeni dotazu primo z indexu pokud nepotrebuju vsechny sloupce.
Ano, hvězdička se někdy hodí (třeba do phpMyAdmina), ale v aplikaci, která ta data nějak dále zpracovává, by se neměla vyskytovat, i kdyby to znamenalo těch dvacet sloupců vypsat a to včetně PHP, kde se sloupce odkazují jménem - zbytečně můžete tahat spoustu dat, které nepotřebujete, nebo naopak nemusíte odhalit, že nějaký sloupec chybí.
* má jednu nehezkou vlastnost. Neodrazuje od širokých tabulek. Relativně častý dotaz je, jak vypsat jen některé sloupce z tabulky, přičemž by člověk určil, ty co nechce vidět. Takže, když databáze má široký tabulky, a někde se člověk dočte o tom, že není dobrý používat *, tak rychle zjistí, že mít široké tabulky je docela opruz. Jinak samozřejmě čím dříve se v dotazu odfiltrují nepoužívané sloupce, tím líp. Už jsem viděl, že dotaz z * byl o 30% pomalejší než dotaz s explicitně určenými sloupci.
No to jsou takove rekl bych trochu akademicke uvahy. V tabulce mam hodne sloupcu, pokud tam hodne sloupcu patri - kdyz udelam normalni formu a vyjde mi do tabulky 20 sloupcu (nebo co vlastne znamena hodne?), tak to budu jen proto nejak delit?. Samozrejme ze dotaz na vice sloupcu muze trvat dele, ale pokud opravdu chci vsechny sloupce, tak to je irelevantni. select * ma v produkcnim kodu omezene vyuziti a byva casto pouzit chybne (coz byva tim ze programuje kazdy kdo ma ruce), ale ma ho.
V zásadě máte pravdu - většinou nemá cenu dělit tabulku jenom proto že "má moc sloupců" ale ono je to často příznakem toho že jsou v ní redundance (tj. není v dostatečné normální formě). A pak už se její rozdělení vyplatí.
Hm to je casty problem - skodlive zevseobecnovani nejakeho pozorovani. Taky jsem videl desive pouziti "select * into a, b, c", ale chybne lze pouzit cokoliv, kdyz se to neumi.
Napriklad tato funkce k vyzvednuti radku z tabulky pro dalsi zpracovani v PLSQL je zcela spravna, robustni, elegantni...
function fetch_account(account_id in account.id%type) return account%rowtype is
acc_row account%rowtype;
begin
select * into acc_row
from account
where id = acc_id;
return acc_row;
end fetch_account;
Kdyby toto nekdo prepsal na jednotlive sloupce (i kdyby jich bylo treba jen 5), tak mu urazim pracky :-) Takto funkce dela presne to co chci a bude to delat i kdyz z tabulky sloupce uberu, pridam nebo prejmenuju, cehoz s vyjmenovanim sloupcu nemohu dosahnout.
Proste select * neni spatny, spatni mohou byt pouze programatori, kteri ho neumi pouzivat.
Jenze pokud pouzijete *, tak tusim ze nemate zarucene poradi sloupecku. Takze pokud chcete opravdu 20 sloupecku, tak je vhodne je vypsat. Jinak se pak nemusite divit. Stejne vhodne je vypisovat sloupecky v INSERTU.
Samozrejme zalezi na tom, jak to udelam (viz muj prispevek o kousekl vyse). Proste kazda konstrukce ma nejake vlastnosti, ktere je treba znat a brat je v uvahu. Moudra typu "select * je spatny" a podobna jsou spatna, protoze zjednodusujici.
Máte pravdu - například pokud sloupec zrušíte a pak zase přidáte apod. tak se pořadí změní. Ale záleží na tom co s tím dotazem následně děláte, resp. pokud na pořadí sloupečků záleží či nikoliv. Pokud to bude součástí insertu, například.:
INSERT INTO ... SELECT * FROM ...
tak máte celkem problém. Ale pokud k těm sloupečkům přistupujete přes názvy (například v PHP přes pg_fetch_assoc) tak vám to vadit nemusí.