SQL
Relationele Algebra
Zoeken…
Overzicht
Relationele algebra is geen volledige SQL- taal, maar eerder een manier om theoretisch inzicht te krijgen in relationele verwerking. Als zodanig zou het niet moeten verwijzen naar fysieke entiteiten zoals tabellen, records en velden; het moet verwijzen naar abstracte constructies zoals relaties, tupels en attributen. Dat gezegd hebbende, zal ik de academische termen in dit document niet gebruiken en zal ik me houden aan de meer algemeen bekende lekentermen - tabellen, records en velden.
Een paar regels van relationele algebra voordat we beginnen:
- De operatoren die in relationele algebra worden gebruikt, werken op hele tabellen in plaats van op individuele records.
- Het resultaat van een relationele expressie is altijd een tabel (dit wordt de eigenschap closing genoemd )
In dit document verwijs ik naar de volgende twee tabellen:
SELECT
De select- operator retourneert een subset van de hoofdtabel.
selecteer <tabel> waarbij <voorwaarde>
Bekijk bijvoorbeeld de uitdrukking:
selecteer Mensen waarbij AfdelingID = 2
Dit kan worden geschreven als:
Dit resulteert in een tabel waarvan de records bestaan uit alle records in de People- tabel waarbij de DepartmentID- waarde gelijk is aan 2:
Voorwaarden kunnen ook worden samengevoegd om de uitdrukking verder te beperken:
selecteer Mensen waarbij StartJaar> 2005 en AfdelingID = 2
resulteert in de volgende tabel:
PROJECT
De projectoperator retourneert verschillende veldwaarden uit een tabel.
project <table> over <field list>
Bekijk bijvoorbeeld de volgende uitdrukking:
project People over StartYear
Dit kan worden geschreven als:
Dit resulteert in een tabel die bestaat uit de verschillende waarden die worden bewaard in het veld StartYear van de tabel Personen .
Dubbele waarden worden uit de resulterende tabel verwijderd omdat de eigenschap sluiting een relationele tabel maakt: alle records in een relationele tabel moeten verschillend zijn.
Als de lijst meer dan één veld omvat dan de resulterende tabel is een afzonderlijke versie van deze velden.
project People over StartYear, komt DepartmentID terug:
Eén record is verwijderd vanwege de duplicatie van StartYear 2006 en 1 DepartmentID .
GEVEN
Relationele expressies kunnen aan elkaar worden gekoppeld door de individuele expressies een naam te geven met behulp van het sleutelwoord giving of door een expressie in een andere in te bedden.
<relationele algebra-expressie> geeft <alias name>
Overweeg bijvoorbeeld de volgende uitdrukkingen:
selecteer Mensen waarbij AfdelingID = 2 geeft A
project A boven PersonName die B geeft
Dit resulteert in onderstaande tabel B, waarbij tabel A het resultaat is van de eerste uitdrukking.
De eerste uitdrukking wordt geëvalueerd en de resulterende tabel krijgt de alias A. Deze tabel wordt vervolgens in de tweede uitdrukking gebruikt om de laatste tabel te geven met een alias van B.
Een andere manier om deze uitdrukking te schrijven is om de aliasnaam van de tabel in de tweede uitdrukking te vervangen door de volledige tekst van de eerste uitdrukking tussen haakjes:
project ( selecteer People waarbij DepartmentID = 2) boven PersonName die B geeft
Dit wordt een geneste uitdrukking genoemd .
NATUURLIJKE JOIN
Een natuurlijke join plakt twee tabellen aan elkaar met behulp van een gemeenschappelijk veld dat tussen de tabellen wordt gedeeld.
voeg <tabel 1> en <tabel 2> toe waarbij <veld 1> = <veld 2>
ervan uitgaande dat <veld 1> in <tabel 1> staat en <veld 2> in <tabel 2> staat.
De volgende join-expressie zal bijvoorbeeld mensen en afdelingen samenvoegen op basis van de afdelings- ID en ID- kolommen in de respectieve tabellen:
voeg mensen en afdelingen toe waar DepartmentID = ID
Merk op dat alleen Afdeling- ID uit de tabel Personen wordt weergegeven en niet ID uit de tabel Afdeling . Er hoeft slechts één van de te vergelijken velden te worden getoond. Dit is meestal de veldnaam uit de eerste tabel in de join-bewerking.
Hoewel dit in dit voorbeeld niet wordt getoond, is het mogelijk dat het samenvoegen van tabellen kan resulteren in twee velden met dezelfde kop. Als ik bijvoorbeeld de kop Naam had gebruikt om de velden PersonName en Dept te identificeren (dat wil zeggen om de Person Name en de Afdelingsnaam te identificeren). Wanneer deze situatie zich voordoet, gebruiken we de tabelnaam om de veldnamen te kwalificeren met behulp van de puntnotatie: People.Name en Departments.Name
join gecombineerd met select en project kan samen worden gebruikt om informatie op te halen:
lid worden van mensen en afdelingen waarbij DepartmentID = ID geeft A
selecteer A waarbij StartYear = 2005 en Dept = 'Production' geven B
project B boven PersonName die C geeft
of als een gecombineerde uitdrukking:
project ( selecteer ( voeg mensen en afdelingen toe waarbij DepartmentID = ID) waarbij StartYear = 2005 en Dept = 'Production') boven PersonName geven C