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.
[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:
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:
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:
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:
Kaedah sambungan ini dipanggil inner 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:
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.
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.
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.
[Contoh] Berdasarkan nombor jabatan department_id
, pertanyaan employees
semuanombor pekerja dan jadual jabatan<🎜 dalam jadual pekerjaemployee_id
> Nama jabatan yang sepadan departments
. department_name
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
. (+)
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name` FROM employees emp, departments dept WHERE emp.`department_id` = dept.`department_id`(+);
SQL99语法使用 JOIN...ON
的方式实现多表查询,且可以同时实现内连接和三种外连接。MySQL是支持这种方式的。
【例子:三表查询】查询员工的员工编号 employee_id
、 姓名 last_name
、部门名称 department_name
和所在城市 city
。
【分析】这个需求需要 3 张表共同查询。
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`;
查询结果:
【例子】根据部门编号 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`;
查询结果:
举一反三地,右外连接就是在 OUTER JOIN
前加一个关键字 RIGHT
。
SELECT emp.`employeed/master/img/d`;
查询结果:
查询结果有122条记录,这怎么解释呢?再回想一下右外连接的定义:
两个表在连接过程中除了返回满足连接条件的行以外,还返回右表中不满足条件的行。如下图中,右外连接就是右边一整个圆。
就不难理解,因为右表部是没有人的。而左、右表匹配的数据有106条 (两圆相交部分) ,因此一共就有 106 + 16 = 122 106+16=122 106+16=122 条记录。如下图所示:
这个例子能更好地帮助我们理解右外连接。
举一反三地,满外连接就是在 OUTER JOIN
前加一个关键字 FULL
。但很不幸,MySQL不支持SQL99的满外连接语法,Oracle是支持的。
我们需要使用别的方法实现MySQL中的满外连接,详见4.6 满外连接 。
在开始本节之前,需要您了解SQL的 UNION
和 UNION ALL
的定义和实现。如果需要了解,可以阅读这篇博文:《MySQL中 UNION 并的使用》。
根据部门编号 department_id
,查询员工表 employees
中的员工编号 employee_id
和部门表 departments
中其对应的部门名称 department_name
。
SELECT emp.`employee_id`, emp.`last_name`, dept.`department_name` FROM employees emp JOIN departments dept ON emp.`department_id` = dept.`department_id`;
查询结果:
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`;
查询结果:
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`;
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;
查询结果:
作用是把员工表 employees
中,部门编号 department_id
为 (NULL) 的那一个员工查询出来了,如下图所示:
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;
查询结果:
由于MySQL不支持SQL99语法的满外连接。因此,我们的实现方式就是求
4.2 左外连接 和 4.5 第五种JOIN 的并 UNION ALL
即可;或者求4.3 右外连接 和 4.4 第四种JOIN 的并 UNION ALL
也行,都是一样的效果。
# 方法一 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;
查询结果:
实现下面这个操作只需要把 4.4 第四种JOIN 和 4.5 第五种JOIN 求 UNION ALL
即可。
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;
查询结果:
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!