Mitä eroa on alakyselyllä ja sisäisellä liitoksella?

Tässä pulmassa opettelemme, miten alakysely kirjoitetaan uudelleen käyttämällä inner joinia. Tieto subquery versus inner join voi auttaa sinua haastattelukysymyksissä ja suorituskykyongelmissa. Vaikka alikyselyillä on ainutlaatuisia kykyjä, on tilanteita, joissa on parempi käyttää muita SQL-konstruktioita, kuten joinia.

Lukemalla tämän artikkelin opit useista alikyselytyypeistä ja siitä, miten kukin niistä voidaan vaihtaa toiseen muotoon, kuten joiniin.

Palapelien ratkominen on hyvä tapa oppia SQL:ää. Mikään ei voita opitun harjoittelua. Kun olet ratkaissut arvoituksen, kirjoita vastauksesi kommentteihin, jotta voimme kaikki oppia toisiltamme. Keskustelemme arvoituksista ja muusta myös Essential SQL Learning Group -ryhmässä Facebookissa. Muista löytää meidät sieltä!

SQL-palapeli Kysymys

Lääkitys kyselyjen sekaannukseen…

Työtoveri oppi juuri alikyselyistä ja kirjoitti SQL:ää hakiakseen työntekijöiden nimet ja syntymäajat AdventureWorks-tietokannasta. Ongelmana on, että hän haluaa muuttaa sitä, ja nyt sitä on vaikea lukea!

Voitko auttaa häntä yksinkertaistamaan seuraavaa SQL:ää?

SELECT E.HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID), (SELECT LastName FROM Person.Person P2 WHERE P2.BusinessEntityID = E.BusinessEntityID), E.BirthDateFROM HumanResources.Employee EWHERE (SELECT PersonType FROM Person.Person T WHERE T.BusinessEntityID = E.BusinessEntityID) = 'EM'ORDER BY HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID)

Minkä lausekkeen kirjoittaisit, jotta sitä olisi helpompi lukea ja jotta se toimisi ehkä tehokkaammin?

Subquery versus Inner Join Vastaus

Keskustellaan ennen kuin aloitamme olemassa olevasta kyselystä… mikä se on?

Kyselyssä yhdistetään tietoja kahdesta eri taulusta. Se tekee sen käyttämällä alakyselyjä sekä FROM- että WHERE-lausekkeissa. Nämä on korostettu alla sinisellä.

SELECT E.HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID), (SELECT LastName FROM Person.Person P2 WHERE P2.BusinessEntityID = E.BusinessEntityID), E.BirthDateFROM HumanResources.Employee EWHERE (SELECT PersonType FROM Person.Person T WHERE T.BusinessEntityID = E.BusinessEntityID) = 'EM'ORDER BY HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID)

Näet myös, että jokaisen alakyselyn WHERE-lausekkeessa rajoitetaan palautettavat rivit niihin, jotka vastaavat Employee.BusinessEntityID:tä. Tätä kutsutaan korreloiduksi alakyselyksi.

Huomautan myös, että FROM-kyselyjen on palautettava yksi arvo (skalaari). Jos ne eivät sitä tee, heitetään virhe.

Kuten voitte kuvitella, tämä on vaarallista, koska voi olla vaikeaa taata, että kysely palauttaa korkeintaan yhden rivin. Tiedän, että olivat turvallisia tässä tapauksessa Tiedän tämän, koska täsmäytysehto tapahtuu kunkin taulukon ensisijaisten avainten välillä.

Subquery versus Inner Join – Kyselyn muuntaminen

Jos kirjoittaisin tämän kyselyn, käyttäisin INNER JOINia. Tässä on kysely, jonka kirjoittaisin:

SELECT E.HireDate, P.FirstName, P.LastName, E.BirthDateFROM HumanResources.Employee E INNER JOIN Person.Person P ON P.BusinessEntityID = E.BusinessEntityIDWHERE P.PersonType = 'EM'ORDER BY E.HireDate, P.FirstName

Kumpi on helpompi lukea?

Tästä ei pitäisi olla paljon keskustelua, INNER JOIN on paljon lyhyempi ja mielestäni ytimekkäämpi. Join-lauseke puhuu puolestaan. Tiedät, että se liittää kaksi taulukkoa toisiinsa; kun taas alakyselyssä se on niin ilmeistä.

INNER JOIN -versio on helpompi ylläpitää.

Kaiken lisäksi alakyselymenetelmässä näet suuren osan koodista toistuvan. Tämä ei ehkä tunnu nyt isolta asialta, mutta jos joudut joskus muuttamaan kyselyä, se on sitä, sillä nyt kun teet muutoksen, sinun täytyy olla varma, että teet saman muutoksen useaan paikkaan.

SubQuery vai Inner Join? Kumpi on tehokkaampi?

Tässä on sub query-version kyselysuunnitelma:

Subquery versus Inner Join Query Plan

Olen korostanut neljän alakyselyn vaikutusta. Tässä lausekkeessa jokainen kysely johtaa sisäkkäiseen silmukkaan. Nämä eivät ole hyviä.

Se tarkoittaa, että jos sinulla on kymmenen riviä kahdessa taulukossa kummassakin, sinun täytyy keskimäärin käydä läpi toinen taulukko 50 kertaa (100/2) jokaista ensimmäisen taulukon riviä kohden, jotta löydät vastaavuuden. Tämä tarkoittaa, että sen sijaan, että haku kestäisi kaksi tai kolme operaatiota osuman löytämiseksi, osuman löytäminen voi viedä jopa 100 * 50 = 500 hakua.

Sisäkkäiset silmukat ovat tosiasia, mutta vähemmän on parempi.

Ja tässä on INNER JOIN -versio:

SET SHOWPLAN_ALL ONSELECT E.HireDate, P.FirstName, P.LastName, E.BirthDateFROM HumanResources.Employee E INNER JOIN Person.Person P ON P.BusinessEntityID = E.BusinessEntityIDWHERE P.PersonType = 'EM'ORDER BY E.HireDate, P.FirstName

Tässä näet, että sisäkkäisiä silmukoita on vain yksi. Se on varmasti parempi kuin neljä.

Katsottuasi sekä SQL- että kyselysuunnitelmia kummastakin lausekkeesta voit nähdä, että INNER JOIN on monella tapaa parempi; katso kuitenkin tuota yksinkertaistettua suunnitelmaa!

Kyselyn todellisena tehtävänä on yhdistää sarakkeita kahdesta taulukosta; tässä INNER JOINit ovat erinomaisia. Toki on aikoja, jolloin alikyselyt ovat järkeviä, ja niitä voidaan käyttää sellaisten asioiden tekemiseen, joita ei voi tehdä yhdistelmillä, mutta tässä tapauksessa ei ole järkevää käyttää sellaista.

Vastaa

Sähköpostiosoitettasi ei julkaista.