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

Slut dig til 3 tabeller i SQL

I SQL kan du forbinde tre tabeller eller flere ved at tilføje endnu en join efter den første.

Du kan også køre indlejrede joinforbindelser ved at angive én joinforbindelse som joinbetingelse for en anden.

Syntaks

Den mest almindelige måde at forbinde tre tabeller på er sådan her:

VÆLG *FRA Tabel1 INNER JOIN Tabel2 ON ConditionINNER JOIN Tabel3 ON Condition; 

Dette bruger en indre joinforbindelse, men du kan angive din ønskede jointype som med enhver anden joinforbindelse. Du kan også kombinere jointyper, hvis det kræves (eksempel nedenfor).

Du kan også bruge indlejrede joinforbindelser ved at angive én joinforbindelse som joinbetingelse for en anden joinforbindelse. Sådan:

VÆLG *FRA Tabel1 JOIN (Tabel2 JOIN Tabel3 ON Condition)ON Condition; 

Eksempeldata – De 3 tabeller

Antag, at vi har følgende tre tabeller.

Kunderne tabel:

+--------------+----------------+------------- --+----------------+| Kunde-id | Kundenavn | PostalCityId | Telefonnummer ||--------------+----------------+-------------- -+----------------|| 1 | Homer McKenzie | 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NULL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 |+-------------+----------------+-------- ------+----------------+(10 rækker påvirket)

Byer tabel:

+----------+----------------+------------------------ --+--------------------+| CityId | Bynavn | StateProvinceId | Befolkning ||--------+----------------+------------------------ +--------------------|| 3673 | Bow Mar | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gasport | 33 | 1248 || 21692 | Medicin Lodge | 17 | 2009 || 26483 | Peeples Valley | 3 | 428 || 33475 | Sylvanit | 27 | 103 || 17054 | Jessie | 35 | 25 || 19586 | Lisco | 28 | NULL || 37403 | Wimbledon | 35 | 216 |+----------+----------------+------------------------ +--------------+(9 rækker påvirket)

StateProvinces tabel:

+--------------------+---------------------+---- ------------------+-------------+--------------+| StateProvinceId | StateProvinceCode | StateProvinceName | CountryId | Befolkning ||--------------------+---------------------+----- --------------+-------------+-------------|| 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | NØ | Nebraska | 230 | 1943256 || 31 | NJ | New Jersey | 230 | 8899339 || 33 | NY | New York | 230 | 20437172 || 35 | ND | North Dakota | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 |+--------------------+------------------------+----- --------------+-------------+--------------+(8 rækker påvirket )

Eksempel 1 – Indre sammenføjning 3 tabeller

Den mest populære sammenføjningstype er den indre sammenføjning, så det starter vi med.

Her er et eksempel på at forbinde de ovenstående tre tabeller med to indre sammenføjninger.

SELECT s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINER JOIN Cities AS ciON ci.StateProvinceID =s.StateProvinceIDINNER JOIN Kunder cu ON cu.PostalCityId =ci.CityId; 

Resultat:

+---------------------+----------------+------- ----------+| StateProvinceName | Bynavn | Kundenavn ||---------------------+----------------+-------- --------|| Nebraska | Lisco | Homer McKenzie || Kansas | Medicin Lodge | Bart Pitt || New York | Gasport | Lisa McQueen || North Dakota | Jessie | Steve Simpson || Tennessee | Frankewing | Vinn Allen || Colorado | Bow Mar | Veejay Smith || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ----------+(7 rækker påvirket)

Eksempel 2 – Kombination af sammenføjningstyper

Du kan kombinere jointyper, når du forbinder tre eller flere borde.

Her er et eksempel på at kombinere en indre sammenføjning med en venstre sammenføjning.

SELECT s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces SINER JOIN Cities AS ciON ci.StateProvinceID =s.StateProvinceIDLEFT JOIN Kunder cu ON cu.PostalCityId =ci.CityId; 

Resultat:

