SQLShack (Suomi)

Jos haluat saada datasta jotain mielekästä , joudut melkein aina liittymään useisiin pöytiin. Tässä artikkelissa kerrotaan, miten se tehdään erityyppisillä liitoksilla. Tämän saavuttamiseksi yhdistämme INNER JOINs ja LEFT JOINs. Aloitetaan siis.

Malli

Alla olevasta kuvasta näet olemassa olevan mallin. Se koostuu kuudesta taulukosta, ja olemme jo enemmän tai vähemmän kuvanneet sitä edellisissä artikkeleissa.

Silti, edes kuvaamatta, jos tietokanta mallinnetaan ja esitetään hyvällä tavalla (nimien järkevä valinta, nimityskäytännön käyttö, samojen sääntöjen noudattaminen koko mallissa, kaavojen linjat / suhteet eivät ole päällekkäisiä kuin tarvitaan), sinun pitäisi pystyä lopuksi mistä löydät tarvitsemasi tiedot. Tämä on ratkaisevan tärkeää, koska ennen liittymistä useisiin taulukoihin sinun on ensin tunnistettava nämä taulukot.

Puhumme myöhemmin nimityskäytännöstä ja neuvoista ajatella kirjoittaessasi SQL-kyselyjä. sarja. Eletään toistaiseksi sen tosiasian kanssa, että tämä malli on melko yksinkertainen ja voimme tehdä sen melko helposti.

Mitä tiedämme tähän mennessä?

Tässä sarjassa olemme katettu:

  • SQL SELECT -käskyyn liittyvät perusteet ja
  • verrattu INNER JOIN ja LEFT JOIN

Käytämme tietoa molemmista artikkeleista ja yhdistämällä nämä kirjoitat monimutkaisempia SELECT-käskyjä, jotka yhdistävät useita taulukoita.

Liitä useita taulukoita INNER JOIN -sovelluksella

Ensimmäinen esimerkki, jonka analysoimme, on se, kuinka noutaa tietoja useista taulukoista, joissa käytetään vain INNER JOIN -tietoja. Kussakin esimerkissä käsitellään ratkaistavan ongelman määritelmä ja työn suorittava kysely. Aloitetaan siis ensimmäisestä ongelmasta.

# 1 Meidän on lueteltava kaikki puhelut niiden alkamis- ja lopetusajan kanssa. Jokaisessa puhelussa haluamme näyttää, mikä oli tulos, sekä puhelun soittaneen etu- ja sukunimen. Lajittelemme puhelut alkamisajankohdan mukaan nousevasti.

Ennen kyselyn kirjoittamista tunnistamme käytettävät taulukot. Tätä varten meidän on määritettävä, mitkä taulukot sisältävät tarvitsemamme tiedot, ja sisällytettävä ne. Meidän tulisi myös sisällyttää kaikki taulukot näiden taulukoiden väliin – taulukot, jotka eivät sisällä tarvittavia tietoja, mutta toimivat suhteena taulukoiden välillä (ei tässä tapauksessa).

Tehtävän suorittava kysely on annettu alla:

Kyselyn tulos on annettu alla:

Tässä on muutama asia, jonka haluaisin huomauttaa:

  • Olemme liittäneet taulukot, koska tiedot tarvitsemme sijaitsee näissä 3 taulukossa
  • Joka kerta kun mainitsen minkä tahansa taulukon minkä tahansa määritteen, käytän muotoa table_name.attribute_name (esim. työntekijä.sukunimi). Vaikka sitä ei tarvita, se on hyvä käytäntö, koska joskus 2 tai useampi taulukko samassa kyselyssä voisi käyttää samoja attribuuttien nimiä ja se johtaisi virheeseen
  • Olemme käyttäneet INNER JOIN 2 kertaa järjestyksessä liittyä 3 taulukkoon. Tämä johtaa siihen, että palautetaan vain rivit, joissa on pareja toisessa taulukossa.
  • Kun useiden taulukoiden liittämiseen käytetään vain INNER JOIN -sarakkeita, näiden taulukoiden järjestys liittymissä ei ole tärkeä. Ainoa tärkeä asia on, että käytät sopivia liittymisehtoja ”ON” -kohdan jälkeen (liittyminen ulkomaisilla avaimilla).

