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

Tutorial Bergabung SQL

Gabungan SQL adalah tempat Anda menjalankan kueri yang menggabungkan beberapa tabel.

Tutorial gabungan SQL ini menyajikan contoh dasar gabungan SQL, serta pengenalan berbagai jenis gabungan.

Jenis Gabung SQL

Standar ANSI SQL menetapkan lima jenis gabungan, seperti yang tercantum dalam tabel berikut.

Jenis Gabung Deskripsi

INNER JOIN
Mengembalikan baris ketika setidaknya ada satu baris di kedua tabel yang cocok dengan kondisi join.

LEFT OUTER JOIN
atau
LEFT JOIN
Mengembalikan baris yang memiliki data di tabel kiri (kiri dari JOIN kata kunci), meskipun tidak ada baris yang cocok di tabel kanan.

RIGHT OUTER JOIN
atau
RIGHT JOIN
Mengembalikan baris yang memiliki data di tabel kanan (kanan JOIN kata kunci), meskipun tidak ada baris yang cocok di tabel kiri.

FULL OUTER JOIN
atau
FULL JOIN
Mengembalikan semua baris, selama ada data yang cocok di salah satu tabel.
CROSS JOIN Mengembalikan baris yang menggabungkan setiap baris dari tabel pertama dengan setiap baris dari tabel kedua.

Ada juga istilah lain untuk berbagai operasi gabungan, seperti berikut:

Gabung Deskripsi
Gabung sendiri Saat sebuah tabel bergabung dengan dirinya sendiri.
Gabungan alami Gabungan implisit berdasarkan kolom umum dalam dua tabel yang digabungkan.
Bersama-sama Gabungan yang hanya berisi perbandingan kesetaraan dalam predikat gabungan.

SQL Bergabung dengan Sintaks

Gabungan dalam dapat ditentukan baik dalam FROM atau WHERE klausa. Gabungan luar dan Gabungan silang dapat ditentukan di FROM klausa saja.

Untuk membuat SQL, gabung di FROM klausa, lakukan sesuatu seperti ini:

SELECT *
FROM Table1 < JoinType > Table2 [ ON ( JoinCondition ) ]

Dimana JoinType menentukan jenis gabungan apa yang dilakukan, dan JoinCondition mendefinisikan predikat yang akan dievaluasi untuk setiap pasangan baris yang digabungkan.

Untuk menentukan bergabung di WHERE klausa, lakukan sesuatu seperti ini:

SELECT *
FROM Table1, Table2 [ WHERE ( JoinCondition ) ]

Sekali lagi, JoinCondition mendefinisikan predikat yang akan dievaluasi untuk setiap pasangan baris yang digabungkan.

Juga, semua yang diapit dalam tanda kurung siku ([] ) adalah opsional.

Tabel Contoh untuk Contoh dalam Tutorial ini

Sebagian besar contoh dalam tutorial ini melakukan penggabungan terhadap dua tabel berikut.

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)

Gabungan Batin

SQL INNER JOIN mengembalikan baris ketika setidaknya ada satu baris di kedua tabel yang cocok dengan kondisi gabungan.

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

Hasil:

-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Untuk menentukan gabungan dalam di FROM klausa, kami menggunakan INNER JOIN . Kami juga menggunakan ON kata kunci untuk menentukan predikat yang akan dievaluasi untuk setiap pasangan baris yang digabungkan.

Terlepas dari jenis gabungan, kami memenuhi syarat nama kolom kami dengan nama tabel. Alasan kami melakukan ini adalah untuk menghindari ambiguitas mengenai nama kolom di antara tabel. Kedua tabel dapat memiliki kolom dengan nama yang sama (seperti dalam contoh kami), dan dalam kasus seperti itu, DBMS tidak akan tahu kolom mana yang Anda maksud. Mengawali nama kolom dengan nama tabelnya memastikan bahwa Anda mereferensikan kolom yang benar, dan mencegah kesalahan apa pun yang dapat diakibatkan oleh ambiguitas tentang kolom mana yang Anda maksud.

Dalam contoh ini, kedua tabel memiliki PetTypeId kolom. Pets.PetTypeId kolom adalah kunci asing untuk PetTypes.PetTypeId kolom, yang merupakan kunci utama untuk tabel itu.

Dalam contoh ini, kita dapat melihat bahwa semua hewan peliharaan dikembalikan, tetapi tidak semua jenis hewan peliharaan dikembalikan. Tidak ada kelinci di Pets tabel, dan Rabbits jenis hewan peliharaan tidak dikembalikan.

Alasan Rabbits jenis tidak dikembalikan karena INNER JOIN hanya mengembalikan baris ketika setidaknya ada satu baris di kedua tabel yang cocok dengan kondisi gabungan. Dalam hal ini, Rabbits hanya dalam satu tabel (PetTypes tabel).

Perhatikan bahwa jenis gabungan adalah opsional. Oleh karena itu, sebagian besar (jika tidak semua) DBMS memungkinkan Anda untuk menghilangkan INNER kata kunci. Ketika Anda menghilangkan ini (yaitu hanya menentukan JOIN ), diasumsikan sebagai gabungan dalam.

Oleh karena itu, kita dapat menulis ulang contoh di atas menjadi ini:

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

Juga, seperti pernyataan SQL lainnya, FROM klausa dapat berada di satu baris utuh jika Anda mau:

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

Alias

Ini adalah praktik umum untuk menggunakan alias tabel saat melakukan gabungan SQL. Alias ​​​​membantu membuat kode lebih ringkas, dan lebih mudah dibaca.

Oleh karena itu, kita dapat mengubah contoh sebelumnya menjadi ini:

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

Hasil:

-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Equi-Gabung

Gabung di atas juga dapat disebut sebagai gabungan yang seimbang . Equi-join adalah join yang hanya berisi perbandingan kesetaraan dalam predikat join.

Cara lain penulisan join di atas adalah seperti ini:

SELECT
    p.PetName,
    pt.PetType
FROM 
    Pets p, 
    PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+

Ini adalah contoh menentukan gabungan dalam di WHERE ayat. Kami hanya menyediakan daftar tabel yang dipisahkan koma, dan kemudian WHERE kondisi. Jika kami menghilangkan WHERE kondisi, kami akan berakhir dengan CROSS JOIN .

Banyak pemula menemukan sintaks di atas jauh lebih mudah dipahami daripada INNER JOIN sintaksis. Jangan ragu untuk menggunakan sintaks ini jika Anda mau, namun, ketahuilah bahwa sebagian besar profesional SQL lebih suka menggunakan INNER JOIN sintaks dari contoh sebelumnya.

Lihat SQL Inner Join untuk contoh lainnya, termasuk inner join yang menggabungkan 3 tabel.

Gabung Yang Tepat

Juga dikenal sebagai RIGHT OUTER JOIN , RIGHT JOIN mengembalikan baris yang memiliki data di tabel kanan (kanan JOIN kata kunci), meskipun tidak ada baris yang cocok di tabel kiri.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Dalam hal ini, kami mendapat PetType tambahan nilai – Rabbits – meskipun tidak ada hewan peliharaan di Pets tabel jenis itu. Ini menghasilkan NULL nilai dalam PetName kolom melawan Rabbits .

Lihat SQL Right Join untuk contoh lainnya, termasuk right join yang menggabungkan 3 tabel.

Kiri Bergabung

Juga dikenal sebagai LEFT OUTER JOIN , SQL LEFT JOIN mengembalikan baris yang memiliki data di tabel kiri (kiri JOIN kata kunci), meskipun tidak ada baris yang cocok di tabel kanan.

Ini kebalikan dari RIGHT JOIN .

Jika kita mengubah contoh sebelumnya menggunakan gabungan kiri, kita mendapatkan hasil sebagai berikut.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Dalam kasus khusus ini, hasil kami sama dengan gabungan dalam.

Namun, jika kita menukar urutan tabel di FROM klausa, kita akan mendapatkan hasil yang mirip dengan join kanan pada contoh sebelumnya.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Jadi Anda dapat melihat bahwa perbedaan yang dihasilkan antara gabungan kiri dan kanan hanya bergantung pada cara Anda mengurutkan kolom di FROM klausa.

Lihat SQL Left Join untuk contoh lainnya, termasuk left join yang menggabungkan 3 tabel.

Gabung Penuh

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

