Autor Zpráva
robbie
Profil
Zdravím, potřeboval bych pomoci s překladem kodu z učebnice, přijde mi, že to trošku odflákli.Nebo kdyby dotaz nekdo prelozil do cestiny, co dela.

Odkaz: shockwave3.rajce.idnes.cz/Kniha_kontrola/#IMG_20170408_1446361.jpg

Kdyby měl prosím někdo znalý čas popsat, 1.co se děje na prvním řádku, to SUM , COUNT

2. group by o.partnum - to bude asi řazení do skupin podle partnum v tabulce o, že

3.ale pak už se v tom uplně ztrácím, co se děje na řádku HAVING

4. proč si najednou označili o1 p1 a proč a na posledním řádku je podmínka

WHERE p1.partnum=o1.partnum

AND p1.partnum=o.partnum / tohle už nikde nikdo neřeší

Myslím si, že učebnice za 800, zvláště pro začátečníka by mohla být popsána podrobněji.

Je to učebnice "Naučte se SQL za 28 dní", pro zajímavost.

Člověk by pak nemusel vyloženě škemrat o radu a zdržovat na forech. Děkuji moc
TomášK
Profil
Z toho, jak se ptáš, to vypadá, že čteš dál, i když dostatečně nerozumíš tomu, co se probralo.

- Pokud z dotazu vynecháš část HAVING, zbývají části, které se určitě dřív probíraly. Pokud jim nerozumíš nebo si v nich nejsi jistý, vrať se do kapitoly, kde se probíraly (1., 2.)
- Pokud neviš, co přesně dělá HAVING, vrať se tam, kde je vysvětlený na nějakém jednodušším příkladu. S konstantou nebo nekorelovaným poddotazem.
- Vysvětlení označení o1 a p1 bych čekal v úvodu korelovaných poddotazů, z textu se zdá, že to není první, který tam ukazují. Než začneš zkoumat tenhle dotaz, měl bys už dokázat vysvětlit, co je korelovaný poddotaz.
Alphard
Profil
2. Ano, "vem všechny záznamy a rozřaď je do skupin podle o.partnum"
1. Pro každou skupinu spočítej počet záznamů a sečti součin quantity*price každého řádku
3. Na výstup vrať jenom skupiny splňující danou podmínku
----------------
4. Tady je použitý tzv. korelovaný poddotaz, tytéž tabulky se připojují znovu, proto musí být odkazovány pod jiným jménem. Tato část je na vás momentálně přiliš složitá myslím. Korelované poddotazy se stejně nepoužívají tak často, nebál bych se to zatím přeskočit.
robbie
Profil
Alphard:
tak jsem si ten kod zkusil v php admin a kod original mi nabídne stejny vysledek jako kod #2, kde dám pryč and p1.partnum = o.partnum
a stejny vysledek jako kod #3, kde sem kod select za having zmenil na

 (select avg(o.quantity * p.price)
 from orders o, part p);
:
takže zde v tomto příkladu nechápu, proč tady tabulky znovu a znovu připojované nazývali jiným jménem nebo propojili pres p1.partnum = o.partnum. Děkuji

kod original:
select o.partnum, sum(o.quantity * p.price), count(p.partnum)
from orders o , part p where o.partnum = p.partnum
group by o.partnum having sum(o.quantity * p.price )>
(select avg(o1.quantity * p1.price)
from orders o1, part p1
where p1.partnum = o1.partnum
and p1.partnum = o.partnum);

kod #2:
select o.partnum, sum(o.quantity * p.price), count(p.partnum) 
from orders o , part p where o.partnum = p.partnum 
group by o.partnum having sum(o.quantity * p.price )>
 (select avg(o1.quantity * p1.price)
 from orders o1, part p1 
where p1.partnum = o1.partnum
 );

kod#3:
select o.partnum, sum(o.quantity * p.price), count(p.partnum) 
from orders o , part p where o.partnum = p.partnum 
group by o.partnum having sum(o.quantity * p.price )>
 (select avg(o.quantity * p.price)
 from orders o, part p
where p.partnum = o.partnum
 );
TomášK
Profil
Kód#2 a kód#3 jsou ekvivalentní. Neodkazuješ se tam na tabulky z vnějšího dotazu, proto je jedno, jestli se jmenují stejně jako v tom vnějším dotazu nebo ne.

V originálním dotaze se průměr (AVG), který se v HAVING používá k filtrování, počítá jen z výrobků, které mají stejný partnum. Kód#2 a kód#3 počítají tento průměr ze všech výrobků. Pro určitá data to může dát stejný výsledek, ale nemusí. Zaráží mě, že se tam porovnává SUM proti AVG, mám podezření, že by tam měla být stejná funkce.
robbie
Profil
Poslední věc: tuhle větu sem fakt nepochopil:

"V originálním dotaze se průměr (AVG), který se v HAVING používá k filtrování, počítá jen z výrobků, které mají stejný partnum. Kód#2 a kód#3 počítají tento průměr ze všech výrobků." A jaká čast kodu tohle ošetřuje? Jak a kde jsi na tohle přišel?Díky

Jenže jsou tam tři tyhle řádky s partnum: o.partnum = p.partnum
where p1.partnum = o1.partnum
and p1.partnum = o.partnum);
TomášK
Profil
Výsledkem dotazu
select avg(o.quantity * p.price)
from orders o, part p
where p.partnum = o.partnum

je číslo. Strukturu neznám, ale vyjadřuje něco jako průměrný zisk za daný typ objednávky. Pokud ten dotaz provedeš samostatně a výsledek (to číslo, které vyjde) dosadíš do kódu#2 nebo kódu#3 místo toho dotazu, dostaneš stejné výsledky.


V originálním dotaze tohle uděľat nemůžeš, pracuje se tam z tabulkou z vnějšího dotazu. Pro každý její řádek (po seskupení) se provede dotaz
select avg(o.quantity * p.price)
from orders o, part p1
where p1.partnum = o1.partnum AND p1.partnum = o.partnum -- o.partnum odkazuje na vnější tabulku, tedy se provádí dotaz pro každý řádek a vloží se sem hodnota jeho partnum

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0