Koska kaikilla puheluilla oli toisiinsa liittyviä työntekijän ja puhelun lopputuloksia, saisimme saman tuloksen, jos olemme käyttäneet VASEN JOIN INNER JOIN -tekniikan sijaan.

Liitä useita taulukoita VASEN JOIN -ominaisuuden avulla

VASEN JOIN -toimintoa käyttävien kyselyjen kirjoittaminen ei eroa paljon verrattuna kyselyjen kirjoittamiseen käyttämällä INNER JOINs. Tulos olisi tietysti erilainen (ainakin tapauksissa, joissa joillakin tietueilla ei ole paria muissa taulukoissa).

Tämä on ongelma, jonka haluamme ratkaista.

# 2 Luettele kaikki näihin maihin liittyvät maakunnat ja asiakkaat. Näytä jokaiselle maalle nimi englanniksi, kaupunkiasiakkaan nimi ja kyseisen asiakkaan nimi. Palaa myös maihin, joissa ei ole kaupunkeja ja asiakkaita.

Tarvittavia tietoja sisältävät taulukot ovat alla olevassa kuvassa:

Ensin tarkista nopeasti mikä on jatkoa Näiden 3 taulukon merkinnät.

Voimme huomata kaksi tärkeää asiaa:

  • Vaikka jokaisella kaupungilla on etuyhteydessä oleva maa, kaikilla mailla ei ole samankaltaisia kaupunkeja (Espanjassa & Venäjällä ei ole niitä)
  • Sama tarkoittaa asiakkaita.Jokaisella asiakkaalla on määritetty city_id-arvo, mutta vain 3 kaupunkia on käytössä (Berliini, Zagreb & New York)

Kirjoita ensin muistiin kysely INNER JOIN -sovelluksella:

Kyselytulos näkyy alla olevassa kuvassa:

Meillä on 7 maakuntaa ja 6 kaupunkia tietokannassamme, mutta kysely palauttaa vain 4 riviä. Tämä johtuu siitä, että tietokannassamme on vain 4 asiakasta. Jokainen näistä 4 liittyy kaupunkiin ja kaupunki liittyy maahan. Joten INNER JOIN eliminoi kaikki nämä maat ja kaupungit ilman asiakkaita. Mutta miten nämä sisällytetään myös tulokseen?

Tätä varten käytämme VASEN JOIN. Korvataan yksinkertaisesti kaikki ”INNER” sanoilla ”VASEN”, joten kyselymme on seuraava:

Tulos näkyy alla olevassa kuvassa:

Voit helposti huomata, että nyt meillä on kaikki maat, myös ne, joilla ei ole kaupunkia (Venäjä & Espanja), samoin kuin kaikki kaupungit, jopa ilman asiakkaita (Varsova, Belgrad & Los Angeles). Loput 4 riviä ovat samat kuin kyselyssä, jossa käytetään INNER JOIN.

LEFT JOIN – Taulukoiden järjestyksellä on merkitystä

Vaikka JOINien järjestys INNER JOINissa ei ole tärkeä, sama ei tarkoita VASEN LIITTYMÄÄ. Kun käytämme VASEN JOIN yhdistääksesi useita pöytiä, on tärkeää muistaa, että tämä liittäminen sisältää kaikki JOINin VASEN puolen taulukon rivit. Järjestetään edellinen kysely uudelleen:

Aluksi voit helposti sanoa, että tämä ja edellinen kysely ovat samat (tämä pätee käytettäessä INNER JOIN). Olemme käyttäneet samoja taulukoita, VASEN JOIN ja samoja liittymisehtoja. Tarkastellaan ensin tulosta:

