Als u iets zinvols uit gegevens wilt halen , je zult bijna altijd aan meerdere tafels moeten deelnemen. In dit artikel laten we zien hoe u dat doet met verschillende soorten joins. Om dat te bereiken, combineren we INNER JOINs en LEFT JOINs. Laten we dus beginnen.
Het model
In de onderstaande afbeelding kun je ons bestaande model zien. Het bestaat uit 6 tabellen en we hebben het al min of meer beschreven in de vorige artikelen.
Toch, zelfs zonder te beschrijven, als de database op een goede manier is gemodelleerd en gepresenteerd (namen verstandig kiezen, naamgevingsconventie gebruiken, dezelfde regels volgen door het hele model, lijnen / relaties in schema overlappen elkaar niet meer dan nodig), zou je in staat moeten zijn om te concluderen waar u de gegevens kunt vinden die u nodig heeft. Dit is cruciaal, want voordat u aan meerdere tabellen deelneemt, moet u deze tabellen eerst identificeren.
We zullen later in dit hoofdstuk praten over naamgevingsconventie en het advies over hoe u moet nadenken wanneer u SQL-querys schrijft. serie. Laten we tot nu toe leven met het feit dat dit model vrij eenvoudig is en dat we het redelijk gemakkelijk kunnen doen.
Wat weten we tot nu toe?
In deze serie hebben we gedekt:
- Basics gerelateerd aan SQL SELECT-instructie, en
- vergeleken INNER JOIN en LEFT JOIN
We zullen de kennis gebruiken uit beide artikelen en combineer deze om meer complexe SELECT-instructies te schrijven die meerdere tabellen samenvoegen.
Voeg meerdere tabellen samen met INNER JOIN
Het eerste voorbeeld dat we zullen analyseren, is hoe we gegevens uit meerdere tabellen met alleen INNER JOINs. Voor elk voorbeeld gaan we met de definitie van het probleem dat we moeten oplossen en de vraag die het werk doet. Laten we dus beginnen met het eerste probleem.
# 1 We moeten alle oproepen vermelden met hun start- en eindtijd. Voor elke oproep willen we laten zien wat de uitkomst was, evenals de voor- en achternaam van de medewerker die de oproep heeft gedaan. We sorteren onze oproepen op oplopende begintijd.
Voordat we de zoekopdracht schrijven, zullen we de tabellen identificeren die we moeten gebruiken. Om dat te doen, moeten we bepalen welke tabellen de gegevens bevatten die we nodig hebben en deze opnemen. We moeten ook alle tabellen tussen deze tabellen opnemen – tabellen die geen benodigde gegevens bevatten, maar dienen als een relatie tussen tabellen die dat wel doen (dat is hier niet het geval).
De zoekopdracht die de taak uitvoert, wordt hieronder gegeven:
Het resultaat van de zoekopdracht wordt hieronder gegeven:
Er zijn een paar dingen waar ik hier op wil wijzen:
- De tabellen die we hebben samengevoegd zijn hier omdat de gegevens we nodig hebben bevindt zich in deze 3 tabellen.
- Elke keer dat ik een attribuut uit een tabel noem, gebruik ik het formaat table_name.attribute_name (bijv. employee.first_name). Hoewel dat niet nodig is, is het een goede gewoonte, omdat soms 2 of meer tabellen in dezelfde query dezelfde attribuutnamen kunnen gebruiken en dat zou leiden tot een fout.
- We hebben INNER JOIN 2 keer gebruikt om om aan 3 tafels deel te nemen. Dit zal resulteren in het retourneren van alleen rijen met paren in een andere tabel.
- Als je alleen INNER JOINs gebruikt om aan meerdere tafels deel te nemen, is de volgorde van deze tabellen in joins niet belangrijk. Het enige belangrijke is dat u de juiste voorwaarden voor deelname gebruikt na de “AAN” (samenvoegen met externe sleutels).
Aangezien alle oproepen een gerelateerde werknemer en oproep hadden, zouden we hetzelfde resultaat krijgen als we hebben LEFT JOIN gebruikt in plaats van INNER JOIN.
Voeg meerdere tabellen samen met LEFT JOIN
Het schrijven van queries die LEFT JOINs gebruiken verschilt niet veel in vergelijking met het schrijven van queries met INNER JOINs. Het resultaat zou natuurlijk anders zijn (tenminste in gevallen waarin sommige records geen paar hebben in andere tabellen).
Dit is het probleem dat we willen oplossen.
# 2 Maak een lijst van alle provincies en klanten die aan deze landen zijn gerelateerd. Geef voor elk land de naam in het Engels weer, de naam van de plaats waar de klant zich bevindt en de naam van die klant. Geef zelfs landen terug zonder gerelateerde steden en klanten.
De tabellen met gegevens die we nodig hebben, staan in de onderstaande afbeelding:
Laten we eerst controleer snel wat de cont ents van deze 3 tabellen.
We kunnen twee belangrijke dingen opmerken:
- Hoewel elke stad een gerelateerd land heeft, hebben niet alle landen gerelateerde steden (Spanje & Rusland heeft ze niet)
- Dezelfde staat voor de klanten.Elke klant heeft de waarde city_id gedefinieerd, maar er worden slechts 3 steden gebruikt (Berlijn, Zagreb & New York)
Laten we eerst de zoekopdracht met INNER JOIN:
Het resultaat van de zoekopdracht wordt weergegeven in de onderstaande afbeelding:
We hebben 7 provincies en 6 steden in onze database, maar onze zoekopdracht retourneert slechts 4 rijen. Dat komt doordat we maar 4 klanten in onze database hebben. Elk van deze 4 is gerelateerd aan de stad en de stad is gerelateerd aan het land. Dus INNER JOIN heeft al deze landen en steden zonder klanten geëlimineerd. Maar hoe u deze ook in het resultaat kunt opnemen?
Om dat te doen, gebruiken we LEFT JOIN. We vervangen gewoon alle “INNER” door “LINKS”, dus onze vraag is als volgt:
Het resultaat wordt getoond in de onderstaande afbeelding:
U kunt gemakkelijk zien dat we nu alle landen hebben, zelfs die zonder enige verwante stad (Rusland & Spanje), evenals alle steden, zelfs steden zonder klanten (Warschau, Belgrado & Los Angeles). De overige 4 rijen zijn hetzelfde als in de query met INNER JOIN.
LEFT JOIN – De volgorde van tabellen is belangrijk
Hoewel de volgorde van JOINs in INNER JOIN niet belangrijk is, is hetzelfde staat niet voor de LEFT JOIN. Als we LEFT JOIN gebruiken om aan meerdere tafels deel te nemen, is het belangrijk om te onthouden dat deze join alle rijen van de tabel aan de LINKER-kant van de JOIN omvat. Laten we de vorige vraag opnieuw rangschikken:
In eerste instantie zou je gemakkelijk kunnen zeggen dat deze vraag en de vorige hetzelfde zijn (dit is waar bij gebruik van INNER JOIN). We hebben dezelfde tabellen, LEFT JOINs en dezelfde join-voorwaarden gebruikt. Laten we eerst eens naar de uitvoer kijken:
Dus, wat gebeurde hier? Waarom hebben we 4 rijen (dezelfde 4 die we hadden toen we INNER JOIN gebruikten)?
Het antwoord is simpel en het heeft te maken met hoe LEFT JOIN werkt. Het neemt de eerste tafel (klant) en voegt alle rijen (4 ervan) samen met de volgende tafel (stad). Het resultaat hiervan is 4 rijen omdat de klant maar tot 1 stad kan behoren. Dan voegen we deze 4 rijen samen met de volgende tafel (land), en weer hebben we 4 rijen omdat de stad tot slechts 1 land zou kunnen behoren.
De reden waarom we hier niet aan deze 3 tafels zouden deelnemen manier wordt gegeven door de tekst van voorbeeld # 2. De zoekopdracht is op zon manier geschreven dat het als resultaat geeft dat 4 rijen het antwoord zijn op het volgende: Retourneer namen van alle klanten, evenals steden en landen waarin ze zich bevinden. Retourneer zelfs klanten zonder gerelateerde steden en landen.
- Opmerking: wanneer u LEFT JOIN gebruikt, is de volgorde van de tabellen in die instructie belangrijk en zal de query een ander resultaat retourneren als u deze volgorde wijzigt. De volgorde hangt eigenlijk af van wat u als resultaat wilt retourneren.
Voeg samen aan meerdere tafels toe door beide te gebruiken – INNER JOIN & LEFT JOIN
Dit is ook mogelijk. Laten we weer een voorbeeld nemen.
# 3 Retourneer de lijst van alle landen en steden die een paar hebben (exclusief landen waarnaar geen enkele stad verwijst). Voor dergelijke paren retourneren alle klanten. Retourneer even paren die geen enkele klant hebben.
De vraag die het werk doet is:
Het resultaat van de zoekopdracht wordt weergegeven in de onderstaande afbeelding:
U kunt gemakkelijk zien dat we geen landen hebben zonder een gerelateerde stad (dit waren Spanje & Rusland). De INNER JOIN heeft deze rijen verwijderd. Toch hebben we citaten zonder klanten (Belgrado, Los Angeles & Warschau). Dit is het resultaat van het feit dat we LEFT JOIN hebben gebruikt tussen tafels stad en klant.
Conclusie
Als je aan meerdere tafels moet deelnemen, heb je INNER & LEFT JOIN tot uw beschikking (RIGHT JOIN wordt zelden gebruikt en kan gemakkelijk worden vervangen door LEFT JOIN). Welke join je gaat gebruiken, hangt rechtstreeks af van de taak die je moet oplossen en je krijgt gaandeweg het gevoel. In aankomende artikelen bespreken we hoe u kunt nadenken en hoe u uzelf kunt organiseren wanneer u complexere vragen moet schrijven.
Inhoudsopgave
SQL leren: CREATE DATABASE & CREATE TABLE Operations
SQL leren: INSERT IN TABLE
SQL leren: primaire sleutel
SQL leren: externe sleutel
SQL leren: SELECT statement
Leer SQL: INNER JOIN versus LEFT JOIN
Leer SQL: SQL-scripts
Leer SQL: soorten relaties
SQL leren: meerdere tabellen samenvoegen
SQL leren: geaggregeerde functies
SQL leren: een complexe SELECT schrijven Query
SQL leren: de INFORMATION_SCHEMA-database
SQL leren: SQL-gegevenstypen
SQL leren: theorie instellen
SQL leren: door de gebruiker gedefinieerde functies
SQL leren: door de gebruiker gedefinieerde opgeslagen procedures
SQL leren: SQL-weergaven
SQL leren: SQL-triggers
SQL leren: SQL-querys oefenen
SQL leren: SQL Queryvoorbeelden
SQL leren: maak handmatig een rapport met behulp van SQL-querys
SQL leren: SQL Server datum- en tijdfuncties
SQL leren: SQL Server-rapporten maken met datum- en tijdfuncties
SQL leren: SQL Server-draaitabellen
SQL leren: SQL Server exporteren naar Excel
SQL leren: inleiding tot SQL Server-loops
SQL leren: SQL Server-cursors
SQL leren: SQL-best practices voor het verwijderen en bijwerken van gegevens
SQL leren: naamgevingsconventies
SQL leren: SQL-gerelateerde taken
SQL leren: niet-Equi joins in SQL Server
SQL leren: SQL-injectie
- Auteur
- Recente berichten
Zijn vroegere en huidige opdrachten variëren van database-ontwerp en codering tot lesgeven, adviseren en schrijven over databases. Ook niet te vergeten, BI, algoritmes maken, schaken, filatelie, 2 honden, 2 katten, 1 vrouw, 1 baby …
Je kunt hem vinden op LinkedIn
Bekijk alle berichten van Emil Drkusic
- SQL leren: SQL-injectie – 2 november 2020
- SQL leren: niet-Equi joins in SQL Server – 29 september 2020
- SQL leren: SQL-gerelateerde vacatures – 1 september 2020