Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Gabung Penuh SQL

Artikel ini memberikan gambaran umum tentang FULL JOIN dalam SQL, serta beberapa contoh dasar.

SQL FULL JOIN (atau FULL OUTER JOIN ) mengembalikan semua baris, selama ada data yang cocok di salah satu tabel.

Ini seperti memiliki kedua kiri kanan bergabung dalam satu gabungan.

Sintaks

Anda menentukan bergabung penuh di FROM ayat. Anda dapat menggunakan salah satu FULL JOIN atau FULL OUTER JOIN sintaks.

Menggunakan FULL JOIN sintaks:

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

Menggunakan FULL OUTER JOIN sintaks:

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

Keduanya melakukan hal yang persis sama. Hanya saja bagian OUTER kata kunci adalah opsional.

Contoh

Berikut adalah beberapa contoh untuk ditunjukkan.

Contoh Data

Pertama, berikut adalah tabel yang akan kita gunakan untuk contoh.

PetTypes tabel:

+-------------+------------+| PetTypeId | PetType ||-------------+------------|| 1 | Burung || 2 | Kucing || 3 | Anjing || 4 | Kelinci |+-------------+------------+(4 baris terpengaruh)

Pets tabel:

+---------+-------------+-----------+---------- --+------------+| ID Hewan Peliharaan | PetTypeId | ID Pemilik | Nama Hewan Peliharaan | DOB ||---------+-------------+-----------+----------- +------------|| 1 | 2 | 3 | Halus | 2020-11-20 || 2 | 3 | 3 | Ambil | 16-08-2019 || 3 | 2 | 2 | Gores | 01-10-2018 || 4 | 3 | 3 | goyang | 15-03-2020 || 5 | 1 | 1 | Tweet | 28-11-2020 || 6 | 3 | 4 | Halus | 17-09-2020 || 7 | 3 | 2 | Kulit | NULL || 8 | 2 | 4 | meong | NULL |+---------+-------------+-----------+----------- +------------+(8 baris terpengaruh)

Owners tabel:

+-----------+-------------+------------+------- ---------+-------------------+| ID Pemilik | Nama Depan | Nama Belakang | Telepon | Email ||-----------+-------------+------------+-------- --------+-------------------|| 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 | Kayu Timur | (308) 555-0112 | [email protected] |+------------+-------------+------------+---- ------------+-------------------+

Perhatikan bahwa:

  • PetTypeId kolom Pets tabel adalah kunci asing dari PetTypeId dari PetTypes tabel (yang merupakan kunci utama dari tabel tersebut).
  • OwnerId kolom Pets tabel adalah kunci asing dari OwnerId kolom Owners meja.

Kueri Gabung Lengkap

Berikut adalah contoh melakukan penggabungan penuh terhadap dua tabel tersebut.

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

Hasil:

+-----------+-----------+| Nama Hewan Peliharaan | PetType ||-----------+------------|| Tweet | Burung || Halus | Kucing || Gores | Kucing || meong | Kucing || Ambil | Anjing || goyang | Anjing || Halus | Anjing || Kulit | Anjing || NULL | Kelinci |+------------+------------+(9 baris terpengaruh)

Dalam contoh ini, kita mendapatkan PetType nilai yang tidak sesuai dengan PetName . Ini karena tidak ada kelinci sebagai hewan peliharaan. Tetapi penggabungan penuh menyebabkan Rabbit untuk dikembalikan, meskipun tidak ada hewan peliharaan di Pets tabel jenis itu. Ini menghasilkan NULL nilai dalam PetName kolom melawan Rabbit .

Ini adalah hasil yang sama yang akan kita dapatkan jika kita menggunakan gabungan yang benar, karena PetTypes tabel berada di sebelah kanan JOIN kata kunci. Ini tidak akan terjadi dengan gabungan kiri, karena PetTypes tabel tidak berada di sebelah kiri JOIN kata kunci. Jika kita ingin membuatnya kembali dengan gabungan kiri, kita harus mengubah urutan tabel, sehingga PetTypes tabel berada di sebelah kiri JOIN kata kunci.

Inilah yang terjadi jika kita mengganti urutan tabel dalam kueri kita saat menggunakan gabungan penuh.

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

Hasil:

+-----------+-----------+| Nama Hewan Peliharaan | PetType ||-----------+------------|| Tweet | Burung || Halus | Kucing || Gores | Kucing || meong | Kucing || Ambil | Anjing || goyang | Anjing || Halus | Anjing || Kulit | Anjing || NULL | Kelinci |+------------+------------+(9 baris terpengaruh)

Kami mendapatkan hasil yang sama persis. Ini karena full join mengembalikan semua baris, selama ada data yang cocok di salah satu tabel. Seperti yang disebutkan, ini seperti memiliki gabungan kiri dan kanan dalam satu gabungan.

Gabung Penuh pada 3 Tabel

Berikut adalah contoh melakukan full join pada ketiga tabel.

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; 

Hasil:

+-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Tweet | Burung | Homer Connery || Gores | Kucing | Bart Pitt || Kulit | Anjing | Bart Pitt || Halus | Kucing | Nancy Simpson || Ambil | Anjing | Nancy Simpson || goyang | Anjing | Nancy Simpson || Halus | Anjing | Boris Trump || meong | Kucing | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kelinci | |+-----------+-----------+----------------+(10 baris terpengaruh) 

Kali ini kami memiliki pemilik hewan peliharaan yang tidak memiliki hewan peliharaan, serta jenis hewan peliharaan yang tidak ditetapkan untuk hewan peliharaan.

Jika kita mengacak urutan tabel, kita mendapatkan hasil yang sama, meskipun baris terdaftar dalam urutan yang berbeda.

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; 

Hasil:

-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Tweet | Burung | Homer Connery || Halus | Kucing | Nancy Simpson || Gores | Kucing | Bart Pitt || meong | Kucing | Boris Trump || Ambil | Anjing | Nancy Simpson || goyang | Anjing | Nancy Simpson || Halus | Anjing | Boris Trump || Kulit | Anjing | Bart Pitt || NULL | Kelinci | || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(10 baris terpengaruh) 

Dan jika kita mengacaknya sekali lagi, kita masih mendapatkan hasil yang sama.

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; 

Hasil:

+-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Halus | Kucing | Nancy Simpson || Ambil | Anjing | Nancy Simpson || Gores | Kucing | Bart Pitt || goyang | Anjing | Nancy Simpson || Tweet | Burung | Homer Connery || Halus | Anjing | Boris Trump || Kulit | Anjing | Bart Pitt || meong | Kucing | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kelinci | |+-----------+-----------+----------------+(10 baris terpengaruh) 

Jika Anda bertanya-tanya mengapa PetOwner terakhir bukan NULL (seperti terakhir PetName is), itu karena ini adalah hasil dari rangkaian string. Saya menggunakan T-SQL CONCAT() berfungsi untuk menggabungkan nama depan dan belakang pemilik.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tips untuk Baca/Tulis Kunci Tergantung pada Tingkat Isolasi Transaksi di MSSQL

  2. Kiat untuk Menyimpan Cadangan TimescaleDB Anda di Cloud

  3. Bekerja dengan JavaFX Chart API

  4. Pengujian Beban Jaringan Menggunakan iPerf

  5. Slide dan sampel persimpangan SQL