Hoe combineer ik resultaten van verschillende SQL-tabellen (hint: er zijn drie manieren)
Vaak staat in een relationele database de informatie die je in je zoekopdracht wilt tonen in meer dan één tafel. Dit roept de vraag op “Hoe combineer je resultaten uit meer dan één tabel?”
Alle voorbeelden voor deze les zijn gebaseerd op Microsoft SQL Server Management Studio en de AdventureWorks2012-database. Je kunt deze gratis gebruiken tools met behulp van mijn gids Aan de slag met SQL Server.
Wat zijn de manieren waarop ik resultaten van meer dan één zoekopdracht kan combineren?
SQL zou geen erg nuttige taal zijn als dat niet het geval was Het biedt u geen gemakkelijke manier om resultaten van meer dan één zoekopdracht te combineren. Gelukkig zijn er drie manieren waarop u gegevens uit meerdere tabellen kunt combineren. We zullen deze hier kort bespreken en links geven naar meer diepgaande artikelen.
Drie belangrijke manieren om gegevens te combineren
Gegevens in relationele databasetabellen zijn onderverdeeld in rijen en kolommen. Bij het onderzoeken van manieren om gegevens te combineren, moet u er rekening mee houden dat het eindresultaat is: ofwel meer kolommen aan een resultaat toevoegen, misschien uit een andere gerelateerde tabel, of rijen, door een set rijen uit twee of meer tabellen te nemen s.
Wanneer de meeste mensen leren om gegevens te combineren, leren ze over:
- JOIN – Je kunt joins gebruiken om kolommen uit een of meer query’s te combineren tot één resultaat.
- UNION – Gebruik Unions en andere set-operatoren om rijen van een of meer query’s tot één resultaat te combineren.
- Subquery’s – Soms geneste query’s genoemd, deze kunnen worden gebruikt om een afzonderlijke zoekopdracht uit te voeren in de resultaten van de database kunnen worden gebruikt in een andere zoekopdracht.
Joins
Ik zie joins graag als de lijm die de database weer in elkaar zet. Relationele databases worden meestal genormaliseerd om de gegevens gemakkelijker te onderhouden en de prestaties te verbeteren, maar het eindresultaat is dat de informatie in veel tabellen wordt opgesplitst. U kunt Joins gebruiken om die informatie weer samen te voegen tot een meer leesbaar formaat. De gegevens worden opnieuw gecombineerd door kolommen uit elke tabel te matchen.
In alle gevallen vereisen joins twee hoofdingrediënten: twee tabellen en een join-voorwaarde. De tabellen zijn wat we zullen gebruiken om de rijen en kolommen op te halen en de join-voorwaarde is hoe we de kolommen tussen tabellen willen matchen.
Voorbeeld JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Er zijn twee hoofdtypen joins. Inner Joins en Outer Joins.
Inner Joins retourneren alleen een resulterende rij als de join-voorwaarde in beide tabellen overeenkomt. Inner joins worden voornamelijk gebruikt om de primaire sleutel van de ene tabel te matchen met een externe sleutel in een andere.
Het tweede type join is een outer join. Outer joins retourneren altijd ten minste één rij voor de hoofdtabel, ook wel de linker- of rechtertabel genoemd, en null-waarden in de overeenkomstige kolommen van de niet-overeenkomende kolom. Outer joins zijn handig om niet-overeenkomende gegevens te vinden.
Het is belangrijk op te merken dat joins meer rijen kunnen retourneren dan er in beide tabellen samen zijn. De joins retourneren combinaties van overeenkomsten. Als u twee tabellen samenvoegt, een met 5 rijen en de andere 10, kan het resultaat 0 tot 50 rijen bevatten, afhankelijk van de samenvoegvoorwaarde.
Verbonden
EEN UNIE is gebruikt om de rijen van twee of meer zoekopdrachten tot één resultaat te combineren. De vakbond wordt een set-operator genoemd.
Er zijn enkele speciale voorwaarden waaraan moet worden voldaan om een vakbond te laten werken. Ten eerste moet elke zoekopdracht hetzelfde aantal kolommen hebben. Ten tweede moeten de gegevenstypen van deze kolommen compatibel zijn. Over het algemeen moet elke zoekopdracht hetzelfde aantal en type kolommen retourneren.
Een praktisch voorbeeld van unie is wanneer twee tabellen onderdeelnummers bevatten en u een gecombineerde lijst voor een catalogus wilt maken. U kunt ervoor kiezen om het eindresultaat een unieke lijst te laten zijn voor de gecombineerde zoekopdracht, of als u UNION ALL gebruikt, retourneert u alle rijen van elke tabel.
Voorbeeld UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
Naast Union zijn er nog een aantal andere handige set-operators:
- INTERSECT – Je kunt dit gebruiken om alleen rijen te retourneren die gemeenschappelijk zijn tussen twee tabellen.
- BEHALVE – U kunt dit gebruiken om rijen te retourneren die in de ene tabel voorkomen, maar niet in een andere.
Naarmate u meer SQL leert, vindt u dat je joins kunt gebruiken om equivalente instructies te schrijven voor Intersect en Exceptional, maar er zijn geen equivalenten voor Union.
Subquery’s
Subquery’s worden soms geneste queries genoemd. Het zijn zoekopdrachten die binnen andere zoekopdrachten zijn gedefinieerd. Subquery’s kunnen verwarrend zijn. Ik denk dat veel hiervan voortkomt uit het feit dat ze op veel plaatsen in een SQL select-instructie kunnen worden gebruikt, en voor verschillende doeleinden!
Hier zijn bijvoorbeeld enkele gebieden waar u een subquery kunt zien:
- SELECT-clausule – Wordt gebruikt om een waarde te retourneren. Als u bijvoorbeeld een verkooptabel opvraagt, kunt u de totale verkopen opnemen door een som van alle verkopen uit een subquery te retourneren.
- WHERE-clausule – Subquery’s kunnen worden gebruikt in de where-component in vergelijkingen. U kunt een vergelijking maken om de verkoop te vergelijken met het algemene gemiddelde. Het algemene gemiddelde wordt geretourneerd uit een subquery. U kunt ook subquery’s gebruiken in lidmaatschapsoperatoren zoals IN. In plaats van de in-clausule hard te coderen, kunt u een subquery gebruiken om deze dynamischer te maken.
- HAVING-clausule – Een enkele waarde van een subquery wordt opgenomen in de HAVING-clausule-vergelijkingen.
Voorbeeldsubquery
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
Indien gebruikt in geselecteerde clausules en vergelijkingsoperatoren zoals gelijk aan, groter dan en kleiner dan , kan een subquery slechts één rij retourneren. Indien gebruikt in combinatie met een lidmaatschapsoperator, zoals IN, is het oké dat de query een of meer rijen retourneert.