Sql joining tables union. Använder UNION i SQL


Syntax

Operatören anges mellan förfrågningar. I förenklad form ser det ut så här:

< запрос1 >UNION[ALLA]< запрос2 >UNION[ALLA]< запрос3 > ..... ;

Som standard döljs alla dubbletter av poster automatiskt om inte ett UNION ALL-uttryck används.

Det bör noteras att UNION i sig inte garanterar radordning. Rader från den andra frågan kan visas i början, i slutet eller till och med blandas med rader från den första frågan. I de fall en specifik beställning krävs måste en ORDER BY-klausul användas.

Villkor

Det finns två grundläggande regler för användningen av UNION-operatören:

  • Antalet och ordningen på kolumner som hämtas måste vara samma i alla frågor som sammanfogas;
  • Datatyperna i motsvarande kolumner måste vara kompatibla.

Definitionerna av kolumnerna som data hämtas från i kopplingsfrågorna behöver inte vara desamma, utan måste vara kompatibla genom implicit konvertering. Om datatyperna är olika, bestäms den resulterande datatypen baserat på reglerna för datatypsordning (för en specifik DBMS). Om typerna är samma men skiljer sig i precision, skala eller längd, bestäms resultatet baserat på reglerna som används för att kombinera uttryck (för en viss DBMS). Icke-ANSI-typer som DATA och BINARY måste vanligtvis matcha andra kolumner av samma icke-standardtyp.

En annan kompatibilitetsbegränsning är att NULL-värden inte är tillåtna i någon join-kolumn, och dessa värden måste också vara förbjudna för alla motsvarande kolumner i andra join-frågor eftersom NULL-värden inte är tillåtna under NOT NULL-begränsningen. Dessutom kan du inte använda UNION i underfrågor, och du kan inte använda samla funktioner i SELECT-satsen för en fråga i en join (de flesta DBMS ignorerar dock dessa begränsningar).

Ansökan

UNION kan vara ganska användbar i datalagringsapplikationer där tabeller sällan är perfekt normaliserade. Ett enkelt exempel: databasen innehåller tabeller sales2005 och sales2006, som har en identisk struktur, men är separerade för att förbättra prestandan. En UNION-fråga låter dig kombinera resultat från båda tabellerna.

Det är också värt att notera att UNION ALL fungerar snabbare än bara UNION, eftersom som standard, när du använder UNION-operatorn, utförs ytterligare filtrering av resultatet, liknande SELECT DISTINCT, men när du använder UNION ALL är det inte det.

Exempel

Använder UNION när du väljer från två tabeller

Två tabeller ges:

När du kör följande fråga:

(VÄLJ * FRÅN försäljning2005) UNION (VÄLJ * FRÅN försäljning 2006) ;

resultatuppsättningen erhålls, men ordningen på raderna kan ändras godtyckligt, eftersom nyckeluttryck ORDER BY användes inte:

Som ett resultat kommer två rader med John att visas, eftersom dessa rader skiljer sig åt i värdena i kolumnerna. Men i resultatet finns det bara en rad med Alexey, eftersom värdena i kolumnerna helt sammanfaller.

Använder UNION ALL när du väljer från två tabeller

Att använda UNION ALL ger ett annat resultat eftersom dubbletter inte är dolda. Utför begäran:

(VÄLJ * FRÅN försäljning 2005) UNION ALLA (VÄLJ * FRÅN försäljning 2006) ;

kommer att producera följande resultat, utskrivet utan beställning på grund av avsaknaden av en ORDER BY-klausul:

Använd UNION när du väljer från en tabell

På ett liknande sätt kan du kombinera två olika frågor från samma tabell (även om du vanligtvis kombinerar de nödvändiga parametrarna i en enda fråga med hjälp av AND- och OR-nyckelorden i WHERE-satsen istället):

Resultatet blir:

person belopp
Ivan 1000
Sergey 5000

Använder UNION som en yttre sammanfogning

Med UNION kan du också skapa fullständiga yttre kopplingar (används ibland när det inte finns något inbyggt direktstöd för yttre kopplingar):

(VÄLJ * FRÅN anställd VÄNSTER JOIN avdelning PÅ anställd. Avdelnings-ID = avdelning. Avdelnings-ID) UNION (VÄLJ * FRÅN anställd HÖGER JOIN avdelning PÅ anställd. Avdelnings-ID = avdelning. Avdelnings-ID) ;

Men det är nödvändigt att komma ihåg att detta fortfarande inte är samma sak som JOIN-operatören.

