Membandingkan Baris dalam Jadual yang Sama
Cari pasangan dan hubungan.
Membandingkan Baris dalam Jadual yang Sama ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah Gabungan Kendiri?
Gabungan kendiri ialah apabila anda menggabungkan sesebuah jadual dengan jadual itu sendiri. Perkara ini mungkin kedengaran luar biasa pada mulanya, tetapi merupakan teknik yang berkuasa untuk membandingkan baris dalam jadual yang sama.
Bayangkan jadual employees yang setiap pekerjanya mempunyai manager_id yang menunjuk kepada baris lain dalam jadual yang sama. Gabungan kendiri membolehkan anda memadankan setiap pekerja dengan pengurusnya dalam satu pertanyaan.
Menyediakan Jadual Contoh
Marilah kita mencipta jadual employees yang ringkas untuk digunakan sepanjang pelajaran ini. Setiap baris mempunyai id, name, salary dan manager_id yang merujuk kepada pekerja lain dalam jadual yang sama.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
salary INT,
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', 90000, NULL),
(2, 'Bob', 70000, 1),
(3, 'Carol', 65000, 1),
(4, 'Dave', 55000, 2),
(5, 'Eve', 60000, 2),
(6, 'Frank', 48000, 3);Sintaks Asas Gabungan Kendiri
Untuk melakukan gabungan kendiri, rujuk jadual yang sama dua kali menggunakan dua nama ganti yang berbeza. Nama ganti tersebut bertindak seolah-olah anda mempunyai dua salinan jadual yang berasingan. Kemudian, nyatakan syarat gabungan yang menghubungkan kedua-dua salinan itu.
Di sini kita memberikan nama ganti employees sebagai e (pekerja) dan m (pengurus), kemudian memadankannya berdasarkan e.manager_id = m.id.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Menyertakan Baris Peringkat Teratas dengan LEFT JOIN
INNER JOIN biasa membuang baris yang manager_id-nya ialah NULL, yang bermaksud pekerja peringkat teratas (Alice, CEO) akan dikecualikan daripada hasil.
Gunakan LEFT JOIN supaya setiap pekerja muncul, termasuk mereka yang tiada pengurus. Lajur pengurus hanya akan mengandungi NULL bagi mereka.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name NULLS LAST, e.name;Mencari Pasangan yang Berkongsi Sifat
Gabungan kendiri juga berguna untuk mencari pasangan baris yang berkongsi suatu nilai. Contohnya, anda boleh mencari semua pasangan pekerja yang melapor kepada pengurus yang sama.
Syarat a.id < b.id menghalang pasangan pendua seperti (Bob, Carol) dan (Carol, Bob) daripada kedua-duanya muncul dalam hasil.
SELECT
a.name AS employee_1,
b.name AS employee_2,
a.manager_id AS shared_manager
FROM employees a
JOIN employees b
ON a.manager_id = b.manager_id
AND a.id < b.id;Membandingkan Gaji antara Baris
Anda boleh menggunakan gabungan kendiri untuk membandingkan nilai berangka merentas baris. Pertanyaan di bawah mencari setiap pekerja yang gajinya lebih tinggi daripada gaji pengurusnya sendiri — pemeriksaan analitik yang klasik.
SELECT
e.name AS employee,
e.salary AS emp_salary,
m.name AS manager,
m.salary AS mgr_salary
FROM employees e
JOIN employees m ON e.manager_id = m.id
WHERE e.salary > m.salary;Mencari Baris Tanpa Padanan
Gabungan kendiri dengan LEFT JOIN dan pemeriksaan WHERE ... IS NULL membolehkan anda mencari baris yang tiada pasangan sepadan. Di sini kita mencari pekerja yang tiada sesiapa melapor kepada mereka — nod daun dalam hierarki.
SELECT e.name AS employee
FROM employees e
LEFT JOIN employees sub ON sub.manager_id = e.id
WHERE sub.id IS NULL
ORDER BY e.name;Mengira Bawahan Langsung
Dengan menggabungkan jadual itu dengan jadualnya sendiri dan mengumpulkan data berdasarkan bahagian pengurus, anda boleh mengira bilangan bawahan langsung bagi setiap pengurus. Pekerja yang mempunyai sifar bawahan turut disertakan melalui LEFT JOIN.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees m
LEFT JOIN employees e ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;Menggunakan CTE untuk Menjelaskan Gabungan Kendiri
Apabila pertanyaan gabungan kendiri menjadi rumit, membungkusnya dalam Ungkapan Jadual Biasa (CTE) menjadikan logiknya lebih mudah dibaca. Takrifkan satu CTE untuk hierarki, kemudian buat pertanyaan terhadapnya dengan jelas.
WITH hierarchy AS (
SELECT
e.id AS emp_id,
e.name AS employee,
e.salary AS emp_salary,
m.name AS manager,
m.salary AS mgr_salary
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
)
SELECT *
FROM hierarchy
WHERE mgr_salary IS NOT NULL
AND emp_salary > mgr_salary;Gabungan Kendiri pada Jadual Bukan Hierarki
Gabungan kendiri tidak terhad kepada hierarki pengurus-pekerja. Contoh di bawah menggunakan jadual products untuk mencari semua pasangan produk yang tergolong dalam kategori yang sama, yang berguna untuk enjin cadangan atau pemeriksaan kesamaan.
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
category VARCHAR(30)
);
INSERT INTO products VALUES
(1, 'Laptop', 'Electronics'),
(2, 'Phone', 'Electronics'),
(3, 'Tablet', 'Electronics'),
(4, 'Shirt', 'Clothing'),
(5, 'Jeans', 'Clothing');
SELECT
a.name AS product_1,
b.name AS product_2,
a.category
FROM products a
JOIN products b
ON a.category = b.category
AND a.id < b.id;Perangkap: Hasil Darab Cartesan dan Pendua
Dua kesilapan biasa dalam gabungan kendiri ialah hasil darab Cartesan (terlupa menyertakan syarat gabungan sama sekali) dan pasangan pendua (menggunakan a.id <> b.id dan bukannya a.id < b.id).
Sentiasa sahkan bahawa syarat gabungan anda betul dan gunakan < dan bukannya <> apabila anda hanya memerlukan pasangan tidak tersusun, bukannya pasangan tersusun.
-- Wrong: returns every ordered pair (A,B) AND (B,A)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
AND a.id <> b.id;
-- Correct: returns each unordered pair once
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
AND a.id < b.id;Semakan Pantas
Uji pemahaman anda tentang cantuman kendiri dan perbandingan baris dalam jadual yang sama.
Imbas Kembali Pelajaran
Dalam pelajaran ini, anda telah mempelajari cara menggunakan cantuman kendiri untuk membandingkan baris dalam jadual yang sama.
Perkara utama:
- Berikan nama samaran kepada jadual dua kali (contohnya,
edanm) supaya pangkalan data menganggapnya sebagai sumber yang berasingan. - Gunakan
INNER JOINapabila anda hanya memerlukan baris yang mempunyai padanan, dan gunakanLEFT JOINapabila anda juga mahu menyertakan baris tanpa padanan. - Gunakan
a.id < b.iduntuk mengelakkan pasangan tanpa susunan yang pendua. - Cantuman kendiri sesuai untuk hierarki (pengurus/pekerja), carian kesamaan (kategori yang sama), dan sebarang perbandingan yang memerlukan dua baris dalam jadual yang sama dihubungkan.
- CTE boleh menjadikan pertanyaan cantuman kendiri yang kompleks lebih mudah dibaca dan diselenggara.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 46
- Pelajaran
- 183
Soalan Lazim
Adakah pelajaran “Membandingkan Baris dalam Jadual yang Sama” percuma?
Ya — teks penuh “Membandingkan Baris dalam Jadual yang Sama” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Membandingkan Baris dalam Jadual yang Sama”?
Cari pasangan dan hubungan. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Membandingkan Baris dalam Jadual yang Sama” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Apakah Cantuman Kendiri
- Pekerja dan Pengurus
- Membandingkan Baris dalam Jadual yang Sama
- Had Cantuman Kendiri