sql >> Database teknologi >  >> RDS >> Database

SQL fuld tilslutning

Denne artikel giver et overblik over FULL JOIN i SQL, samt nogle grundlæggende eksempler.

SQL'en FULL JOIN (eller FULL OUTER JOIN ) returnerer alle rækker, så længe der er matchende data i en af ​​tabellerne.

Det er som at have begge en venstre højre join i én join.

Syntaks

Du angiver en fuld deltagelse i FROM klausul. Du kan bruge enten FULL JOIN eller FULL OUTER JOIN syntaks.

Brug af FULL JOIN syntaks:

SELECT *
FROM Table1 FULL JOIN Table2 
ON Table1.Column = Table2.Column; 

Brug af FULL OUTER JOIN syntaks:

SELECT *
FROM Table1 FULL OUTER JOIN Table2 
ON Table1.Column = Table2.Column; 

Begge disse gør nøjagtig det samme. Det er bare, at OUTER søgeord er valgfrit.

Eksempler

Her er nogle eksempler til demonstration.

Eksempel på data

For det første er her de tabeller, vi skal bruge til eksemplerne.

PetTypes tabel:

+-------------+------------+| PetTypeId | PetType ||-------------+---------|| 1 | Fugl || 2 | Kat || 3 | Hund || 4 | Kanin |+-------------+------------+(4 rækker påvirket)

Pets tabel:

+---------+----------------------- -+------------+| PetId | PetTypeId | OwnerId | Kæledyrsnavn | DOB ||--------+------------------------ +------------|| 1 | 2 | 3 | Fluffy | 20-11-2020 || 2 | 3 | 3 | Hent | 2019-08-16 || 3 | 2 | 2 | Ridse | 2018-10-01 || 4 | 3 | 3 | Wag | 15-03-2020 || 5 | 1 | 1 | Tweet | 28-11-2020 || 6 | 3 | 4 | Fluffy | 17-09-2020 || 7 | 3 | 2 | Bark | NULL || 8 | 2 | 4 | Mjav | NULL |+----------------------------- +------------+(8 rækker påvirket)

Owners tabel:

+-------+-----------------+------ ----------+---------------------------+| OwnerId | Fornavn | Efternavn | telefon | E-mail ||------------------------------------------- -----------------------|| 1 | Homer | Connery | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Woody | Eastwood | (308) 555-0112 | [email protected] |+------------+-------+------------+---- ------------+---------------------------+

Bemærk at:

  • PetTypeId kolonne i Pets tabel er en fremmednøgle til PetTypeId af PetTypes tabel (som er den primære nøgle til den pågældende tabel).
  • OwnerId kolonne i Pets tabel er en fremmednøgle til OwnerId kolonne i Owners tabel.

Fuld tilmeldingsforespørgsel

Her er et eksempel på at udføre en fuld join mod to af disse borde.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId; 

Resultat:

+-------+------------+| Kæledyrsnavn | PetType ||-----------+--------|| Tweet | Fugl || Fluffy | Kat || Ridse | Kat || Mjav | Kat || Hent | Hund || Wag | Hund || Fluffy | Hund || Bark | Hund || NULL | Kanin |+-----------+-----------+(9 rækker påvirket)

I dette eksempel får vi en PetType værdi, der ikke svarer til et PetName . Dette skyldes, at der ikke er kaniner som kæledyr. Men den fulde join forårsager Rabbit skal returneres, selvom der ikke er noget kæledyr i Pets bord af den type. Dette resulterer i en NULL værdi i PetName kolonne mod Rabbit .

Dette er det samme resultat, som vi ville have fået, hvis vi havde brugt en rigtig joinforbindelse, fordi PetTypes tabellen er til højre for JOIN søgeord. Dette ville ikke være sket med en venstre join, fordi PetTypes tabellen er ikke til venstre for JOIN søgeord. Hvis vi ville genskabe det med en venstre join, skulle vi ændre rækkefølgen af ​​tabellerne, så PetTypes tabellen var til venstre for JOIN søgeord.

Her er, hvad der sker, hvis vi ændrer bordrækkefølgen i vores forespørgsel, når vi bruger en fuld joinforbindelse.

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId; 

Resultat:

+-------+------------+| Kæledyrsnavn | PetType ||-----------+--------|| Tweet | Fugl || Fluffy | Kat || Ridse | Kat || Mjav | Kat || Hent | Hund || Wag | Hund || Fluffy | Hund || Bark | Hund || NULL | Kanin |+-----------+-----------+(9 rækker påvirket)

Vi får præcis det samme resultat. Dette skyldes, at den fulde join returnerer alle rækker, så længe der er matchende data i en af ​​tabellerne. Som nævnt er det som at have en venstre og højre joinforbindelse i én join.

Fuld tilslutning på 3 borde

Her er et eksempel på at udføre en fuld join på alle tre borde.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Resultat:

+-------+------------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fugl | Homer Connery || Ridse | Kat | Bart Pitt || Bark | Hund | Bart Pitt || Fluffy | Kat | Nancy Simpson || Hent | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffy | Hund | Boris Trump || Mjav | Kat | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kanin | |+-----------+-----------+----------------+(10 rækker påvirket) 

Denne gang har vi en kæledyrsejer, der ikke har et kæledyr, samt en kæledyrstype, der ikke er tildelt et kæledyr.

Hvis vi blander rækkefølgen af ​​bordene rundt, får vi det samme resultat, selvom rækkerne er anført i en anden rækkefølge.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM PetTypes pt FULL JOIN Pets p
    ON p.PetTypeId = pt.PetTypeId
FULL JOIN Owners o 
    ON p.OwnerId = o.OwnerId; 

Resultat:

-----------+-----------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fugl | Homer Connery || Fluffy | Kat | Nancy Simpson || Ridse | Kat | Bart Pitt || Mjav | Kat | Boris Trump || Hent | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffy | Hund | Boris Trump || Bark | Hund | Bart Pitt || NULL | Kanin | || NULL | NULL | Woody Eastwood |+-----------+------------+----------------+(10 rækker påvirket) 

Og hvis vi blander dem igen, får vi stadig det samme resultat.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p FULL JOIN Owners o
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Resultat:

+-------+------------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Fluffy | Kat | Nancy Simpson || Hent | Hund | Nancy Simpson || Ridse | Kat | Bart Pitt || Wag | Hund | Nancy Simpson || Tweet | Fugl | Homer Connery || Fluffy | Hund | Boris Trump || Bark | Hund | Bart Pitt || Mjav | Kat | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kanin | |+-----------+-----------+----------------+(10 rækker påvirket) 

Hvis du undrer dig over, hvorfor den sidste PetOwner er ikke NULL (som sidst PetName er), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQL CONCAT() funktion til at sammenkæde ejerens for- og efternavn.


  1. Konverter heltal til hex og hex til heltal

  2. Læsning af en database fra aktivmappen

  3. En guide til MySQL-indekser

  4. Dvalebrug af PostgreSQL-sekvens påvirker ikke sekvenstabellen