SQLShack (Suomi)

INNER JOIN vs LEFT JOIN, eli kysymys. Tänään selitämme lyhyesti, miten näitä kahta liitostyyppiä käytetään ja mikä on ero. Käymme tämän aiheen läpi myöhemmin myöhemmin, kun laajennamme malliamme ja pystymme kirjoittamaan paljon monimutkaisempia kyselyitä.

Muutokset tiedoissa

Ennen kuin vertaamme INNER JOINia VASEN LIITTYMÄ, katsotaanpa mitä tiedämme tällä hetkellä. Toistaiseksi tässä sarjassa olemme selittäneet tietokannan perusteet – kuinka luoda tietokanta ja taulukot, kuinka täyttää taulukot tiedoilla ja tarkistaa niihin tallennetut tiedot yksinkertaisilla kyselyillä. Olemme jopa liittäneet kaksi taulukkoa edellisessä artikkelissa. Nyt olemme valmiita seuraavaan vaiheeseen.

Mutta ennen kuin siirrymme siihen, tehdään vain yksi pieni muutos tietomme. Lisätään 2 riviä maataulukkoon seuraavilla INSERT INTO -komennoilla:

Tarkistamme nyt molempien taulukoiden sisällön:

Voit helposti huomata, että taulukon maassa on 2 uutta riviä, yksi Espanjalle ja toinen Venäjälle. Heidän tunnuksensa ovat 6 ja 7. Huomaa myös, että kaupunkitaulukossa ei ole country_id-arvoa, jonka arvo on 6 tai 7. Tämä tarkoittaa yksinkertaisesti sitä, että meillä ei ole tietokannassamme kaupunkia Venäjältä tai Espanjasta. Käytämme tätä tosiseikkaa myöhemmin.

SISÄINEN LIITTYMINEN

Keskustellaan näistä kahdesta kyselystä:

Heidän palauttaman tuloksensa näkyy alla olevassa kuvassa:

Molemmat kyselyt palauttavat täsmälleen saman tuloksen. Tämä ei ole vahingossa, vaan tulos siitä, että tämä on sama kysely, joka on kirjoitettu kahdella eri tavalla. Molemmat tavat ovat oikein, ja voit käyttää mitä tahansa niistä.

Ensimmäisessä kyselyssä lueteltiin kaikki käyttämämme taulukot kyselyn FROM-osassa (FROM-maa, kaupunki) ja menimme sitten liittymään ehto kyselyn WHERE-osassa (WHERE city.country_id = country.id). Jos unohdimme kirjoittaa tämän liittymisehdon, meillä olisi molempien taulukoiden suorakulmainen tulo.

Toisessa kyselyssä meillä on vain yksi taulukko kyselyn FROM-osassa (FROM-maa) ja sitten meillä on toinen taulukko ja JOIN-ehto kyselyn JOIN-osassa (INNER JOIN city ON city.country_id = country.id).

Vaikka molemmat kyselyt ovat hyvin kirjoitettuja, ehdotan, että käytät aina INNER JOIN -taulukkoa taulukoiden luetteloimisen ja liittämisen sijaan kyselyn WHERE-osaan. Tähän on muutama syy:

  • Luettavuus on paljon parempi, koska käytetty taulukko ja siihen liittyvät JOIN-ehdot ovat samat linja. Voit helposti nähdä, jätitkö JOIN-ehdon vai et.
  • Jos haluat käyttää muita JOIN-tekijöitä myöhemmin (VASEN tai OIKEA), et voisi tehdä sitä (helposti), ellet ole aiemmin käyttänyt INNER JOIN -toimintoa että

Seuraavaksi kommentoidaan mitä kyselyt todella palautuivat:

  • kaikki toisiinsa liittyvät maat ja kaupungit (ulkomaisen avaimen kautta)
  • Meillä ei ole kahta maata luettelossa (Espanja ja Venäjä), koska niillä ei ole yhtään vastaavaa kaupunkia kaupunkitaulukossa

VASEN JOIN

Toistan tämän – ”Meillä ei ole 2 maata luettelossa (Espanja ja Venäjä), koska niillä ei ole yhtään kaupunkia kaupunkitaulukossa”. Tämä on ratkaisevan tärkeää verrattaessa INNER JOIN ja VASEN JOIN.

Joissakin tapauksissa haluamme sisällyttää jopa nämä tietueet tulokseemme. Esimerkiksi haluat yksinkertaisesti nähdä tuloksesta, että näillä mailla ei ole toisiinsa liittyviä taulukoita. Tämä voi olla osa jonkinlaista valvontaa, tai ehkä vain tapausten laskeminen jne. Riippumatta siitä, millainen halu on, haluamme teknisesti pystyä siihen. Ja me olemme. Tietokannoissa VASEN JOIN tekee juuri sen.

