Belajar dengan membaca secara berurutan

Penggabungan Tabel (1) — INNER JOIN dan Alias

Pelajari INNER JOIN SQL dari dasar: alias tabel, ON dan USING, menggabungkan beberapa tabel — dengan praktik pada data karyawan dan departemen, langsung di browser kamu.

Data yang dipakai di artikel ini — department dan employee

Sejauh ini kamu sudah bekerja dengan satu tabel pada satu waktu, tetapi data di dunia nyata terbagi ke beberapa tabel. Nama dan gaji karyawan ada di tabel employee, nama dan lokasi departemen ada di tabel department — desain yang lazim membagi data berdasarkan peran dan menautkannya dengan employee.dept_id yang menunjuk ke department ("kolom yang menunjuk ke baris di tabel lain" ini disebut foreign key).

Di artikel ini kamu akan mempelajari INNER JOIN, bentuk paling dasar dari JOIN yang menggabungkan dua tabel terpisah menjadi satu hasil. Materinya adalah tabel department (6 departemen) dan tabel employee (30 karyawan). Lewat sebuah latihan yang membangun daftar yang menampilkan nama departemen tiap karyawan, kamu akan mencoba alias tabel, ON, dan USING secara berurutan.

Sebelum terjun ke latihan, lihat dulu definisi kolom dan data contoh dari dua tabel yang dipakai artikel ini — department dan employee.

① Jalankan PRAGMA table_info(department); dan PRAGMA table_info(employee); untuk memeriksa definisi kolom kedua tabel.

② Jalankan SELECT * FROM department LIMIT 5; dan SELECT * FROM employee LIMIT 5; untuk melihat pratinjau 5 baris pertama. Perhatikan bahwa beberapa baris di employee memiliki NULL pada kolom dept_id.

SQL Editor

Jalankan query untuk melihat hasil

INNER JOIN — menghubungkan dua tabel dengan kondisi penggabungan

Tabel employee hanya menyimpan dept_id (nomor departemen). Saat kamu ingin daftar karyawan juga menampilkan nama departemen, kamu mengambil baris-baris di mana employee.dept_id dan department.dept_id cocok, menjajarkannya bersisian, lalu menggabungkannya menjadi satu baris. Inilah JOIN, dan yang paling dasar adalah INNER JOIN (INNER = penggabungan dalam).

Bentuknya adalah SELECT kolom FROM tabel_kiri JOIN tabel_kanan ON kondisi_penggabungan. JOIN adalah singkatan dari INNER JOIN — keduanya berperilaku sama. Pada ON kamu menulis kondisi penggabungan, yang menyatakan "jika kolom mana cocok dengan kolom mana, perlakukan baris-baris ini sebagai baris yang sama". INNER JOIN hanya menyimpan baris yang cocok di kedua tabel; baris tanpa pasangan di salah satu sisi hilang dari hasil.

INNER JOIN — hanya baris yang cocok bertahan
employeecocok di ONdepartmentAlice dept_id=11 = 11 EngineeringIvan dept_id=NULLtidak cocokdikeluarkan5 Legal(tanpa karyawan)tidak cocokdikeluarkandikecualikandikecualikan
Baris di mana employee.dept_id dan department.dept_id cocok dijajarkan bersisian. Baris tanpa pasangan (karyawan yang dept_id-nya NULL, departemen tanpa karyawan) dikeluarkan dari hasil INNER JOIN.
-- Tampilkan dept_name di samping setiap karyawan (INNER JOIN)
SELECT employee.name, employee.salary, department.dept_name
FROM employee
JOIN department
  ON employee.dept_id = department.dept_id;

Bayangkan sebuah kebutuhan: "membangun tabel untuk daftar karyawan dengan nomor karyawan, nama, dan nama departemen tempat mereka bernaung". (Jalankan dengan benar dan penjelasan akan muncul.)

INNER JOIN tabel employee dan tabel department. Kondisi penggabungannya adalah dept_id cocok di kedua tabel.

② Ambil tiga kolom: emp_id dan name dari employee, dan dept_name dari department.

③ Urutkan hasil berdasarkan emp_id menaik.

SQL Editor

Jalankan query untuk melihat hasil

Alias tabel — menulis nama tabel yang panjang menjadi pendek

Menulis nama tabel setiap kali, seperti pada employee.name atau department.dept_name, membuat kueri menjadi panjang. Jika kamu menaruh alias setelah nama tabel, seperti pada FROM employee e, sejak itu kamu bisa merujuknya dengan nama pendek seperti e.name. Menulisnya dengan AS, seperti FROM employee AS e, artinya sama.

Alias juga menjadi perlu untuk self-join (memakai tabel yang sama dua kali, dibahas di artikel berikutnya) dan untuk memberi nama hasil dalam subkueri. Di artikel ini kita akan menulis employee sebagai e dan department sebagai d.

Menulis pendek dengan alias tabel
tambah aliasrujuk pendekFROM employee ee.nameJOIN department dd.dept_name
Saat kamu memberi alias pada tabel di klausa FROM, kamu bisa merujuknya dengan nama pendek di klausa SELECT dan ON. Langsung jelas sebuah kolom milik tabel mana, dan kueri lebih mudah dibaca.
-- Beri alias employee sebagai e dan department sebagai d
SELECT e.name, e.city, d.dept_name, d.location
FROM employee e
JOIN department d
  ON e.dept_id = d.dept_id;

Bayangkan sebuah kebutuhan: "menampilkan hanya nama karyawan di departemen Engineering, beserta lokasi departemen tersebut".

① INNER JOIN employee dengan alias e dan department dengan alias d. Kondisi penggabungannya adalah dept_id cocok.

② Persempit ke baris di mana dept_name adalah Engineering.

③ Ambil dua kolom — name dari e dan location dari d — diurutkan berdasarkan name menaik.

SQL Editor

Jalankan query untuk melihat hasil

USING — bentuk ringkas saat nama kolom penggabungan sama

employee dan department digabungkan pada nama kolom yang sama, `dept_id`, di kedua tabel. Saat nama kolom yang dipakai untuk penggabungan persis sama di kedua tabel seperti ini, kamu bisa menulis USING (dept_id) alih-alih ON e.dept_id = d.dept_id.

USING (nama_kolom) artinya sama dengan ON kiri.nama_kolom = kanan.nama_kolom, dan lebih pendek karena kamu hanya menulis kolom penggabungan sekali. Selain itu, kolom yang digabungkan dengan USING muncul hanya sekali di hasil, dan kamu bisa merujuknya langsung dengan SELECT dept_id (tanpa nama tabel). Saat nama kolom berbeda (misalnya e.dept_id dan d.id), kamu tidak bisa memakai USING — kamu memakai ON.

Bagaimana ON dan USING bersesuaian
tulis dengan ONtulis dengan USINGnama berbedae.dept_id = d.idtidak bisa(pakai ON)nama samae.dept_id = d.dept_idUSING (dept_id)
Jika nama kolom penggabungan sama di kedua tabel (dept_id), kamu bisa menulis USING (dept_id) alih-alih ON. Saat nama kolom berbeda, gunakan ON.
-- Tulis makna yang sama dengan ON e.dept_id = d.dept_id memakai USING
SELECT e.name, dept_id, d.dept_name
FROM employee e
JOIN department d
  USING (dept_id);

Bayangkan sebuah kebutuhan: "dari seluruh karyawan, ambil 5 teratas berdasarkan gaji dan daftarkan nama, nama departemen, dan gaji mereka".

① Gabungkan employee (alias e) dan department (alias d) dengan klausa `USING`. Kolom penggabungannya adalah dept_id, yang umum bagi kedua tabel.

② Ambil tiga kolom: name dari e, dept_name dari d, dan salary dari e.

③ Urutkan berdasarkan salary menurun dan persempit ke 5 baris pertama.

SQL Editor

Jalankan query untuk melihat hasil

INNER JOIN membuang baris yang hanya ada di satu sisi

INNER JOIN mengembalikan hanya baris di mana kondisi penggabungan cocok di kedua tabel. 4 orang yang dept_id-nya NULL (Ivan, Quinn, Xander, Brian) dan departemen Legal yang sama sekali tidak punya karyawan tidak punya pasangan penggabungan, jadi mereka tidak muncul di hasil. "Aku mau semua karyawan tapi hanya 26 baris yang kembali" dalam kebanyakan kasus disebabkan oleh perilaku ini. Saat kamu ingin menyimpan juga baris yang hanya ada di satu sisi, gunakan OUTER JOIN yang dibahas di artikel berikutnya.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Baris mana yang termasuk dalam hasil INNER JOIN?

Soal 2Pada FROM employee e JOIN department d ON e.dept_id = d.dept_id, apa itu e dan d?

Soal 3Kapan kamu bisa menulis ulang ON e.dept_id = d.dept_id menjadi USING (dept_id)?