Rumah  >  Artikel  >  pangkalan data  >  Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

WBOY
WBOYke hadapan
2023-05-28 23:06:151034semak imbas

1. Inner join

Inner join: gabungkan baris daripada lebih daripada dua jadual dengan lajur yang sama Hasil set tidak mengandungi satu jadual dan satu lagi jadual tidak. Garisan yang sepadan.

Dalam istilah manusia, hasil pertanyaan hanya termasuk baris yang dipadankan dan baris yang tidak sepadan akan dibuang.

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

[Contoh] Pertanyaan nombor pekerja employee_id dan nama jabatan yang sepadan department_name. Nama jabatan department_name hanya dalam jadual jabatan departments dan jadual jabatan departments adalah seperti yang ditunjukkan dalam rajah di bawah:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Jadual pekerja employees dan jadual jabatan departments Disambungkan mengikut nombor jabatan department_id padanan. Kod pertanyaan adalah seperti berikut:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp, departments dept
WHERE emp.`department_id` = dept.`department_id`;

Hasil pertanyaan:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

106 rekod dikembalikan di sini, tetapi jadual pekerja employees mempunyai jumlah 107 rekod Ya, seorang hilang. Sebabnya ialah dalam jadual pekerja employees, terdapat seorang pekerja yang nombor jabatannya department_id adalah (NULL), seperti yang ditunjukkan dalam rajah berikut:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

dan jadual jabatan departments Tiada nombor jabatan department_id dengan nilai (NULL), jadi data yang tidak sepadan dalam baris ini dibuang dan tidak dipaparkan. Seperti yang ditunjukkan dalam rajah di bawah, cantuman dalam hanya mengandungi baris yang sepadan bagi dua jadual, iaitu, persilangan dua bulatan dalam rajah di bawah:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?


Kaedah sambungan ini dipanggil inner join.

2. Outer join

Outer join: Cantumkan baris daripada lebih daripada dua jadual dengan lajur yang sama Selain daripada mengandungi baris daripada satu jadual yang sepadan dengan jadual lain, set hasil juga pertanyaan Dicapai baris yang tidak sepadan dalam jadual kiri atau kanan.

Gabungan luar dibahagikan kepada tiga kategori berikut:

Gabungan luar kiri:

Selain baris kembali yang memenuhi syarat cantuman, kedua-dua jadual juga kembali Kiri baris dalam jadual yang tidak memenuhi syarat. Seperti yang ditunjukkan dalam rajah di bawah, gabungan luar kiri ialah keseluruhan bulatan di sebelah kiri.

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Sambung luar kanan:

Semasa proses sambungan, selain memulangkan baris yang memenuhi syarat sambung, kedua-dua jadual juga kembali kanan Baris dalam jadual yang tidak memenuhi syarat. Seperti yang ditunjukkan dalam gambar di bawah, cantuman luar kanan ialah keseluruhan bulatan di sebelah kanan.

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Sambung luar penuh:

Semasa proses sambung jadual, sebagai tambahan kepada baris kembali yang memenuhi syarat sambung, jadual kiri dan jadual kanan akan juga dikembalikan Baris yang tidak memenuhi kriteria. Seperti yang ditunjukkan dalam rajah di bawah, cantuman luar penuh ialah semua bahagian dua bulatan.

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

[Contoh] Berdasarkan nombor jabatan department_id, pertanyaan employeessemuanombor pekerja dan jadual jabatanemployee_id > Nama jabatan yang sepadan departments. department_name

【Analisis】Apabila perkataan meminta pertanyaan

muncul dalam soalan, kita mesti sangat berwaspada Ini bermakna kita perlu menggunakan pertanyaan gabungan luar. Kedua-dua sintaks SQL92 dan SQL99 boleh digunakan untuk melaksanakan cantuman luaran Untuk butiran, lihat [5.9 Standard SQL yang Biasa Digunakan] (# 5.9 Standard SQL yang Biasa Digunakan). Memandangkan jadual pekerja kiri 所有 mempunyai sejumlah 107 keping data, dan jadual kanan serta jadual kiri sepadan dengan hanya 106 keping data, gabungan luar kiri perlu digunakan. employees

[SQL92 syntax to implement outer joins] Gunakan

. (+)

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp, departments dept
WHERE emp.`department_id` = dept.`department_id`(+);

Hasil pertanyaan: Ralat

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Ini kerana MySQL tidak menyokong operasi gabungan luar sintaks SQL92. Tetapi Oracle menyokongnya. Jadi tidak ada pembelajaran yang sia-sia. MySQL hanya menyokong sintaks SQL99 untuk melaksanakan pertanyaan berbilang jadual.


3. Sintaks SQL99 untuk melaksanakan pertanyaan berbilang jadual

SQL99 merujuk kepada spesifikasi standard sintaks SQL yang diumumkan oleh SQL pada tahun 1999. Walaupun satu siri piawaian SQL baharu dikeluarkan kemudian, dalam proses pembelajaran MySQL, ia sudah cukup untuk menguasai SQL99 dan SQL92 terutamanya. Bermula dari bahagian ini, kajian tentang MySQL adalah separuh jalan, kerana sebelum bahagian ini adalah sintaks SQL92, bermula dari bahagian ini khusus untuk sintaks SQL99.

SQL99语法使用 JOIN...ON 的方式实现多表查询,且可以同时实现内连接和三种外连接。MySQL是支持这种方式的。

3.1 SQL99实现内连接

【例子:三表查询】查询员工的员工编号 employee_id 、 姓名 last_name 、部门名称 department_name 和所在城市 city

【分析】这个需求需要 3 张表共同查询。

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`
FROM employees emp JOIN departments dept
ON emp.`department_id` = dept.`department_id`
JOIN locations loc
ON dept.`location_id` = loc.`location_id`;

SQL99语法就是加一张表,就 JOIN 一张表,并在 ON 后加连接条件。注意,这里的 JOIN 前面还省略了表示内连接的关键字 INNER ,在使用内连接时可以忽略。即代码还可以写成完整形式:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, loc.`city`
FROM employees emp INNER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
JOIN locations loc
ON dept.`location_id` = loc.`location_id`;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

3.2 SQL99语法实现外连接

3.2.1 左外连接

【例子】根据部门编号 department_id ,查询员工表 employees 中的所有员工编号 employee_id 和部门表 departments 中其对应的部门名称 department_name

【分析】由于左表是员工表 employees ,有107条数据;而右表是部门表 departments ,有27条数据。题目要求是返回所有员工的107条查询结果,因此这里使用左外连接。SQL99实现左连接接很简单,只需要在 JOIN 前加上两个关键字 LEFT OUTER 即可表示左外连接。如下代码所示:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

其中,OUTER 可以省略,即写成:

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

3.2.2 右外连接

举一反三地,右外连接就是在 OUTER JOIN 前加一个关键字 RIGHT

SELECT emp.`employeed/master/img/d`;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

查询结果有122条记录,这怎么解释呢?再回想一下右外连接的定义:

两个表在连接过程中除了返回满足连接条件的行以外,还返回表中不满足条件的行。如下图中,右外连接就是右边一整个圆。

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

就不难理解,因为右表部是没有人的。而左、右表匹配的数据有106条 (两圆相交部分) ,因此一共就有 106 + 16 = 122 106+16=122 106+16=122 条记录。如下图所示:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

这个例子能更好地帮助我们理解右外连接。

3.2.3 满外连接

举一反三地,满外连接就是在 OUTER JOIN 前加一个关键字 FULL 。但很不幸,MySQL不支持SQL99的满外连接语法,Oracle是支持的。

我们需要使用别的方法实现MySQL中的满外连接,详见4.6 满外连接 。

4.总结:七种SQL JOINS的实现

在开始本节之前,需要您了解SQL的 UNIONUNION ALL 的定义和实现。如果需要了解,可以阅读这篇博文:《MySQL中 UNION 并的使用》。

4.1 内连接

根据部门编号 department_id ,查询员工表 employees 中的员工编号 employee_id 和部门表 departments 中其对应的部门名称 department_name

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.2 左外连接

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.3 右外连接

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`;

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.4 第四种JOIN

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

作用是把员工表 employees 中,部门编号 department_id 为 (NULL) 的那一个员工查询出来了,如下图所示:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.5 第五种JOIN

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`, emp.`department_id`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.6 满外连接

由于MySQL不支持SQL99语法的满外连接。因此,我们的实现方式就是求

4.2 左外连接 和 4.5 第五种JOIN 的并 UNION ALL 即可;或者求4.3 右外连接 和 4.4 第四种JOIN 的并 UNION ALL 也行,都是一样的效果。

方法一

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

方法二

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

# 方法一
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_id`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

# 方法二
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`employee_id` = dept.`department_id`
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`employee_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

4.7 第七种JOIN

实现下面这个操作只需要把 4.4 第四种JOIN 和 4.5 第五种JOIN 求 UNION ALL 即可。

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp LEFT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE dept.`department_id` IS NULL
UNION ALL
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name`
FROM employees emp RIGHT OUTER JOIN departments dept
ON emp.`department_id` = dept.`department_id`
WHERE emp.`department_id` IS NULL;

查询结果:

Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?

Atas ialah kandungan terperinci Apakah kaedah pelaksanaan sambung dalam MySQL, sambung luar dan sambung SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam