SQL – met Vs. Where

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%

WHEREClausule een voorwaarde introduceert op Individuele rijen ; HAVINGclausule 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 HAVINGwerkt correct.

Gebruik als vuistregel WHEREvóór GROUP BYen HAVINGna 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 WHEREelimineren 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%

HAVINGwerkt op aggregaten. Aangezien COUNTeen aggregatiefunctie is, kunt u deze niet gebruiken in een WHERE-clausule.

Hier iswat leesvoer uit MSDN op geaggregeerde functies.


Antwoord 4, autoriteit 6%

  1. WHERE-clausule kan worden gebruikt met SELECT-, INSERT- en UPDATE-statements, terwijl HAVING alleen kan worden gebruikt met SELECT-statement.

  2. WHERE filtert rijen vóór aggregatie (GROUP BY), terwijl HAVING groepen filtert nadat aggregaties zijn uitgevoerd.

  3. 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.

Bron


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

WHEREClausule wordt gebruikt om de tuples in een relatie te elimineren, en HAVINGclausule wordt gebruikt om de groepen in een relatie te elimineren.

HAVINGclausule wordt gebruikt voor geaggregeerde functies zoals
MIN, MAX, COUNT, SUM.BUT Gebruik altijd GROUP BYCLAUSE VOOR HAVINGclausule om de fout te minimaliseren.

Other episodes