Perbedaan terbesar adalah tidak di gabung vs tidak ada, itu (seperti yang tertulis), itu SELECT *
.
Pada contoh pertama, Anda mendapatkan semua kolom dari keduanya A
dan B
, sedangkan dalam contoh kedua, Anda hanya mendapatkan kolom dari A
.
Dalam SQL Server, varian kedua sedikit lebih cepat dalam contoh yang dibuat sangat sederhana:
Buat dua tabel sampel:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
Masukkan 10.000 baris ke setiap tabel:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
Hapus setiap baris ke-5 dari tabel kedua:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
Lakukan dua SELECT
varian pernyataan tes :
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
Rencana eksekusi:
Varian kedua tidak perlu melakukan operasi filter karena dapat menggunakan operator anti-semi join kiri.
WHERE A.idx NOT IN (...)
adalah tidak identik karena perilaku trivalen dariNULL
(yaituNULL
tidak sama denganNULL
(atau tidak sama), oleh karena itu jika Anda memiliki salahNULL
ditableB
Anda akan mendapatkan hasil yang tak terduga!)