Megosztás a következőn keresztül:


A HAVING és a WHERE záradékok használata ugyanabban a lekérdezésben (Visual Database Tools)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Egyes esetekben érdemes lehet kizárni az egyes sorokat a csoportokból (WHERE záradék használatával), mielőtt feltételt alkalmazna a csoportok egészére (HAVING záradék használatával).

A HAVING záradék olyan, mint egy WHERE záradék, de csak a csoportok egészére vonatkozik (azaz a csoportokat képviselő eredményhalmaz soraira), míg a WHERE záradék az egyes sorokra vonatkozik. A lekérdezések WHERE záradékot és HAVING záradékot is tartalmazhatnak. Ebben az esetben:

  • A WHERE záradékot először a Diagram ablaktáblán lévő táblák vagy táblaértékű objektumok egyes soraira alkalmazza a rendszer. Csak a WHERE záradék feltételeinek megfelelő sorok vannak csoportosítva.

  • A HAVING záradék ezután az eredményhalmaz soraira lesz alkalmazva. A lekérdezés kimenetében csak azok a csoportok jelennek meg, amelyek megfelelnek a HAVING feltételeknek. A HAVING záradékot csak olyan oszlopokra alkalmazhatja, amelyek a GROUP BY záradékban vagy az összesítő függvényben is megjelennek.

Adjon meg WHERE és HAVING záradékot két összekapcsolt táblán

Jegyzet

A cikkben használt adatbázis az pubs adatbázis, amely Northwind és pubs mintaadatbázisból érhető el a Microsoft SQL Server GitHubon.

Tegyük fel például, hogy a titles és a publishers táblákhoz csatlakozva létrehoz egy lekérdezést, amely megjeleníti a kiadók átlagos könyvárát. Csak bizonyos kiadók átlagos árát szeretné látni – talán csak Kalifornia állam kiadóit. És még akkor is csak akkor szeretné látni az átlagárat, ha több mint 10,00 usd.

Az első feltételt egy WHERE záradékkal hozhatja létre, amely az átlagárak kiszámítása előtt elvet minden olyan közzétevőt, amely nem Kaliforniában található. A második feltételhez HAVING záradék szükséges, mert a feltétel az adatok csoportosításának és összegzésének eredményein alapul. Az eredményként kapott SQL-utasítás a következőképpen nézhet ki:

SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;

Az SQL Server Management Studio Visual Database Tools eszközében HAVING és WHERE záradékokat is létrehozhat a Feltételek panelen. Alapértelmezés szerint, ha keresési feltételt ad meg egy oszlophoz, a feltétel a HAVING záradék részévé válik. A feltételt azonban módosíthatja WHERE záradékként.

Létrehozhat egy WHERE záradékot és HAVING záradékot, amely ugyanazt az oszlopot foglalja magában. Ehhez szükséges kétszer hozzáadni az oszlopot a Feltételek panelhez, majd az egyik esetet a HAVING záradék részeként, a másik esetet pedig a WHERE záradék részeként megadni.

WHERE feltétel megadása összesítő lekérdezésben

  1. Adja meg a lekérdezés csoportjait. Részletekért lásd a Csoportsorok a lekérdezési eredményekben (Visual Database Tools).

  2. Ha még nem szerepel a Feltétel panelen, adja hozzá azt az oszlopot, amelyre a WHERE feltételt szeretné alapozni.

  3. Törölje a Kimeneti oszlopot, kivéve, ha az adatoszlop a GROUP BY záradék része vagy egy összesítő függvény része.

  4. A Szűrő oszlopban adja meg a WHERE feltételt. A Lekérdezés- és nézettervező hozzáadja a feltételt az SQL-utasítás HAVING záradékához.

    Jegyzet

    Az eljárás példájában látható lekérdezés két táblát illeszt össze, titles és publishers.

    A lekérdezés ezen pontján az SQL-utasítás egy HAVING záradékot tartalmaz:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    GROUP BY titles.pub_id
    HAVING publishers.state = 'CA'
    
  5. A Csoportosítás oszlopban válassza a Hol lehetőséget a csoport és összegzési beállítások listájából. A Lekérdezés- és nézettervező eltávolítja a feltételt az SQL-utasítás HAVING záradékából, és hozzáadja a WHERE záradékhoz.

    Az SQL-utasítás ehelyett egy WHERE záradékot tartalmaz:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id;