Dengan kata lain, ini seperti menggabungkan kiri dan kanan dalam satu gabungan.

Ini contoh full join.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Ini mengembalikan hasil yang sama yang kita dapatkan dengan gabungan kanan, tetapi akan mengembalikan hasil yang berbeda jika ada baris di tabel kiri yang tidak memiliki nilai yang sesuai di tabel kanan.

Mari kita bertukar nama tabel dan menjalankannya lagi.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Hasil yang sama.

Lihat SQL Full Join untuk contoh lainnya, termasuk full join yang menggabungkan 3 tabel.

Salib Bergabung

SQL CROSS JOIN mengembalikan baris yang menggabungkan setiap baris dari tabel pertama dengan setiap baris dari tabel kedua.

Dengan kata lain, ini mengembalikan produk Cartesian dari baris dari tabel di gabungan.

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

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Seperti yang mungkin Anda bayangkan, ini bisa sangat berbahaya jika Anda menjalankannya pada tabel yang salah.

Ini sama dengan melakukan ini:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p, PetTypes pt;

Anda dapat menambahkan WHERE klausa ke gabungan silang, yang akan mengubahnya menjadi gabungan dalam.

Seperti ini:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Hasil:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Lihat SQL Cross Join untuk contoh lainnya.

Gabungan Alami

SQL NATURAL JOIN adalah jenis equi-join dimana 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.

SELECT 
    Pets.PetName,
    PetTypes.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)

Sebenarnya, gabungan alami sebenarnya bukan tipe gabungan, seperti yang dipertimbangkan oleh standar ANSI. Ini adalah kata kunci yang dapat Anda masukkan secara opsional untuk membuat gabungan menjadi gabungan alami.

Oleh karena itu, kita dapat mengubah contoh di atas menjadi NATURAL INNER JOIN jika kita ingin:

SELECT 
    Pets.PetName,
    PetTypes.PetType
FROM Pets NATURAL INNER JOIN PetTypes;

Seperti disebutkan sebelumnya, gabungan dalam adalah jenis gabungan default, jadi jika Anda menghilangkan jenis gabungan (misalnya, INNER , LEFT , RIGHT , dll), maka diperlakukan sebagai gabungan dalam.

Jika pemformatan hasil ini terlihat berbeda dari hasil sebelumnya, itu karena saya harus melompat ke PostgreSQL untuk menjalankan kueri ini. Saya menjalankan contoh sebelumnya di SQL Server, tetapi SQL Server tidak mendukung penggabungan alami.

Lihat SQL Natural Join untuk contoh lainnya, termasuk natural join yang menggabungkan 3 tabel.

Sendiri Bergabung

SQL SELF JOIN bergabung dengan tabel untuk dirinya sendiri.

Contoh klasik dari self join ada di tabel Employee. Dalam tabel seperti itu, satu karyawan mungkin melapor ke karyawan lain. Oleh karena itu, Anda dapat menggunakan self join untuk bergabung dengan tabel pada kolom ID karyawan dan kolom ID manajer.

Misalkan kita memiliki tabel berikut:

+--------------+-------------+------------+-------------+
| EmployeeId   | FirstName   | LastName   | ReportsTo   |
|--------------+-------------+------------+-------------|
| 1            | Homer       | Connery    | NULL        |
| 2            | Bart        | Pitt       | 1           |
| 3            | Maggie      | Griffin    | 1           |
| 4            | Peter       | Farnsworth | 2           |
| 5            | Marge       | Morrison   | NULL        |
| 6            | Lisa        | Batch      | 5           |
| 7            | Dave        | Zuckerberg | 6           |
| 8            | Vlad        | Cook       | 7           |
+--------------+-------------+------------+-------------+

Kita bisa melakukan self join di tabel ini untuk mengembalikan semua karyawan dan manajernya.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Hasil:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Homer Connery    |                 |
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Marge Morrison   |                 |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Lihat SQL Self Join untuk contoh lainnya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bekerja dengan Data Java di Alteryx

  2. Operator SQL IN untuk Pemula

  3. Buat Daftar Keren Sendiri, atau GitHub sebagai Notebook

  4. Cara menganalisis kesehatan indeks basis data

  5. ODBC 4.0