Delen via


HAVING- en WHERE-componenten gebruiken in dezelfde query (Visual Database Tools)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In sommige gevallen wilt u mogelijk afzonderlijke rijen uitsluiten van groepen (met behulp van een WHERE-component) voordat u een voorwaarde toepast op groepen als geheel (met behulp van een HAVING-component).

Een HAVING-component is vergelijkbaar met een WHERE-component, maar is alleen van toepassing op groepen als geheel (dat wil gezegd, op de rijen in de resultatenset die groepen vertegenwoordigen), terwijl de WHERE component van toepassing is op afzonderlijke rijen. Een query kan zowel een WHERE-component als een HAVING-component bevatten. In dat geval:

  • De WHERE clausule wordt eerst toegepast op de afzonderlijke rijen in de tabellen of tabelwaardeobjecten in het deelvenster Diagram. Alleen de rijen die voldoen aan de voorwaarden in de WHERE-component worden gegroepeerd.

  • De HAVING component wordt vervolgens toegepast op de rijen in de resultatenset. Alleen de groepen die voldoen aan de HAVING voorwaarden worden weergegeven in de queryuitvoer. U kunt een HAVING component alleen toepassen op kolommen die ook worden weergegeven in de GROUP BY component of in een statistische functie.

Een WHERE- en HAVING-component opgeven voor twee gekoppelde tabellen

Notitie

De database die in dit artikel wordt gebruikt, is de pubs database, beschikbaar vanuit de Northwind en pubs voorbeeldgegevensbanken voor Microsoft SQL Server op GitHub.

Stel dat u deelneemt aan de titles en publishers tabellen om een query te maken met de gemiddelde boekprijs voor een set uitgevers. U wilt de gemiddelde prijs voor slechts een specifieke set uitgevers zien, misschien alleen de uitgevers in de staat Californië. En zelfs dan wilt u alleen de gemiddelde prijs zien als deze meer dan $ 10,00 is.

U kunt de eerste voorwaarde vaststellen door een WHERE component op te nemen, waarmee uitgevers die zich niet in Californië bevinden, worden verwijderd voordat u de gemiddelde prijzen berekent. Voor de tweede voorwaarde is een HAVING-component vereist, omdat de voorwaarde is gebaseerd op de resultaten van het groeperen en samenvatten van de gegevens. De resulterende SQL-instructie kan er als volgt uitzien:

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;

In de Visual Database Tools van SQL Server Management Studio kunt u zowel HAVING- als WHERE-componenten maken in het deelvenster Criteria. Als u standaard een zoekvoorwaarde voor een kolom opgeeft, wordt de voorwaarde onderdeel van de HAVING component. U kunt de voorwaarde echter wijzigen in een WHERE-clausule.

U kunt een WHERE-component en HAVING-component met dezelfde kolom maken. Hiervoor moet u de kolom twee keer toevoegen aan het deelvenster Criteria en vervolgens één exemplaar opgeven als onderdeel van de HAVING-component en het andere exemplaar als onderdeel van de WHERE-component.

Een WHERE-voorwaarde opgeven in een statistische query

  1. Geef de groepen voor uw query op. Voor meer informatie, zie Rijen groeperen in queryresultaten (Hulpmiddelen voor visuele databases).

  2. Als deze zich nog niet in het deelvenster Criteria bevindt, voegt u de kolom toe waarop u de WHERE voorwaarde wilt baseren.

  3. Wis de uitvoerkolom, tenzij de datakolom deel uitmaakt van de GROUP BY clausule of deel uitmaakt van een aggregatiefunctie.

  4. Geef in de kolom Filter de voorwaarde WHERE op. De query- en weergaveontwerper voegt de voorwaarde toe aan de HAVING-component van de SQL-instructie.

    Notitie

    De query die in het voorbeeld voor deze procedure wordt weergegeven, voegt twee tabellen, titles en publishers.

    Op dit punt in de query bevat de SQL-instructie een HAVING-component:

    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. Selecteer in de kolom Groeperen op de optie Where uit de lijst met groeps- en samenvattingsopties. De query- en weergaveontwerper verwijdert de voorwaarde uit de HAVING-component in de SQL-instructie en voegt deze toe aan de WHERE-component.

    De SQL-instructie wordt gewijzigd om in plaats daarvan een WHERE-clausule op te nemen:

    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;