Giter Club home page Giter Club logo

mysql's Introduction

MySQL

login

Manual

Seskupování a souhrny

Download: 23
SELECT skupina, datum, SUM(pocet) AS celkem FROM prodeje GROUP BY skupina, datum
SELECT DISTINCT datum FROM prodeje GROUP BY datum

SELECT DISTINCT datum FROM prodeje

Výběr sloupců v dotazu se seskupováním

SELECT datum, SUM(pocet) AS celkem FROM prodeje GROUP BY datum, skupina

Agregační funkce

  • Součet – SUM()
  • Průměr – AVG()
  • Minimum – MIN()
  • Maximum – MAX()
  • Počet řádků – COUNT()

Example:
SELECT COUNT(*) AS celkem_radku FROM prodeje

SELECT COUNT(*), COUNT(obec), COUNT(krajske_mesto), COUNT(DISTINCT krajske_mesto) FROM obce

      • všechny řádky
  • obec - všechny řádky, které nejsou NULL

Rozdíl mezi count(*) a count(sloupec)

SELECT count(*), count(id) FROM obce GROUP BY krajske_mesto
Pokud je v sloupci hodnota NULL, COUNT(sloupec) jí nezapočítává, COUNT(*) ano.

Příklady

SELECT DISTINCT os_cislo FROM hodiny

SELECT vyrobky.nazev, SUM(polozky.mnozstvi) FROM polozky INNER JOIN vyrobky ON vyrobky.cislo=polozky.cislo_vyrobku GROUP BY vyrobky.nazev WITH ROLLUP

7.2. 2022

23_seskupovaniASouhrny.pdf

slide 10

image

ZOBRAZENÍ CELKOVÉHO SOUHRNU

Seskupení podle jednoho sloupce:

SELECT vyrobky.nazev, SUM(polozky.mnozstvi)
FROM polozky INNER JOIN vyrobky ON
vyrobky.cislo=polozky.cislo_vyrobku GROUP BY
vyrobky.nazev WITH ROLLUP

Vylepšení o zobrazení slova celkem namísto NULL:

SELECT IFNULL(vyrobky.nazev, 'celkem'),
SUM(polozky.mnozstvi) FROM polozky INNER JOIN
vyrobky ON
vyrobky.cislo=polozky.cislo_vyrobku GROUP BY
vyrobky.nazev WITH ROLLUP

ŘAZENÍ

Při seskupování dle více sloupců se řazení provede zleva doprava:

SELECT skupina, datum FROM prodeje
GROUP BY skupina, datum

Daný sloupec lze upřednostnit pomocí ORDER BY na konci dotazu:

SELECT skupina, datum FROM prodeje
GROUP BY skupina, datum ORDER BY datum

PŘEDBĚŽNÁ FILTRACE

Klauzule WHERE v dotaze se souhrnem znamená, že se filtrace provede ještě dříve, než se začnou řádky seskupovat.

Součet prodaných kusů a omezení výběru na leden 2018:

SELECT skupina, SUM(pocet) AS celkem FROM
prodeje WHERE datum BETWEEN '2018-01-01' AND
'2018-01-31' GROUP BY skupina

Součet řádků s hodnotou NULL:

SELECT COUNT(*) FROM obce WHERE krajske_mesto
IS NULL;

NÁSLEDNÁ FILTRACE

Klauzuli HAVING používáme pro možnost výběru řádků až po seskupení.

Z tabulky prodejů provedeme sumaci po datumech, ale ve výsledku zobrazíme jen dny, kde se prodalo 10 a více ks:

SELECT datum, SUM(pocet) AS celkem
FROM prodeje GROUP BY datum HAVING
SUM(pocet) >=10;

WHERE VS HAVING

Předběžná filtrace (WHERE):

SELECT druh, SUM(pocet) AS celkem
FROM drubez WHERE pocet > 10 GROUP
BY druh;

Následná filtrace (HAVING):

SELECT druh, SUM(POCET) AS celkem
FROM drubez GROUP BY druh HAVING
SUM(pocet) > 10;

KOMBINACE FILTRŮ

Pořadí:

  • 1)Předběžná filtrace (WHERE),
  • 2)seskupení (GROUP BY),
  • 3)následná filtrace (HAVING).

Dotaz sečte prodané kusy pro obě skupiny výrobků, omezí výběr na leden 2018 a ve výsledku zobrazí jen řádky, u kterých je celkový součet 10 a více:

SELECT skupina, SUM(POCET) AS celkem FROM
prodeje WHERE datum BETWEEN '2018-01-01' AND
'2018-01-31' GROUP BY skupina HAVING SUM(pocet)
>= 10;  

VÝPOČET PŘED AGREGACÍ

Chceme znát cenu vyrobených součástek za každý den.

Během jednoho dne se však na lince vyrábí různé typy souč. s rozdílnou cenou.

Nejprve spočítáme cenu, poté sečteme:

SELECT datum, SUM(kusu*cena) AS
celkem FROM vyroba GROUP BY datum;

VÝPOČET PO AGREGACÍ

  • Potřebujeme zjistit průmernou dobu potřebnou k výrobě jedné součástky.
  • Pro jednotlivé dny zjistíme celkový počet vyrobených součástek a celkovou provozní dobu
  • Obě hodnoty nakonec vydělíme a vynásobíme 60 pro obdržení počtu sekund potřebných pro výrobu jedné součástky:
SELECT datum, SUM(cas)/SUM(kusu) * 60 AS
podil FROM vyroba GROUP BY datum;

VZOREC V GROUP BY

Sečtení vyrobených kusů po měsících:

SELECT MONTH(datum) AS mesic, SUM(kusu) AS celkem
FROM vyroba GROUP BY MONTH(datum);  

Sečtení počtu vyrobených součástek podle skupin (skupina = první dva znaky v kódu souč.):

SELECT LEFT(kod, 2) AS skupina, SUM(kusu) AS celkem
FROM vyroba GROUP BY LEFT(kod, 2);

Zjištění počtu obratů do 1000Kč a nad:

 SELECT CASE WHEN obrat<1000 THEN '<1000' ELSE
'>1000' END AS vyse_obratu, COUNT(obrat) AS pocet
FROM obraty GROUP BY CASE WHEN obrat<1000 THEN
'<1000' ELSE '>1000' END; 

SOUHRNY Z VÍCE TABULEK

Výpočet celkových dodaných množství pro jednotlivé výroby:

SELECT vyrobky.nazev, SUM(dodavky.mnozstvi)
AS soucet FROM vyrobky INNER JOIN dodavky ON
dodavky.cislo_vyrobku=vyrobky.cislo GROUP BY
vyrobky.nazev;

Dotaz, zjišťující, kolikrát byly dané výrobky prodány:

SELECT vyrobky.nazev, COUNT(dodavky.mnozstvi)
AS pocet1, COUNT(*) AS pocet2 FROM vyrobky
INNER JOIN dodavky ON
dodavky.cislo_vyrobku=vyrobky.cislo GROUP BY
vyrobky.nazev;

Zjištění data poslední dodávky:

SELECT vyrobky.nazev, MAX(dodavky.datum) AS
posledni FROM vyrobky INNER JOIN dodavky ON
dodavky.cislo_vyrobku = vyrobky.cislo GROUP
BY vyrobky.nazev;

Zobrazení úhrnných tržeb:

SELECT vyrobky.nazev,
SUM(vyrobky.cena*dodavky.mnozstvi) AS trzba
FROM vyrobky INNER JOIN dodavky ON
dodavky.cislo_vyrobku = vyrobky.cislo GROUP
BY vyrobky.nazev;

Úhrnná dodaná množství za rok 2017:

SELECT vyrobky.nazev, SUM(dodavky.mnozstvi) AS
celkem FROM vyrobky INNER JOIN dodavky ON
dodavky.cislo_vyrobku = vyrobky.cislo WHERE
dodavky.datum BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY vyrobky.nazev HAVING
SUM(dodavky.mnozstvi)>200;

Pět výrobků s nejvyššími tržbami:

SELECT vyrobky.nazev, ROUND(SUM(vyrobky.cena *
dodavky.mnozstvi),0) AS trzba FROM vyrobky INNER
JOIN dodavky ON dodavky.cislo_vyrobku =
vyrobky.cislo GROUP BY vyrobky.nazev ORDER BY trzba
DESC LIMIT 5;

Zobraz tržby včetně DPH pro jednotlivé zákazníky:

SELECT zakaznici.jmeno, SUM(vyrobky.cena + vyrobky.cena
* vyrobky.sazba_dph/100 * polozky.mnozstvi) AS trzba
FROM zakaznici
INNER JOIN faktury ON faktury.odberatel = zakaznici.id
INNER JOIN polozky ON polozky.faktura = faktury.cislo
INNER JOIN vyrobky on vyrobky.cislo =
polozky.cislo_vyrobku
GROUP BY zakaznici.jmeno

VNĚJŠÍ SPOJENÍ TABULEK

  • Dotaz, počítající pro všechny učitele celkové úvazky:
  • SELECT ucitele.jmeno, SUM(predmety.hodin) AS celkem FROM ucitele LEFT OUTER JOIN predmety ON ucitele.id = predmety.ucitel GROUP BY ucitele.jmeno;
  • Vylepšete, aby dotazmísto NULL ukazoval u Ladislava 0.
  • Zobrazte pomocí COUNT(), kolik předmětů jaký učitel vyučuje.

SPOJENÍ DOTAZŮ SE SOUHRNEM

  • Představme si tabulku prodejů, obsahující číslo měsíce, jméno prodejce, výši tržby a další údaje.
  • Spočítejme měsíční průměry prodejců zvlášť pro muže a zvlášť pro ženy, kdy tabulka neobsahuje informaci o pohlaví prodejce.
SELECT mesic, AVG(trzba) AS prumer , 'muzi' AS typ
FROM data WHERE zastupce in ('Jaroslav', 'Petr',
'Marek') GROUp BY mesic
UNION
SELECT mesic, AVG(trzba) AS prumer , 'zeny' AS typ
FROM data WHERE zastupce in ('Jitka', 'Pavla',
'Marie') GROUp BY mesic

Procvičení na konec

1. SLIDE
  • 1)Z tabulky obratů zjistěte počet řádků, součet a průměr obratů a nejvyšší a nejmenší obrat.
SELECT COUNT(*) as pocet, SUM(obrat) as soucet, AVG(obrat) as prumer, MAX(obrat), MIN(obrat) FROM obraty
  • 2)Z tabulky faktur zjistěte počet zaplacených faktur (vyplněno datum zaplacení).
SELECT COUNT(faktury.zaplaceno) FROM faktury WHERE faktury.zaplaceno IS NOT NULL
  • 3)Z tabulky obratů vypočtěte součet obratů a počet řádků pro jednotlivá čísla protiúčtů (sloupec „ucet“)
SELECT SUM(obrat), COUNT(obraty.ucet) from obraty GROUP by ucet
  • 4)Z tabulky obratů zjistěte počet jednotlivých protiúčtů.
SELECT COUNT(DISTINCT obraty.ucet) from obraty
  • 5)Z tabulky obratů vypočítejte průměrný obrat pro jednotlivá čísla protiúčtů a celkový průměr.
SELECT obraty.ucet, AVG(obraty.obrat) FROM obraty GROUP BY obraty.ucet WITH ROLLUP
2. SLIDE
  1. Z tabulky položek vypočítejte součty částek pro jednotlivé faktury a čísla výrobků, celkové součty částek pro každou fakturu a součet všech částek v celé tabulce
SELECT IFNULL(polozky.faktura, 'celkem'), polozky.cislo_vyrobku, SUM(polozky.castka) FROM polozky GROUP BY polozky.faktura, polozky.cislo_vyrobku WITH ROLLUP

SELECT IFNULL(polozky.faktura, 'celkem'), SUM(polozky.castka) FROM polozky GROUP BY polozky.faktura WITH ROLLUP
  1. Z tabulky faktur vypočítejte součet částek podle čísla zákazníka. Výpočet bude omezen jen na zaplacené faktury
SELECT faktury.odberatel, SUM(faktury.castka) FROM faktury WHERE faktury.zaplaceno IS NOT null GROUP BY faktury.odberatel
  1. Z tabulky faktur vypočítejte součet částek podle čísla zákazníka. Dotaz zobrazí pouze řádky se součtem nad 40 000Kč
SELECT faktury.odberatel, SUM(faktury.castka) AS soucet FROM faktury 
GROUP BY faktury.odberatel HAVING soucet > 40000 
  1. Z tabulky faktur vypočítejte součet částek podle čísla zákazníka za rok 2018. Dotaz zobrazí pouze řádky se součtem nad 20 000Kč
SELECT faktury.odberatel, SUM(faktury.castka) FROM faktury WHERE year(vystaveno) = 2018 GROUP BY faktury.odberatel HAVING SUM(faktury.castka) > 20000
  1. Z tabulky položek spočítejte pro jednotlivé faktury součet podílů částka/množství
SELECT polozky.faktura, SUM(polozky.castka /polozky.mnozstvi) FROM polozky GROUP BY polozky.faktura

28.02. 2022

1. SLIDE
  1. Z tabulky obraty4 po jednotlivých protiúčtech (sloupec účet) zjistěte podíl součtu poplatků a součet obratů v procentech.
SELECT obraty4.ucet, SUM(obraty4.poplatek) / SUM(obraty4.obrat) * 100 FROM obraty4 GROUP BY ucet
  1. Z tabulky faktur určete počet neproplacených faktur.
SELECT COUNT(*) FROM faktury WHERE faktury.zaplaceno IS NULL
  1. Z tabulky obratů vypočtěte součet obratů pro jednotlivé banky.
SELECT RIGHT(obraty.ucet, 4) as banka, SUM(obraty.obrat) FROM obraty GROUP BY banka
  1. Z tabulky obratů vypočtěte součet obratů po rocích a měsících.
SELECT YEAR(obraty.datum), MONTH(obraty.datum), SUM(obraty.obrat) FROM obraty GROUP BY YEAR(obraty.datum)
  1. Z tabulky obratů vypočtěte součet a počet obratů do 10 000Kč a nad tuto částku.
SELECT CASE WHEN obraty.obrat > 10000 THEN ">10000" ELSE "<10000" END AS LIM, SUM(obraty.obrat) FROM obraty GROUP BY LIM
2. SLIDE
  1. Zobrazte názvy skupin, počet výrobků v každé skupině a průměrnou cenu výrobků ve skupině.
SELECT skupiny.nazev, COUNT(*), AVG(cena) FROM vyrobky INNER JOIN skupiny ON skupiny.cislo = vyrobky.skupina GROUP BY skupiny.nazev
  1. Pro jednotlivá jména zákazníků zobrazte celkové nafakturované částky.
----
  1. Pro jednotlivá jména zákazníků zobrazte datum poslední fakturace.
SELECT zakaznici.jmeno, SUM(faktury.castka),MAX(faktury.zaplaceno) FROM faktury INNER JOIN zakaznici ON zakaznici.id = faktury.odberatel GROUP BY zakaznici.jmeno
  1. Pro jednotlivé názvy výrobků zobrazte počet jejich prodejů, které jsou vyšší, než 200 jednotek.
SELECT vyrobky.nazev, COUNT(*) FROM vyrobky JOIN polozky ON polozky.cislo_vyrobku = vyrobky.cislo WHERE polozky.mnozstvi > 200 GROUP BY vyrobky.nazev
  1. Zobrazte názvy výrobků, pro které je celková fakturovaná částka v tabulce položek vyšší, než 10 000 Kč.
SELECT vyrobky.nazev, SUM(polozky.castka) FROM vyrobky INNER JOIN polozky ON polozky.cislo_vyrobku = vyrobky.cislo GROUP BY vyrobky.nazev HAVING SUM(polozky.castka) > 10000
  1. Zobrazte názvy skupin a rozdíl mezi nejvyšší a nejnižší cenou u výrobků ve skupině.
SELECT skupiny.nazev, MAX(cena) - MIN(cena) FROM vyrobky INNER JOIN skupiny ON skupiny.cislo = vyrobky.skupina GROUP BY skupiny.nazev
3. SLIDE
  1. Zobrazte jména jednotlivých zákazníků, názvy výrobků a uhrnná prodaná množství pro jednotlivé zákazníky a výrobky.
SELECT zakaznici.jmeno, vyrobky.nazev, SUM(polozky.mnozstvi)
  1. Určete celkový počet předpisů, pro které neexistuje příslušná platba.
SELECT COUNT(*) FROM predpisy LEFT JOIN platby ON predpisy.vs = platby.vs WHERE platby.id IS NULL;
  1. Zobrazte jména všech výrobků a jejich úhrnná prodaná množství.
SELECT vyrobky.


  1. Pro jednotlivé zákazníky zobrazte celkové nafakturované částky, zvlášť pro neproplacené a zvlášť pro proplacené faktury.