se även

Anteckningar

Länkar

allmän beskrivning
  • Förstå SQL. Kapitel 14. Använda UNION-klausulen (ryska)
  • SQL UNION-operatör
  • UNION (DISTINCT) och UNION ALL (engelska)
Implementering i MS SQL Server
  • Beskrivning av UNION (Transact-SQL) i MSDN (ryska)
Implementering i MySQL
  • Fråga efter data med hjälp av SQL UNION (exempel på användning i MySQL) (engelska)
  • UNION Syntax (i MySQL) (engelska)
Implementering i PostgreSQL
  • UNION-klausul (i PostgreSQL)
Implementering i Oracle
  • UNION (ALL), INTERSECT, MINUS Operatörer (engelska)
Implementering i Informix
  • Skriv avancerade SELECT-satser

UNION-operatorn för att arbeta med datamängder kombinerar resultatuppsättningarna av två eller flera frågor och visar alla rader av alla frågor som en enda resultatuppsättning.

UNION tillhör klassen av operatorer för att arbeta med datamängder (uppsättningsoperatör). Andra sådana operatorer inkluderar INTERSECT och EXCERT (EXCERT och MINUS är funktionella motsvarigheter, men EXCERT är en del av ANSI-standarden Alla datamängdsoperatorer används för att samtidigt manipulera resultatuppsättningarna för två eller flera frågor, därav deras namn).

Syntax S0L2003

Det finns inga tekniska begränsningar för antalet frågor i UNION-operatören. Allmän syntax Nästa.

UNION

UNION

Nyckelord

UNION

Indikerar att resultatuppsättningarna kommer att slås samman till en enda resultatuppsättning. Dubblettrader tas bort som standard.

ALLT

Dubblettrader från alla resultatuppsättningar slås också samman.

DISTINKT

Dubblettrader tas bort från resultatuppsättningen. Kolumner som innehåller NULL-värden, anses vara dubbletter. (Om nyckelorden ALL och DISTINCT inte används är standardinställningen DISTINCT.)

Generella regler

Det finns bara en viktig regel Något att tänka på när du använder UNION-operatorn: ordningen, antalet och datatypen för kolumnerna måste vara identiska i alla frågor.

Datatyperna behöver inte vara identiska, men de måste vara kompatibla. Till exempel är typerna CHAR och VARCHAR kompatibla. Som standard använder den resulterande tsabor storleken på den största kompatibla typen, och i en fråga som kombinerar tre CHAR-kolumner - CHAR(5), CHAR(IO) och CHAR(12), kommer resultaten att vara i CHAR(12)-format , och i kolumner kommer mindre storlekar att lägga till ytterligare utrymmen.

Även om ANSI-standarden specificerar att INTERSECT-operatören har högre prioritet än andra set-operatörer, behandlas dessa operatörer på många plattformar som att de har samma prioritet. Du kan uttryckligen styra operatörsprioritet med parenteser. Annars kommer DBMS troligen att köra dem i ordning från vänster till höger.

DISTINCT-satsen kan (beroende på plattformen) ha en betydande prestandaoverhead eftersom det ofta kräver en extra passage genom resultatuppsättningen för att ta bort dubbletter av poster. ALL-satsen kan specificeras för att förbättra prestandan i alla fall där dubbletter inte förväntas (eller där dubbletter är acceptabla).

Enligt ANSI-standarden kan du bara använda en ORDER BY-sats i en fråga. Sätt det på slutet sista instruktionen VÄLJ. För att undvika oklarheter när du anger kolumner och tabeller, se till att ge alla kolumner i alla tabeller lämpliga alias. Men när kolumnnamn anges i en SELECT ... UNION-fråga används endast aliaset från den första frågan. Till exempel:

SELECT au_lname AS efternamn, au_fname AS förnamn FRÅN författare UNION SELECT emp_lname AS efternamn, emp_fname AS förnamn FRÅN anställda ORDER BY efternamn, förnamn;

Dessutom, eftersom UNION-operatörsfrågor kan innehålla kolumner med kompatibla datatyper, kan det finnas variationer i kodens beteende mellan plattformar, särskilt när det gäller längden på kolumnens datatyp. Om till exempel kolumnen au_fname i den första frågan är märkbart längre än kolumnen emplname i den andra frågan, olika plattformar kan tillämpa olika regler för att bestämma vilken längd som ska användas. Men i allmänhet väljer plattformar en längre (och mindre restriktiv) datatyp för resultatuppsättningen.

