Ik heb de volgende twee tabellen:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Ik wil de docent vinden met de meest specialisatie.
Wanneer ik dit probeer, werkt het niet:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Maar wanneer ik dit probeer, werkt het:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
Fname,
Lname
HAVING COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Wat is de reden? Bedankt.
Antwoord 1, Autoriteit 100%
WHERE
Clausule een voorwaarde introduceert op Individuele rijen ; HAVING
clausule introduceert een voorwaarde op Aggregaties , dwz resultaten van selectie waarbij een enkel resultaat, zoals tellen, gemiddeld, min, max of som, is geproduceerd uit Meerdere rijen. Uw query vraagt om een tweede vorm van voorwaarde (d.w.z. een voorwaarde op een aggregatie), vandaar HAVING
werkt correct.
Gebruik als vuistregel WHERE
vóór GROUP BY
en HAVING
na GROUP BY
. Het is een nogal primitieve regel, maar het is handig in meer dan 90% van de gevallen.
Hoewel u erbij bent, wilt u mogelijk uw zoekopdracht opnieuw schrijven met behulp van ANSI-versie van de join:
SELECT L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)
Dit zou WHERE
elimineren dat werd gebruikt als een theta join-voorwaarde.
Antwoord 2, autoriteit 12%
Eerst moeten we de volgorde van uitvoering van clausules weten, d.w.z
VAN > WAAR > GROEP OP > > ONDERSCHEIDEN > KIES > BESTEL DOOR.
Aangezien de WHERE-clausule wordt uitgevoerd vóór de GROUP BY-clausule, kunnen de records niet worden gefilterd door WHEREtoe te passen op een GROUP BYtoegepast records.
“HAVING is hetzelfde als de WHERE-component, maar wordt toegepast op gegroepeerde records”.
eerst haalt de WHERE-component de records op op basis van de voorwaarde, dan groepeert de GROUP BY-component ze overeenkomstig en vervolgens haalt de HAVING-component de groepeer records op basis van de hebbende voorwaarde.
Antwoord 3, autoriteit 11%
HAVING
werkt op aggregaten. Aangezien COUNT
een aggregatiefunctie is, kunt u deze niet gebruiken in een WHERE
-clausule.
Hier iswat leesvoer uit MSDN op geaggregeerde functies.
Antwoord 4, autoriteit 6%
-
WHERE-clausule kan worden gebruikt met SELECT-, INSERT- en UPDATE-statements, terwijl HAVING alleen kan worden gebruikt met SELECT-statement.
-
WHERE filtert rijen vóór aggregatie (GROUP BY), terwijl HAVING groepen filtert nadat aggregaties zijn uitgevoerd.
-
De aggregatiefunctie kan niet worden gebruikt in de WHERE-component, tenzij deze zich in een subquery in de HAVING-component bevindt, terwijl de aggregatiefuncties in de HAVING-component kunnen worden gebruikt.
Antwoord 5, autoriteit 3%
Ik heb geen voorbeeld van beide in één zoekopdracht gezien. Dus dit voorbeeld kan helpen.
/**
INTERNATIONAL_ORDERS - table of orders by company by location by day
companyId, country, city, total, date
**/
SELECT country, city, sum(total) totalCityOrders
FROM INTERNATIONAL_ORDERS with (nolock)
WHERE companyId = 884501253109
GROUP BY country, city
HAVING country = 'MX'
ORDER BY sum(total) DESC
Hiermee wordt de tabel eerst gefilterd op de companyId, vervolgens gegroepeerd (per land en stad) en bovendien gefilterd tot alleen stadsaggregaties van Mexico. De companyId was niet nodig in de aggregatie, maar we konden WHERE gebruiken om alleen de rijen uit te filteren die we wilden voordat we GROUP BY gebruikten.
Antwoord 6, autoriteit 2%
Je kunt de where-clausule niet gebruiken met aggregatiefuncties, want waar records worden opgehaald op basis van voorwaarde, gaat het record voor record in de tabel en vervolgens wordt record opgehaald op basis van de voorwaarde die we hebben gegeven. Dus die tijd kunnen we niet waar clausule. Terwijl het hebben van clausule werkt op de resultSet die we uiteindelijk krijgen na het uitvoeren van een query.
Voorbeeldvraag:
select empName, sum(Bonus)
from employees
order by empName
having sum(Bonus) > 5000;
Hiermee wordt de resultSet in een tijdelijk geheugen opgeslagen, waarna de clausule zijn werk zal doen. We kunnen hier dus gemakkelijk geaggregeerde functies gebruiken.
Antwoord 7
1.
We kunnen een geaggregeerde functie gebruiken met clausule niet door waar clausule b.v. Min, Max, AVG.
2.
Waar clausule de recordtuple door tuple elimineert
Clausule elimineert de hele groep uit de verzameling groep
Meestal hebben gebruikt wanneer u groepen gegevens hebt en waar wordt gebruikt wanneer u gegevens in rijen hebt.
Antwoord 8
WHERE
Clausule wordt gebruikt om de tuples in een relatie te elimineren, en HAVING
clausule wordt gebruikt om de groepen in een relatie te elimineren.
HAVING
clausule wordt gebruikt voor geaggregeerde functies zoals
MIN
, MAX
, COUNT
, SUM
.BUT Gebruik altijd GROUP BY
CLAUSE VOOR HAVING
clausule om de fout te minimaliseren.