---------------------+----------------+-------- --------+| StateProvinceName | Bynavn | Kundenavn ||---------------------+----------------+-------- --------|| Colorado | Bow Mar | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gasport | Lisa McQueen || Kansas | Medicin Lodge | Bart Pitt || Arizona | Peeples Valley | NULL || North Dakota | Jessie | Steve Simpson || Nebraska | Lisco | Homer McKenzie || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ----------+(8 rækker påvirket)

I dette tilfælde har vi en by (Peeples Valley), der endnu ikke har nogen kunder.

Grunden til, at vi nu kan se den information, er, at venstre join returnerer rækker, der har data i den venstre tabel, selvom der ikke er nogen matchende rækker i den venstre tabel.

Det forrige eksempel, der kombinerede to indre joinforbindelser, returnerede ikke denne række, fordi indre joinforbindelser kasserer umatchede rækker fra begge tabeller. Det returnerer kun rækker, når der er mindst én række i begge tabeller, der matcher sammenføjningsbetingelsen.

Nye prøvedata – 3 forskellige tabeller

Til de resterende eksempler bruger vi følgende tabeller.

PetTypes tabel:

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

Kæledyr 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 | 2020-09-17 || 7 | 3 | 2 | Bark | NULL || 8 | 2 | 4 | Mjav | NULL |+----------------------------- +------------+(8 rækker påvirket)

Ejere 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 Kæledyr 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 Kæledyr tabel er en fremmednøgle til OwnerId kolonne i Ejere tabel.

Eksempel 3 – Venstre sammenføjning af 3 tabeller

Lad os lave en tre-bords joinforbindelse ved at bruge to venstre joins.

Her er et eksempel på at køre to venstre joins mod disse borde.

SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwnerFROM Ejere o LEFT JOIN Pets p ON p.OwnerId =o.OwnerIdLEFT 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 |+-----------+------------+----------------+(9 rækker påvirket) 

Her har vi en kæledyrsejer, der ikke har et kæledyr. Vi kan bekræfte det ved at se på Pets.OwnerId kolonne, og ser, at der ikke er nogen værdi, der svarer til Woody Eastwoods OwnerId i Ejere tabel.

Eksempel 4 – Højresammenføjning af 3 tabeller

Højre join er det modsatte af venstre join. Her er et eksempel, der bruger de samme tre tabeller.

VÆLG p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SOM PetOwnerFROM Pets p RIGHT JOIN Ejere o PÅ p.OwnerId =o.OwnerIdRIGHT JOIN PetTypes pt ON s. PetTypeId =pt.PetTypeId; 

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 | |+-----------+-----------+---------------+(9 rækker påvirket)

Denne gang fik vi en ekstra kæledyrstype (Kanin ), men ikke den ekstra ejer. Dette skyldes, at højre forbinder returrækker, der har data i den højre tabel, selvom der ikke er nogen matchende rækker i den venstre tabel.

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

Eksempel 5 – 3 tabeller med fuld forening

Den fulde joinforbindelse er som at have en venstre og højre joinforbindelse i én. Det returnerer alle rækker, så længe der er matchende data i en af ​​tabellerne.

SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SOM PetOwnerFRA Ejere o FULD JOIN Pets p ON p.OwnerId =o.OwnerIdFULD 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 får vi en kombination af de resultater, vi fik i de to foregående eksempler.

Eksempel 6 – Indlejrede sammenføjninger

Som nævnt kan du også lave indlejrede joinforbindelser.

Her er et eksempel på en indlejret joinforbindelse.

SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwnerFROM Ejere o LEFT JOIN (Pets p LEFT JOIN PetTypes pt ON p.PetTypeId =pt.PetTypeId) ON p.OwnerId =o.OwnerId; 

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 |+-----------+------------+----------------+(9 rækker påvirket) 

  1. Kortlægning af lokale sikkerhedskontroller vs store cloud-udbydere – Version 4.0

  2. Ms-Access VBA Class Object Arrays

  3. Talk-dias:Partitioneringsforbedringer i PostgreSQL 11

  4. Hvordan udfører jeg en lagret procedure én gang for hver række, der returneres af forespørgsel?