Varje RDBMS kan tillämpa sin egen egna regler Bestämma kolumnnamnet om kolumner i olika tabeller har olika namn. Vanligtvis används namnen från den första begäran.

DB2

DB2-plattformen stöder nyckelorden ANSI UNION och UNION ALL plus VALUES-satsen.

[, (uttryck-!, uttryck2, …)] […] […]

Låter dig ange en eller flera uppsättningar av manuellt definierade värden för poster i en kombinerad resultatuppsättning. Vart och ett av dessa värden måste innehålla exakt samma antal kolumner som UNION-operatörens frågor. Värderaderna i resultatuppsättningen separeras med kommatecken.

Även om UNION DISTINCT-satsen inte stöds, är den funktionella motsvarigheten UNION-satsen. CORRESPONDING-satsen stöds inte.

Datatyper som VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK och strukturtyper kan inte användas med nyckelordet UNION (men kan användas med UNION ALL-satsen).

Om alla tabeller använder samma kolumnnamn, använder resultatuppsättningen det namnet. Om kolumnnamnen är olika genererar DB2 ett nytt kolumnnamn. Kolumnen kan då inte användas i en ORDER BY-sats eller en FOR UPDATE-sats.

Om flera operatorer används på datamängder i en enda fråga, exekveras de inom parentes först. Uttrycken exekveras sedan i ordning från vänster till höger. Alla INTERSECT-operationer utförs dock före UNION- eller EXCEPT-operationerna. Till exempel:

SELECT empno FROM anställd WHERE workdept LIKE "E%" UNION SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001", (AB0002"), ("AC0003")

I det här exemplet får vi alla ID:n för de anställda från personaltabellen som finns på någon avdelning med ett namn som börjar med "E", samt ID:n för alla anställda från emp_act-redovisningstabellen som arbetar i projekten IF1000 ", "IF2000" och " AD3110". Dessutom ingår alltid medarbetar-ID:n "AA000T, "AB0002" och "AC00031" här.

MySQL

Stöds inte.

Orakel

Oracle-plattformen stöder ANSI SQL-standarden UNION och UNION ALL nyckelord. Syntaxen är som följer.

Oracle stöder inte CORRESPONDING-satsen. Det gör inte UNION DISTINCT-satsen. stöds, men den funktionella motsvarigheten är UNION-satsen. Oracle-plattformen stöder inte användningen av UNION ALL- och UNION-klausulerna i följande situationer.

Om den första frågan i satsen innehåller några uttryck i listan över element, alias kolumnen med AS-satsen. Dessutom kan bara den sista frågan i satsen innehålla en ORDER BY-sats. Du kan till exempel få alla unika butiks-ID:n (store_ids), utan dubbletter, med hjälp av följande fråga.

SELECT stor_id FROM butiker UNION SELECT stor_id FROM försäljning;

PostgreSQL

PostgreSQL-plattformen stöder UNION och UNION ALL nyckelord i standard ANSI-syntax.

instruktioner VÄLJ 2 UNION

PostgreSQL-plattformen stöder inte användningen av UNION och UNION ALL-klausuler i frågor med en FOR UPDATE-klausul. PostgreSQL stöder inte CORRESPONDING-satsen. UNION DISTINCT-satsen stöds inte. Den funktionella motsvarigheten är UNION-satsen.

Den första frågan i satsen kan inte innehålla ORDER BY- eller LIMIT-satser. Efterföljande frågor med satserna UNION och UNION ALL kan innehålla dessa satser, men sådana frågor måste omges inom parentes. Annars kommer ORDER BY eller LIMIT-klausulen till höger att gälla för hela operationen.

VÄLJ a.au_lname FRÅN författare SOM en WHERE a.au_lnanie LIKE "P%" UNI0N SELECT e.lname FROM anställda SOM e WHERE e.lname LIKE "P%";

SQL Server

SQL Server-plattformen stöder nyckelorden UNION och UNION ALL i standard ANSI-syntax.

SELECT 1 UNION-sats

SELECT 2 UNION-sats

SQL Server stöder inte CORRESPONDING-satsen. UNION DISTINCT-satsen stöds inte, men den funktionella motsvarigheten är UNION-satsen.

Med satserna UNION och UNION ALL kan du använda SELECT...INTO-satsen, men nyckelord INTO måste finnas i den första frågan från förbundsoperatören. Särskilda nyckelord som SELECT TOP och GROUP BY...WITH CUBE kan användas i alla anslutningsfrågor. Se dock till att inkludera dessa förslag i alla anslutningsförfrågningar. Om du använder satserna SELECT TOP eller GROUP BY... WITH CUBE i samma fråga, kommer operationen att misslyckas.

Alla frågor i en koppling måste innehålla samma antal kolumner. Kolumnernas datatyper behöver inte vara identiska, men de måste vara implicit castbara till varandra. Till exempel kan CHAR och VARCHAR kolumner användas tillsammans. Vid uttag SQL-data Servern använder storleken på den största kolumnen när datatypsstorleken fastställs för en resultatuppsättningskolumn. Således, om en SELECT... UNION-sats använder CHAR(5) och CHAR(IO) kolumner, kommer data från båda kolumnerna att matas ut i CHAR(IO) kolumnen. Numeriska datatyper gjuts och visas som typen med högsta precision.

Till exempel kombinerar följande fråga resultaten av två oberoende frågor med hjälp av GRUPP erbjudande AV ... MED KUB.

Det är dags att prata om att kombinera data med designmedel union Och fackligt alla, eftersom detta ibland är mycket användbart, och ibland är det omöjligt att göra utan att använda en sådan design. Vi kommer att skriva exempel i DBMS MSSQL 2008 använder SQL-språk.

Och jag skulle vilja börja med att du och jag redan har övervägt många exempel på skrivförfrågningar för SQL, till exempel, select-satsen för SQL-språk, eller användningen av SQL-strängfunktioner, betraktas också som programmering i både plpgsql och transact-sql, till exempel, Hur man skriver en funktion i PL/pgSQL och Transact-sql - Tabellfunktioner och tillfälliga tabeller respektive.

Jag angav ovanstående artiklar av en anledning, men jag angav dem för mer bättre förståelse och att lära sig dagens läxa, det är nödvändigt grundläggande kunskap(detta är en sida för nybörjare programmerare), som du kan få från ovan nämnda material.

Och så låt oss börja. Och först, låt oss titta på vilka dessa fackföreningar och alla operatörer är.

Vad är UNION och UNION ALL i SQL?

  • UNION- Det här SQL-sats för att kombinera resultatuppsättningen av flera frågor, och denna operatör visar endast unika rader i frågor, dvs. till exempel kombinerar du två frågor och var och en av dem innehåller samma data, med andra ord helt identiska, och fackoperatören kommer att kombinera dem till en rad så att det inte finns några dubbletter;
  • UNION ALLAär en SQL-operator för att kombinera den resulterande datamängden av flera frågor, men denna operator kommer att mata ut absolut alla rader, även dubbletter.

Förutsättningar för facket och förbundets alla operatörer

  1. Fältuppsättningen måste vara samma i alla förfrågningar, dvs. antalet fält i varje begäran som kommer att kombineras med facket eller fackets alla konstruktioner måste vara samma;
  2. Datatyper fält måste också matcha i varje begäran, dvs. till exempel om du vill skriva en fråga som innehåller typen data int och i den andra begäran är datatypen varchar, då kommer din begäran inte att exekveras och förfrågningsfönstret kommer att visa ett fel;
  3. Vid sortering, operatören sortera efter du kan bara specificera efter den senaste begäran.

Låt oss nu prata om när vi kan behöva använda dessa operatörer. Tja, till exempel, du har flera databaser med en liknande struktur, som var och en skapades, till exempel för en filial, och du måste kombinera dessa data för att tillhandahålla rapportering för alla filialer till ledningen, och det enklaste sättet att göra detta är att skriva frågor i SQL, som var och en kommer att få åtkomst till olika databaser, och använda unions- eller unionskonstruktionen för att kombinera dem. Ibland är det också nödvändigt att kombinera data i en databas på ett sådant sätt att detta inte kan uppnås med vanliga fackförbund och du måste använda ett fackförbund. Varför jag säger "måste" beror på att den här konstruktionen avsevärt ökar frågekörningstiden, om det till exempel finns mycket data och det inte finns något behov av att missbruka den.

Nog med teori, låt oss gå vidare till praktiken.

Notera! Som redan nämnts kommer vi att skriva förfrågningar till Management Studio för SQL Server 2008

Exempel på att använda fack och förbund alla

Låt oss först skapa två enkla bord test_table och test_table_2

SKAPA TABELL ( IDENTITET(1,1) INTE NULL, (18, 0) NULL, (50) NULL, BEGRÄNSNING PRIMÄRNYCKEL KLUSTERAD ( ASC) MED (PAD_INDEX = AV, STATISTICS_NORECOMPUTE = AV, IGNORE_DUP_KEY = AV_AV, LOCKLOCKLOCK_AV_, AVLÅT_ = ON) ON ) ON GO SET ANSI_PADDING OFF GO --och den andra tabellen SKAPA TABELL ( IDENTITET(1,1) INTE NULL, (18, 0) NULL, (50) NULL, BEGRÄNSNING PRIMÄRNYCKEL KLUSTERAD ( ASC) MED ( PAD_INDEX = AV, STATISTICS_NORECOMPUTE = AV, IGNORE_DUP_KEY = AV, ALLOW_ROW_LOCKS = PÅ, ALLOW_PAGE_LOCKS = PÅ) PÅ ) PÅ GÅ STÄLL IN ANSI_PADDING AV GÅ

De är till exempel samma, bara olika namn. Jag fyllde dem med följande data:

Låt oss nu skriva en fråga som kommer att kombinera de resulterande data till en, till exempel genom en fackförening. Syntaxen är väldigt enkel:

Request 1 union Request 2 union Request 3, etc.

Här är förfrågan:

Välj nummer, text från test_table union välj nummer, text från test_table_2

Som du kan se visades endast 5 rader, eftersom den första raden i den första begäran och den första raden i den andra begäran är desamma, så de kombinerades.

Låt oss nu förena oss via facket alla

Här är förfrågan:

Välj nummer, text från test_table union alla välj nummer, text från test_table_2

Alla rader har redan visats här, eftersom vi specificerade union all.

Låt oss nu titta på vilka fel det kan finnas även i detta enkel begäran. Till exempel blandade vi ihop sekvensen av fält:

Eller så angav vi ytterligare ett fält i den första begäran, men gjorde inte detta i den andra.

Också, till exempel, när du använder order by:

Här specificerade vi sortering i varje begäran, men det var nödvändigt endast i den sista, till exempel:

Välj nummer, text från test_table union alla välj nummer, text från test_table_2 ordna efter nummer

Och slutligen ville jag berätta om ett knep som kan användas när du till exempel fortfarande behöver visa ett fält i en begäran, men i andra finns det inte där eller så behövs det helt enkelt inte, för detta kan du skriva följande begäran:

Välj id, nummer, text från test_table union alla välj "", nummer, text från test_table_2

de där. Som du kan se, lägg helt enkelt fältet tomt där det ska vara och begäran kommer att fungera perfekt, till exempel:

Förmodligen allt jag ville berätta om designen förbund och förbund alla SQL-språk Jag sa, om du har frågor om att använda dessa operatörer, ställ dem i kommentarerna. Lycka till!

Jag har redan skrivit om. Och där var produktionen av en tabell beroende av innehållet i en annan. Men det är ibland nödvändigt när det krävs fullständigt oberoende av utdata från en tabell från en annan. Allt du vill är enkelt dra poster från flera tabeller samtidigt i en fråga, inte mer. Och för detta nyckelordet UNION används i SQL.

Låt oss reda ut det med dig SQL-fråga med UNION:

VÄLJ `inloggning`, `belopp` FRÅN `arbetsgivare` UNION VÄLJ `inloggning`, `amount` FROM `personal`;

Denna förfrågan kommer att returnera inloggningar och belopp på kontona för alla arbetsgivare och anställda på en viss webbplats. Det vill säga att data fanns i olika tabeller, men deras likhet gör det möjligt att visa dem omedelbart. Detta kommer förresten från bruksregeln UNION-frågor: Antalet och ordningen på fälten måste vara samma i alla delar av begäran.

Sådan UNION-delar det kan vara mycket, men det viktigaste Efter den senaste UNION måste du sätta ett semikolon.

En annan bra funktion UNIONär bristen på upprepning. Till exempel, om samma person finns bland både anställda och arbetsgivare, naturligtvis, med samma belopp på sitt konto, kommer han att vara med i urvalet inte 2 gånger utan bara 1, vilket vanligtvis är vad som krävs. Men om du fortfarande behöver upprepningar, så finns det UNION ALLA:

VÄLJ `inloggning`, `belopp` FRÅN `arbetsgivare` UNION ALLA VÄLJ `inloggning`, `belopp` FRÅN `personal`;

Så här en ganska enkel UNION-operator används i SQL-frågan, vilket förenklar proceduren för att mata ut från många tabeller av samma typ av data samtidigt, vilket i sin tur kommer att ha en mycket god effekt på prestandan.







2024 gtavrl.ru.