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

Gabung Alami SQL

Artikel ini memberikan ikhtisar tentang gabungan alami dalam SQL, serta beberapa contoh dasar.

Apa itu Gabung Alami?

SQL natural join adalah tipe equi-join yang secara implisit menggabungkan tabel berdasarkan kolom dengan nama dan tipe yang sama. Predikat join muncul secara implisit dengan membandingkan semua kolom pada kedua tabel yang memiliki nama kolom yang sama pada tabel join.

Kumpulan hasil hanya berisi satu kolom untuk setiap pasangan kolom dengan nama yang sama. Jika tidak ditemukan kolom dengan nama yang sama, hasilnya adalah gabungan silang.

Sintaks

Gabung alami dapat diterapkan ke INNER mana saja , LEFT , RIGHT , atau FULL Ikuti. Anda cukup mengawali tipe join dengan NATURAL kata kunci.

Contoh sintaks yang digunakan pada inner join:

SELECT *
FROM Table1 NATURAL INNER JOIN Table2 
ON Table1.Column = Table2.Column;

Melihat sebagai INNER adalah nilai default, Anda juga dapat melakukannya seperti ini:

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

NATURAL kata kunci menempatkan USING implicit implisit klausa untuk bergabung kendala. Ini membentuk USING list yang terdiri dari semua nama kolom yang muncul di kedua tabel input. Ini jelas hanya berlaku untuk DBMS yang mendukung USING klausa.

Tidak semua DBMS mendukung penggabungan alami, jadi periksa dokumentasi DBMS Anda.

Saat saya menulis ini, gabungan alami didukung di PostgreSQL, MySQL, MariaDB, SQLite, dan Oracle. Namun, gabungan alami tidak didukung di SQL Server (2019).

Contoh

Berikut adalah beberapa contoh untuk ditunjukkan.

Contoh Data

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

PetTypes tabel:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Pets tabel:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Owners tabel:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | 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       | Eastwood   | (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.

Contoh 1 – Penggabungan Batin Alami

Berikut adalah contoh melakukan inner join alami terhadap dua tabel tersebut.

SELECT 
    PetName,
    PetType
FROM Pets
NATURAL JOIN PetTypes;

Hasil:

 petname | pettype 
---------+---------
 Fluffy  | Cat
 Fetch   | Dog
 Scratch | Cat
 Wag     | Dog
 Tweet   | Bird
 Fluffy  | Dog
 Bark    | Dog
 Meow    | Cat
(8 rows)

Dalam contoh ini, gabungan alami secara implisit bergabung dengan tabel pada dua PetTypeId kolom (yaitu Pets.PetTypeId kolom, dan PetTypes.PetTypeId kolom).

Ini adalah cara implisit untuk melakukan hal berikut:

SELECT 
    PetName,
    PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);

Yang sebenarnya melakukan hal berikut.

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

Contoh 2 – Penggabungan Hak Alami

Berikut adalah contoh melakukan penggabungan kanan alami terhadap dua tabel tersebut. Kali ini kita harus menentukan tipe join, mengingat kita tidak menginginkan inner join (default).

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;

Hasil:

 petname | pettype 
---------+---------
 Fluffy  | Cat
 Fetch   | Dog
 Scratch | Cat
 Wag     | Dog
 Tweet   | Bird
 Fluffy  | Dog
 Bark    | Dog
 Meow    | Cat
         | Rabbit
(9 rows)

Dalam hal ini, sama saja dengan melakukan hal berikut:

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

Contoh 3 – Gabung Penuh Alami pada 3 Tabel

Berikut adalah contoh melakukan full join alami pada ketiga tabel.

SELECT 
    PetName,
    PetType,
    CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;

Hasil:

 petname | pettype |    petowner    
---------+---------+----------------
 Fluffy  | Cat     | Nancy Simpson
 Fetch   | Dog     | Nancy Simpson
 Scratch | Cat     | Bart Pitt
 Wag     | Dog     | Nancy Simpson
 Tweet   | Bird    | Homer Connery
 Fluffy  | Dog     | Boris Trump
 Bark    | Dog     | Bart Pitt
 Meow    | Cat     | Boris Trump
         |         | Woody Eastwood
         | Rabbit  |  
(10 rows)

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

Contoh 4 – Menggunakan Asterisk (* ) Karakter Wildcard

Berikut adalah contoh yang menggunakan karakter wildcard asterisk (*) untuk memilih semua kolom.

SELECT *
FROM Pets
NATURAL JOIN PetTypes;

Hasil:

 pettypeid | petid | ownerid | petname |    dob     | pettype 
-----------+-------+---------+---------+------------+---------
         2 |     1 |       3 | Fluffy  | 2020-11-20 | Cat
         3 |     2 |       3 | Fetch   | 2019-08-16 | Dog
         2 |     3 |       2 | Scratch | 2018-10-01 | Cat
         3 |     4 |       3 | Wag     | 2020-03-15 | Dog
         1 |     5 |       1 | Tweet   | 2020-11-28 | Bird
         3 |     6 |       4 | Fluffy  | 2020-09-17 | Dog
         3 |     7 |       2 | Bark    |            | Dog
         2 |     8 |       4 | Meow    |            | Cat
(8 rows)

Perhatikan bahwa pettypeid kolom hanya dikembalikan satu kali, meskipun ada dua kolom dengan nama itu (satu di setiap tabel). Beginilah cara natural join menangani kolom dengan nama yang sama di seluruh tabel.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabel Referensi SQL:Cara Membuat dan Menulis Query Dasar

  2. Melacak Pembaruan Otomatis ke Statistik

  3. Bagaimana cara menggunakan COUNT dalam SQL?

  4. Parameterisasi Sederhana dan Rencana Trivial — Bagian 2

  5. Apa itu ODBC?