VASEN JOIN-tuloksen on oltava sama kuin INNER JOIN +, meillä on rivejä ”vasemmalta” -taulukosta ilman paria ”oikea” taulukko. Käytämme samaa INNER JOIN -kyselyä ja korvataan vain sana INNER sanalla LEFT. Tämä on tulos:

Voit helposti huomata, että meillä on 2 riviä enemmän kuin INNER-tulos. LIITY kysely. Nämä ovat rivejä Venäjälle ja Espanjalle. Koska molemmilla ei ole yhtään kaupunkia, kaikilla näillä kahdella rivillä olevilla kaupunkimääritteillä on NULL-arvot (ei määritelty). Tämä on suurin ero verrattaessa INNER JOIN ja VASEN JOIN.

RIGHT JOIN

Kuulet ainakin OIKEA JOIN. Sitä käytetään harvoin, koska se antaa saman tuloksen kuin LEFT JOIN. Toisaalta VASEN JOINia käyttäviä kyselyjä on paljon helpompi lukea, koska luetellaan vain taulukot peräkkäin.

Tämä vastaa edellistä kyselyä, joka käyttää OIKEA JOIN:

Huomaa, että palautetut arvot ovat samat, vain tässä tapauksessa kaupunkitaulukon arvot ovat viiden ensimmäisen sarakkeen sisällä, ja maa- liittyvät arvot tulevat niiden jälkeen.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Itse asiassa tämä ei ole lainkaan kysymys. Käytät INNER JOIN -toimintoa, kun haluat palauttaa vain tietueet, joissa on pari molemmilla puolilla, ja LEFT JOIN -toimintoa käytetään, kun tarvitset kaikkia ”vasen” -taulukon tietueita riippumatta siitä, onko heillä pari ”oikeassa” taulukossa. tai ei. Jos tarvitset kaikki tietueet molemmista taulukoista, riippumatta siitä, onko niillä pari, sinun on käytettävä CROSS JOIN -ohjelmaa (tai simuloitava sitä LEFT JOINs ja UNION). Lisätietoja siitä tulevissa artikkeleissa.

Sisällysluettelo

Opi SQL: Luo tietokanta & Luo taulukon toiminnot

Opi SQL: LISÄÄ TAULUKKOON

Opi SQL: Ensisijainen avain

Opi SQL: Vieras avain

Opi SQL: SELECT-käsky

Opi SQL: INNER JOIN vs LEFT JOIN

Opi SQL: SQL-komentosarjat

Opi SQL: relaatiotyypit

Opi SQL: Liitä useita taulukoita

Opi SQL: Aggregate Functions

Opi SQL: Kuinka kirjoittaa monimutkainen SELECT-kysely

Opi SQL: INFORMATION_SCHEMA-tietokanta

Opi SQL: SQL-tietotyypit

Opi SQL: Aseta teoria

Opi SQL: Käyttäjän määrittämät toiminnot

Opi SQL: Käyttäjän määrittelemät tallennetut menettelyt

Opi SQL: SQL-näkymiä

Opi SQL: SQL-käynnistimet

Opi SQL: Harjoittele SQL-kyselyjä

Opi SQL: esimerkkejä SQL-kyselyistä

Opi SQL: Luo raportti manuaalisesti SQL-kyselyjen käyttäminen

Opi SQL: SQL Serverin päivämäärä- ja aikatoiminnot

Opi SQL: Luo SQL Server -raportteja päivämäärä- ja aikatoimintojen avulla

Opi SQL: SQL Server Pivot -taulukot

Opi SQL: SQL Server viedään Exceliin

Opi SQL: Johdatus SQL Server -silmukkoihin

Opi SQL: SQL Server -kohdistimet

Opi SQL: SQL: n parhaat käytännöt tietojen poistamiseen ja päivittämiseen

Opi SQL: Nimeämiskäytännöt

Opi SQL: SQL-työtehtävät

Opi SQL: Non-Equi liittyy SQL Serveriin

Opi SQL: SQL Injektio

  • Kirjoittaja
  • Viimeisimmät viestit
Emil on tietokantojen ammattilainen, jolla on yli 10 vuoden kokemus kaikesta tietokantoihin liittyvästä. Vuosien varrella hän työskenteli IT- ja finanssialalla ja työskentelee nyt freelancerina.
Hänen aikaisemmat ja nykyiset tehtävänsä vaihtelevat tietokantojen suunnittelusta ja koodauksesta opetukseen, konsultointiin ja tietokantojen kirjoittamiseen. Älä unohda, BI, algoritmien luominen, shakki, filatelia, 2 koiraa, 2 kissaa, 1 vaimo, 1 vauva …
Löydät hänet LinkedInistä
Näytä kaikki Emil Drkusicin viestit

Emil Drkusic uusimmat viestit (katso kaikki)
  • Opi SQL: SQL Injection – 2. marraskuuta 2020
  • Opi SQL: Ei-Equi-liittymät SQL Serveriin – 29. syyskuuta 2020
  • Opi SQL: SQL-työtehtävät – 1. syyskuuta 2020

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *