Förstå kopplingsbegrepp och syntax
Den mest grundläggande och vanliga metoden för att kombinera data från flera tabeller är att använda en JOIN-åtgärd. Vissa tänker på JOIN som en separat sats i en SELECT-instruktion, men andra ser det som en del av FROM-satsen. Den här modulen kommer huvudsakligen att betrakta den som en del av FROM-satsen. I den här modulen ska vi se hur FROM-satsen i en T-SQL SELECT-instruktion skapar mellanliggande virtuella tabeller som ska användas av senare faser av frågan.
FROM-satsen och virtuella tabeller
Om du har lärt dig om den logiska ordningen för åtgärder som utförs när SQL Server bearbetar en fråga har du sett att FROM-satsen i en SELECT-instruktion är den första satsen som ska bearbetas. Den här satsen avgör vilken tabell eller vilka tabeller som ska vara källan till rader för frågan. FROM kan referera till en enskild tabell eller sammanföra flera tabeller som datakälla för din fråga. Du kan se FROM-satsen som att skapa och fylla i en virtuell tabell. Den här virtuella tabellen innehåller utdata från FROM-satsen och används av satser i SELECT-instruktionen som tillämpas senare, till exempel WHERE-satsen. När du lägger till extra funktioner, till exempel kopplingsoperatorer, i en FROM-sats är det bra att tänka på syftet med FROM-satselementen som antingen att lägga till rader i eller ta bort rader från den virtuella tabellen.
Den virtuella tabellen som skapas av en FROM-sats är endast en logisk entitet. I SQL Server skapas ingen fysisk tabell, vare sig beständig eller tillfällig, för att lagra resultatet av FROM-satsen, eftersom den skickas till WHERE-satsen eller andra delar av frågan.
Den virtuella tabellen som skapas av FROM-satsen innehåller data från alla anslutna tabeller. Det kan vara användbart att tänka på resultatet som uppsättningar och konceptualisera kopplingsresultatet som ett Venn-diagram.
Under hela sin historia har T-SQL-språket utökats för att återspegla ändringar i ANSI-standarderna (American National Standards Institute) för SQL-språket. En av de mest anmärkningsvärda platserna där dessa ändringar är synliga finns i syntaxen för kopplingar i en FROM-sats. I STANDARDEN ANSI SQL-89 angavs kopplingar genom att inkludera flera tabeller i FROM-satsen i en kommaavgränsad lista. Alla filtreringar för att avgöra vilka rader som ska inkluderas utfördes i WHERE-satsen, så här:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;
Den här syntaxen stöds fortfarande av SQL Server, men på grund av komplexiteten i att representera filtren för komplexa kopplingar rekommenderas det inte. Om en WHERE-sats utelämnas av misstag kan ANSI SQL-89-liknande kopplingar enkelt bli kartesiska produkter och returnera ett stort antal resultatrader, vilket orsakar prestandaproblem och eventuellt felaktiga resultat.
När du lär dig mer om att skriva frågor med flera tabeller i T-SQL är det viktigt att förstå begreppet kartesiska produkter. Inom matematiken är en kartesisk produkt produkten av två uppsättningar. Produkten av en uppsättning med två element och en uppsättning med sex element är en uppsättning med 12 element, eller 6 x 2. Varje element i en uppsättning kombineras med varje element i den andra uppsättningen. I exemplet nedan har vi en uppsättning namn med två element och en uppsättning produkter med tre element. Kartesiska produkten kombinerar varje namn med varje produkt som ger sex element.
I databaser är en kartesisk produkt resultatet av att kombinera varje rad i en tabell till varje rad i en annan tabell. Produkten av en tabell med 10 rader och en tabell med 100 rader är en resultatuppsättning med 1 000 rader. Det underliggande resultatet av en JOIN-åtgärd är en kartesisk produkt, men för de flesta T-SQL-frågor är en kartesisk produkt inte det önskade resultatet. I T-SQL inträffar en kartesisk produkt när två indatatabeller är anslutna utan att överväga några relationer mellan dem. Utan information om relationer returnerar SQL Server-frågeprocessorn alla möjliga kombinationer av rader. Även om det här resultatet kan ha vissa praktiska program, till exempel att generera testdata, är det vanligtvis inte användbart och kan ha allvarliga prestandakonsekvenser.
I och med tillkomsten av STANDARDEN ANSI SQL-92 har stöd för nyckelorden JOIN- och ON-satser lagts till. T-SQL stöder också den här syntaxen. Kopplingar representeras i FROM-satsen med hjälp av lämplig JOIN-operator. Den logiska relationen mellan tabellerna, som blir ett filterpredikat, anges i ON-satsen.
I följande exempel upprepas den tidigare frågan med den nyare syntaxen:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
ON p.ProductModelID = m.ProductModelID;
Kommentar
Syntaxen för ANSI SQL-92 gör det svårare att skapa oavsiktliga kartesiska produkter. När nyckelordet JOIN har lagts till utlöses ett syntaxfel om en ON-sats saknas, såvida inte JOIN anges som en CROSS JOIN.