Mitä täällä tapahtui? Miksi meillä on 4 riviä (sama 4 kuin meillä, kun käytimme INNER JOIN)?

Vastaus on yksinkertainen ja se liittyy VASEN JOIN -toiminnon toimintaan. Se vie ensimmäisen pöydän (asiakas) ja yhdistää kaikki rivit (4 niistä) seuraavaan taulukkoon (kaupunki). Tuloksena on 4 riviä, koska asiakas voi kuulua vain yhteen kaupunkiin. Sitten yhdistämme nämä 4 riviä seuraavaan taulukkoon (maa), ja meillä on jälleen 4 riviä, koska kaupunki voi kuulua vain yhteen maahan.

Syy, miksi emme liittyisi näihin 3 taulukkoon tapa annetaan esimerkin # 2 tekstillä. Kysely on kirjoitettu siten, että se palauttaa 4 riviä, mikä olisi vastaus seuraaviin: Palauta kaikkien asiakkaiden nimet sekä kaupungit ja maat, joissa ne sijaitsevat. Palauta jopa asiakkaat, joilla ei ole siihen liittyviä kaupunkeja ja maita.

  • Huomaa: Kun käytät VASEN LIITTYMISTÄ, kyseisen lauseen taulukoiden järjestys on tärkeä ja kysely palauttaa toisen tuloksen, jos muutat tätä järjestystä. Järjestys riippuu itse asiassa siitä, mitä haluat palauttaa tuloksena.

Liitä useita taulukoita molemmilla – INNER JOIN & LEFT JOIN

Tämä on myös mahdollista. Seuraavassa on esimerkki.

# 3 Palauta luettelo kaikista maista ja kaupungeista, joilla on pari (poissulje maat, joihin mikään kaupunki ei viittaa). Tällaisten parien kohdalla palauta kaikki asiakkaat. Palauta parit, joilla ei ole yhtä asiakasta.

Työn tekevä kysely on:

Kyselyn tulos on esitetty alla olevassa kuvassa:

Voit helposti huomata, että meillä ei ole maita, joissa ei ole kaupunkia (nämä olivat Espanja & Venäjä). INNER JOIN eliminoi nämä rivit. Silti meillä on siteeraus ilman asiakkaita (Belgrad, Los Angeles & Varsova). Tämä johtuu siitä, että käytimme VASEMMAN LIITTYMÄÄ taulukaupungin ja asiakkaan välillä.

Päätelmä

Kun sinun on liitettävä useita taulukoita, sinulla on INNER & VASEN LIITTYMINEN (OIKEA JOIN -ohjelmaa käytetään harvoin ja se voidaan helposti korvata VASEN JOINilla). Minkä liittymän käytät, riippuu suoraan ratkaistavasta tehtävästä ja saat tunteen matkan varrella. Tulevissa artikkeleissa keskustelemme ajattelusta ja organisoinnista, kun sinun on kirjoitettava monimutkaisempia kyselyitä.

Sisällysluettelo

Opi SQL: Luo tietokanta & Luo taulukon toiminnot

Opi SQL: LISÄÄ TAULUKKOON

Opi SQL: Ensisijainen avain

Opi SQL: Vieras avain

Opi SQL: SELECT lause

Opi SQL: INNER JOIN vs LEFT JOIN

Opi SQL: SQL-komentosarjat

Opi SQL: Suhteiden tyypit

Opi SQL: Yhdistä useita taulukoita

Opi SQL: Koostetoiminnot

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äärittelemät toiminnot

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

Opi SQL: SQL-näkymät

Opi SQL: SQL-käynnistimet

Opi SQL: Harjoittele SQL-kyselyjä

Opi SQL: SQL Kyselyesimerkkejä

Opi SQL: Luo raportti manuaalisesti SQL-kyselyjen avulla

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 -vienti 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 Injection

  • 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

Viimeisimmät kirjoitukset: Emil Drkusic (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 *