SQL JOIN adalah klausa yang digunakan untuk menggabungkan beberapa tabel dan mengambil data berdasarkan bidang umum dalam database relasional. Profesional basis data menggunakan normalisasi untuk memastikan dan meningkatkan integritas data. Dalam berbagai bentuk normalisasi, data didistribusikan ke dalam beberapa tabel logis. Tabel ini menggunakan batasan referensial – kunci utama dan kunci asing – untuk menerapkan integritas data dalam tabel SQL Server. Pada gambar di bawah ini, kita melihat sekilas proses normalisasi database.
Memahami berbagai jenis SQL JOIN
SQL JOIN menghasilkan data yang berarti dengan menggabungkan beberapa tabel relasional. Tabel-tabel ini terkait menggunakan kunci dan memiliki hubungan satu-ke-satu atau satu-ke-banyak. Untuk mengambil data yang benar, Anda harus mengetahui persyaratan data dan mekanisme bergabung yang benar. SQL Server mendukung beberapa gabungan dan setiap metode memiliki cara khusus untuk mengambil data dari beberapa tabel. Gambar di bawah menentukan gabungan SQL Server yang didukung.
Gabungan dalam SQL
Gabungan dalam SQL mencakup baris dari tabel di mana kondisi bergabung terpenuhi. Misalnya, dalam diagram Venn di bawah ini, gabungan dalam mengembalikan baris yang cocok dari Tabel A dan Tabel B.
Pada contoh di bawah ini, perhatikan hal-hal berikut:
- Kami memiliki dua tabel – [Karyawan] dan [Alamat].
- Kueri SQL digabungkan pada kolom [Karyawan].[EmpID] dan [Alamat].[ID].
Output kueri mengembalikan catatan karyawan untuk EmpID yang ada di kedua tabel.
Gabungan dalam mengembalikan baris yang cocok dari kedua tabel; oleh karena itu, ini juga dikenal sebagai Equi join. Jika kita tidak menentukan kata kunci dalam, SQL Server melakukan operasi gabung dalam.
Pada tipe inner join lainnya, theta join, kita tidak menggunakan operator persamaan (=) pada klausa ON. Sebagai gantinya, kami menggunakan operator non-kesetaraan seperti
PILIH * DARI Tabel1 T1, Tabel2 T2 DI MANA T1.Harga
Dalam self-join, SQL Server menggabungkan tabel dengan dirinya sendiri. Ini berarti nama tabel muncul dua kali dalam klausa from.
Di bawah ini, kami memiliki tabel [Emp] yang memiliki data karyawan dan manajer mereka. Self-join berguna untuk menanyakan data hierarkis. Misalnya, di tabel karyawan, kita dapat menggunakan self-join untuk mempelajari nama setiap karyawan dan manajer pelaporannya.
Kueri di atas menempatkan self-join pada tabel [Emp]. Ini menggabungkan kolom EmpMgrID dengan kolom EmpID dan mengembalikan baris yang cocok.
Dalam gabungan silang, SQL Server mengembalikan produk Cartesian dari kedua tabel. Misalnya, pada gambar di bawah, kami melakukan cross-join untuk tabel A dan B.
Cross join menghubungkan setiap baris dari tabel A ke setiap baris yang tersedia pada tabel B. Oleh karena itu, outputnya juga dikenal sebagai produk Cartesian dari kedua tabel. Pada gambar di bawah, perhatikan hal berikut:
Pada output cross-join, baris 1 tabel [Employee] bergabung dengan semua baris tabel [Address] dan mengikuti pola yang sama untuk baris yang tersisa.
Jika tabel pertama memiliki x jumlah baris dan tabel kedua memiliki n jumlah baris, cross join memberikan x*n jumlah baris pada output. Anda harus menghindari penggabungan silang pada tabel yang lebih besar karena dapat mengembalikan sejumlah besar catatan dan SQL Server membutuhkan banyak daya komputasi (CPU, memori, dan IO) untuk menangani data yang begitu luas.
Seperti yang kami jelaskan sebelumnya, gabungan dalam mengembalikan baris yang cocok dari kedua tabel. Saat menggunakan gabungan luar SQL, itu tidak hanya mencantumkan baris yang cocok, tetapi juga mengembalikan baris yang tidak cocok dari tabel lain. Baris yang tidak cocok bergantung pada kata kunci kiri, kanan, atau lengkap.
Gambar di bawah menjelaskan pada tingkat tinggi gabungan luar kiri, kanan dan penuh.
Gabung luar kiri SQL mengembalikan baris yang cocok dari kedua tabel bersama dengan baris yang tidak cocok dari tabel kiri. Jika record dari tabel kiri tidak memiliki baris yang cocok di tabel kanan, record dengan nilai NULL akan ditampilkan.
Pada contoh di bawah, gabungan luar kiri mengembalikan baris berikut:
Gabung luar kanan SQL mengembalikan baris yang cocok dari kedua tabel bersama dengan baris yang tidak cocok dari tabel kanan. Jika record dari tabel kanan tidak memiliki baris yang cocok di tabel kiri, record dengan nilai NULL akan ditampilkan.
Pada contoh di bawah ini, kita memiliki baris output berikut:
Gabung luar penuh mengembalikan baris berikut dalam output:
Dalam contoh sebelumnya, kami menggunakan dua tabel dalam kueri SQL untuk melakukan operasi gabungan. Sebagian besar, kami menggabungkan beberapa tabel dan mengembalikan data yang relevan.
Kueri di bawah ini menggunakan beberapa gabungan dalam.
Mari kita menganalisis kueri dalam langkah-langkah berikut:
Setelah Anda menjalankan kueri dengan beberapa gabungan, pengoptimal kueri menyiapkan rencana eksekusi. Ini menyiapkan rencana eksekusi yang dioptimalkan biaya yang memenuhi kondisi gabungan dengan penggunaan sumber daya—misalnya, dalam rencana eksekusi aktual di bawah ini, kita dapat melihat beberapa loop bersarang (gabung dalam) dan pencocokan hash (gabung dalam) yang menggabungkan data dari beberapa tabel gabungan .
Misalkan kita memiliki nilai NULL di kolom tabel, dan kita menggabungkan tabel pada kolom tersebut. Apakah SQL Server cocok dengan nilai NULL?
Nilai NULL tidak cocok satu sama lain. Oleh karena itu, SQL Server tidak dapat mengembalikan baris yang cocok. Dalam contoh di bawah ini, kami memiliki NULL di kolom EmpID dari tabel [Karyawan]. Oleh karena itu, dalam output, ia mengembalikan baris yang cocok untuk [EmpID] 2 saja.
Kita bisa mendapatkan baris NULL ini di output jika terjadi gabungan luar SQL karena ia juga mengembalikan baris yang tidak cocok.
Pada artikel ini, kami menjelajahi berbagai jenis gabungan SQL. Berikut adalah beberapa praktik terbaik yang penting untuk diingat dan diterapkan saat menggunakan gabungan SQL.SQL self-join
gabungan silang SQL
Gabungan luar SQL
Gabung luar kiri
Gabung luar kanan
Gabungan luar penuh
SQL bergabung dengan beberapa tabel
USE [AdventureWorks2019]
GO
SELECT
e.[BusinessEntityID]
,p.[FirstName]
,p.[MiddleName]
,p.[LastName]
,e.[JobTitle]
,d.[Name] AS [Department]
,d.[GroupName]
,edh.[StartDate]
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh
ON e.[BusinessEntityID] = edh.[BusinessEntityID]
INNER JOIN [HumanResources].[Department] d
ON edh.[DepartmentID] = d.[DepartmentID]
WHERE edh.EndDate IS NULL
GO
Nilai NULL dan SQL bergabung
SQL bergabung dengan praktik terbaik