SELECT zakaznici.jmeno, CASE WHEN faktury.zaplaceno IS NULL THEN 'Nezaplaceno' ELSE 'Zaplaceno' END AS zap_nezap, SUM(faktury.castka) FROM zakaznici INNER JOIN faktury ON faktury.odberatel = zakaznici.id GROUP BY zakaznici.jmeno, zap_nezap

7.03. 2022

Download 25

PODDOTAZY

  • Příkazy SELECT lze vnořovat do sebe a vytvářet tak jejich hierarchii. Vnořené příkazy SELECT označujame jako poddotazy.
  • Příklad: Zobrazte čísla dodaných výrobků, kde je vyplněno datum dodání a dodané množství je vyšší, než 200:
  1. krok: SELECT * FROM dodavky WHERE NOT datum IS NULL
  2. krok: SELECT cislo_vyrobku FROM (SELECT * FROM dodavky WHERE NOT datum IS NULL) AS poddotaz WHERE mnozstvi>200
SELECT cislo_vyrobku FROM (SELECT * FROM dodavky WHERE datum IS NOT NULL) AS poddotaz WHERE mnozstvi < 200  

Vnořený příkaz SELECT se vždy zapisuje do závorky a většinou i označuje pomocí aliasu

Vnoření příkazů SELECT do sebe může být několikanásobné.

Zpracování probíhá „zdola nahoru“ tj. Nejprve se provede příkaz SELECT vnořený nejhlouběji.

Typy poddotazů:

  • Skalární (vrací jedinou hodnotu)
  • Sloupcový (vrací sloupec hodnot)
  • Tabulkový (vrací tabulku hodnot)

SKALÁRNÍ PODDOTAZY

Příklad: napište dotaz, který zobrazí datum, jméno prodejce, tržbu a pro srovnání také průměrnou hodnotu tržby za celou tabulku:

SELECT datum, prodejce, trzba, (SELECT AVG(trzba) FROM trzby) AS prumer FROM trzby

Místo průměru použijte procentuální podíl jednotlivých tržeb na jejich celkovém součtu:

SELECT datum, prodejce, trzba, trzba/(SELECT SUM(trzba) FROM trzby)*100 AS podil FROM trzby 

Pro jednotlivé prodejce:

SELECT prodejce, SUM(trzba), SUM(trzba)/(SELECT SUM(trzba) FROM trzby)*100 AS podil FROM trzby GROUP BY prodejce;

Poddotaz nemusí být v GROUP BY, vyrábíme tak agregační funkci:

SELECT prodejce, SUM(trzba) AS soucet, (SELECT SUM(trzba) FROM trzby) AS celkem FROM trzby GROUP BY prodejce;

SKALÁRNÍ PODDOTAZ V KLAUZULI WEHERE

Zobrazení nadprůměrných tržeb:

SELECT datum, prodejce, trzba FROM trzby WHERE trzba > (SELECT AVG(trzba) FROM trzby);  

Zobrazení tržeb, které dosahují alespoň 10% celkového objemu tržeb:

SELECT datum, prodejce, trzba FROM trzby WHERE trzba >= (SELECT SUM(trzba) FROM trzby)*0.1

MIN A MAX VE SKALÁRNÍM PODDOTAZU

V případě stejných maxim bychom potřebovali vypsat všechna. Takto to nelze:

SELECT * FROM trzby ORDER BY trzba DESC LIMIT 1;

Takto ano:

SELECT * FROM trzby WHERE trzba = (SELECT MAX(trzba) FROM trzby);

SKALÁRNÍ PODDOTAZ V KLAUZULI HAVING

Zobrazení součtů tržeb po dnech tam, kde je tržba větší, než celkový průměr tržeb:

SELECT datum, SUM(trzba) AS soucet FROM trzby GROUP BY datum HAVING SUM(trzba) > (SELECT AVG(trzba) FROM trzby;

Zobrazení průměrných tržeb za únor, pokud jsou vyšší, než je průměr za leden:

SELECT prodejce, AVG(trzba) AS prumer FROM trzby WHERE MONTH(datum) = 2  GROUP BY prodejce HAVING AVG(trzba) > (SELECT AVG(trzba) FROM trzby WHERE MONTH(datum)=1);

DÍLČÍ SOUHRN VZHLEDEM K HODNOTĚ VYBR. SLOUPCE

Zobrazte prodejce, datum, tržbu a pro každého prodejce součet jeho tržeb:

SELECT prodejce, datum, trzba, (SELECT SUM(trzba) FROM trzby AS trzby1 WHERE trzby1.prodejce = trzby.prodejce) AS celkem 
FROM trzby

Totéž s INNER JOIN:

SELECT trzby.prodejce, trzby.datum, trzby.trzba, souhrn_trzeb.soucet
FROM trzby
INNER JOIN (SELECT prodejce, SUM(trzba) AS soucet FROM trzby GROUP BY prodejce) AS souhrn_trzeb ON trzby.prodejce=souhrn_trzeb.prodejce;

PODDOTAZ V OPERÁTORU IN

Z tabulky tržeb zobrazte řádky u kterých se datum nachází v tabulce datumy:

  • Vnitřní spojení způsobí duplicitu:
SELECT trzby.datum, trzby.prodejce, trzby.trzba FROM trzby INNER JOIN datumy ON trzby.datum = datumy.datum;
  • Kromě použití DISTINCT ještě můžeme udělat:
SELECT trzby.datum, trzby.prodejce, trzby.trzba FROM trzby WHERE datum IN (SELECT datum FROM datumy);

Zobrazte úhrnné prodeje pro jednotlivé prodejce a součty omezte na dny, zapsané v tabulce datumů:

SELECT prodejce, SUM(trzba) AS celkem FROM trzby WHERE datum IN (SELECT datum FROM datumy) GROUP BY prodejce;

Totéž s omezením na leden:

SELECT prodejce, SUM(trzba) AS celkem FROM trzby WHERE datum IN (SELECT datum FROM datumy WHERE MONTH(datum) = 1) GROUP BY prodejce;

PODDOTAZ IN JAKO VNĚJŠÍ SPOJENÍ

Z tabulky tržeb zobrazte řádky u kterých se datum nenachází v tabulce datumy:

  • Pomocí LEFT OUTER JOIN:
SELECT trzby.datum, trzby.prodejce, trzby.trzba FROM trzby LEFT OUTER JOIN datumy ON trzby.datum = datumy.datum WHERE datumy.datum IS NULL;
  • Pomocí poddotazu:
SELECT trzby.datum, trzby.prodejce, trzby.trzba FROM trzby WHERE NOT datum IN (SELECT datum FROM datumy);

PODDOTAZ V OPERÁTORU IN

  • Poddotazy jsou efektivní, pokud vnořený SELECT dává výrayně menší počet záznamů oproti v
  • Vnější tabulce.

Seskupování v operátoru IN – zobrazte z tabulky datumů ty, kde je v tabulce tržeb součet jednotlivých tržeb větší, než 10000Kč:

SELECT datum FROM datumy WHERE datum IN(SELECT datum FROM trzby GROUP BY datum HAVING SUM(trzba)>10000);

PODDOTAZ V SEZNAMU ALL/ANY

IN – hodnota ve sloupci se musí rovnat alespoň jedné hodnotě v seznamu

ALL – hodnota ve sloupci musí být větší/menší, než všechny hodnoty v seznamu:

SELECT castka FROM vydani WHERE castka > ALL(SELECT trzba FROM trzby);

ANY(SOME) - hodnota ve sloupci musí být větší/menší, než alespoň jedna hodnota v seznamu:

SELECT castka FROM vydani WHERE castka > ANY(SELECT trzba FROM trzby);

Výběr hodnot, které leží uprostřed intervalu, definovaného nejmenší a největší hodnotou v seznamu:

SELECT * FROM vydani WHERE castka >ANY(SELECT trzba FROM trzby) AND castka <ANY(SELECT trzba FROM trzby);

Zobrazení řádků z tabulky tržeb pro Jitku, u kterých je tržba větší, než alespoň jedna tržba ostatních prodejců:

SELECT datum, prodejce, trzba FROM trzby WHERE prodejce = 'Jitka' AND trzba > ANY(SELECT trzba FROM trzby WHERE prodejce <> 'Jitka');

Zobrazení řádků pro Karla, pro které platí, že tržba je větší, než alespoň jedna průměrná tržba u ostatních prodejců:

SELECT datum, prodejce, trzba FROM trzby WHERE prodejce = 'Karel' AND trzba > ANY(SELECT AVG(trzba) FROM trzby WHERE prodejce <> 'Karel' GROUP BY prodejce);

Pokud by to mělo být větší, než průměrná tržba u všech ostatních prodejců, místo ANY dáme ALL.

TABULKOVÉ PODDOTAZY

Tabulkové poddotazy reprezentují další tabulku. Ta se dá běžným způsobem (výběr dat spojení) dále používat.

Zobrazení naposledy provedené akce každé obce:

SELECT akce2.obec, akce2.cislo, akce2.dokonceno FROM akce2 INNER JOIN (SELECT obec, MAX(dokonceno) AS datum FROM akce2 GROUP BY obec) AS vyber ON akce2.obec=vyber.obec AND akce2.dokonceno=vyber.datum;  

Zobrazení výrobků s nejvyšší cenou každé skupiny. Poddotaz vybere z tabulky výrobků nejvyšší cenu pro každou skupinu a tento výběr se spojí s tabulkou skupin a tabulkou výrobků:

SELECT skupiny.nazev, vyrobky.nazev, vyber.maximum FROM skupiny INNER JOIN vyrobky ON skupiny.cislo = vyrobky.skupina INNER JOIN (SELECT skupina, MAX(cena) AS maximum FROM vyrobky GROUP BY skupina) AS vyber ON vyrobky.skupina = vyber.skupina AND vyrobky.cena = vyber.maximum;

Zobrazení součtů dodávek jednotlivých výrobků, kde dodané množství je NULL:

SELECT vyrobky.nazev, IFNULL(podvyber.pocet, 0) AS pocet FROM vyrobky LEFT OUTER JOIN (SELECT polozky.cislo_vyrobku, COUNT(*) AS pocet FROM polozky WHERE polozky.mnozstvi IS NULL GROUP BY cislo_vyrobku) AS podvyber ON vyrobky.cislo=podvyber.cislo_vyrobku;

Zobrazení dvou řádků z tabulky výrobků s nejvyšší cenou u výrobků ze skladu č. 1 a stejně tak u výrobků ze skladu č. 2:

SELECT * FROM (SELECT * FROM vyrobky WHERE sklad = 1 LIMIT 2) AS sklad1 UNION SELECT * FROM (SELECT * FROM vyrobky WHERE sklad = 2 LIMIT 2) AS sklad2 ORDER BY cena DESC

OPERÁTOR EXISTS

Operátor EXISTS testuje, zdali se v jedné tabulce vyskytují řádky, které hodnotami v některém sloupci odpovídají řádkům v druhé tabulce. Obecná syntaxe:

SELECT <seznam_polí> FROM Tabulka1 WHERE EXISTS (SELECT <seznam_polí> FROM Tabulka 2 WHERE <spojovací_podmínka>).

Zobrazení názvů výrobků, jejichž čísla se vyskytují v tabulce dodávek:

SELECT vyrobky.nazev FROM vyrobky WHERE EXISTS (SELECT * FROM dodavky WHERE dodavky.cislo_vyrobku = vyrobky.cislo);

Zobrazení názvů výrobků, jejichž čísla se vyskytují v tabulce dodávek a současně alespoň jedno jejich prodané množství bylo přes 200ks:

SELECT vyrobky.nazev FROM vyrobky WHERE EXISTS (SELECT * FROM dodavky WHERE dodavky.cislo_vyrobku = vyrobky.cislo AND dodavky.mnozstvi>200);

Operátor EXISTS lze zpravidla nahradit jinými prostředky SQL. Jeho nevýhoda je v nízké efektivitě. Vnitřní příkaz SELECT se musí opakovaně vyhodnocovat pro každý řádek z první tabulky.

MySql operators

mysql's People

Contributors

krbnjsf avatar neostetic avatar

Watchers

 avatar

mysql's Issues

2nd 2nd

SELECT faktury.odberatel, SUM(faktury.castka) FROM faktury WHERE faktury.zaplaceno IS NOT null GROUP BY faktury.odberatel

2nd 4th

SELECT faktury.odberatel, SUM(faktury.castka) FROM faktury WHERE year(vystaveno) = 2018 GROUP BY faktury.odberatel HAVING SUM(faktury.castka) > 20000

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.