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 |
#2 · Zasláno: 8. 4. 2017, 23:20:57
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 |
#3 · Zasláno: 9. 4. 2017, 04:47:37
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 |
#4 · Zasláno: 9. 4. 2017, 13:58:32
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 |
#5 · Zasláno: 9. 4. 2017, 14:20:47
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 |
#6 · Zasláno: 9. 4. 2017, 18:58:06
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 |
#7 · Zasláno: 9. 4. 2017, 20:05:00
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 |
||
Časová prodleva: 6 let
|
0