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 …