Mitä eroa on missä ja ottaa lausekkeita?

tässä artikkelissa Opi, milloin käyttää missä ja ottaa. Molemmat suorittavat samanlaisia tehtäviä, mutta eri tarkoituksiin!

Kaikki tämän artikkelin esimerkit perustuvat Microsoft SQL Server Management studioon ja AdventureWorks2012-tietokantaan. Voit aloittaa käyttämällä näitä ilmaisia työkaluja käyttämällä My Guide aloittaminen SQL Server.

miten missä ja ottaa eroja?

työskenneltäessä kehittyneemmän SQL: n kanssa voi olla epäselvää, milloin on järkevää käyttää WHERE versus a HAVING-lauseketta.

vaikka vaikuttaa siltä, että molemmat lausekkeet tekevät saman asian, ne tekevät sen eri tavoin. Itse asiassa niiden tehtävät täydentävät toisiaan.

  • A, jossa käytetään lauseketta, suodetaan tietueita tuloksesta. Suodatin tapahtuu ennen ryhmittelyjä.
  • a-lauseketta käytetään ryhmän arvojen suodattamiseen.

ennen kuin jatkamme, käydään läpi SQL-lausekkeen muoto. Se on

SELECTFROMWHEREGROUP BYHAVING

auttaa pitämään asiat suorassa haluan ajatella SQL-lauseiden suoritusjärjestystä ylhäältä alas. Tämä tarkoittaa missä lauseke sovelletaan ensin tuloksen ja sitten, loput rivit tiivistää mukaan ryhmän.

missä lauseketta

käytetään suodattamaan rivejä tuloksista. Esimerkiksi

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

palauttaa laskettuna 121 317, kun taas kysely

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200

palauttaa laskuna 48 159. Tämä johtuu siitä, että WHERE-lauseke suodattaa tuloksista pois 73 158 Myyntitilausnumeroa, joiden yhteishinta on pienempi tai yhtä suuri kuin 200.

HAVING Clause

the HAVING clause is used to filter values in a GROUP BY. Voit käyttää niitä suodattaa pois ryhmiä, kuten

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000

, mutta niiden todellinen voima on niiden kyky vertailla ja suodattaa aggregoitujen funktiotulosten perusteella. Esimerkiksi, voit valita kaikki tilaukset yhteensä enemmän kuin $10,000

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

koska WHERE-lausekkeen näkyvyys on rivi kerrallaan, ei ole olemassa tapaa, jolla se voi arvioida summaa kaikkien SalesOrderID: ien välillä.

kahden: Missä ja joilla on

kun SQL-lausekkeissa on sekä WHERE-lauseke että joilla on lauseke, pitää muistaa missä-lauseke ensin, sitten tulokset ryhmitellään ja lopuksi ryhmät suodatetaan HAVING-lausekkeen mukaan.

monissa tapauksissa voit sijoittaa WHERE-ehdon HAVING-lausekkeeseen, kuten

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND SalesOrderID > 50000

vs.

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE SalesOrderID > 50000GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

jos voit laittaa ehdon where-lausekkeesta having-lausekkeeseen niin miksi edes murehtia missä? Voinko käyttää tätä kyselyä?

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10

itse asiassa tuo kysely tuottaa virheen. Sarake LineTotal ei kuulu ryhmään kenttäluettelon eikä tulos yhteenlaskettu yhteensä.

ollakseen Pätevä ottaa lauseke voi vain vertailla tuloksia yhteenlaskettujen funktioiden tai sarakkeen osa ryhmän.

jotta kysely olisi pätevä, se on kirjoitettava uudelleen nimellä

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

, jotta voidaan tiivistää ero missä ja jolla:

  • missä käytetään tietueiden suodattamiseen ennen ryhmittelyjä.
  • ottaa käytetään suodattamaan arvoja, kun ne ovat olleet ryhmiä. Ainoastaan ryhmän sarakkeet tai lausekkeet voidaan sisällyttää lausekkeen ehtoihin …

Vastaa

Sähköpostiosoitettasi ei julkaista.

More: