在本教程中,您将学习如何使用MySQL RIGHT JOIN
来查询来自两个或多个表中的数据。
1. MySQL RIGHT JOIN子句介绍
MySQL RIGHT JOIN
子句类似于LEFT JOIN子句,除了表的处理相反以外。
以下语句使用RIGHT JOIN
子句从两个表:t1
和t2
中查询数据:
SELECT
*
FROM t1
RIGHT JOIN t2 ON join_predicate;
在上面查询语句中 -
t1
是左表,t2
是右表。join_predicate
是将左表(t1
)上的行与右表(t2
)上的行进行匹配的条件。
join_predicate
可以是以下形式(类似于主键和外键连接):
t1.pk = t2.fk
或者如果两个表的有相同的列并具有相同的名称,则可以使用以下语法:
USING (common_column);
以下说明RIGHT JOIN
子句的工作原理。
- 来自
t2
表(右表)的所有行将在结果集中至少显示一次。 - 基于
join_predicate
条件,如果t1
表(左表)中没有匹配的行存在,那么t1
表中的列将在t2
表中与t2
表中不匹配的行中显示为 NULL 值。
要强调的是,RIGHT JOIN
和LEFT JOIN
子句在功能上是等效的,只要表顺序被切换,它们就可以互相替换。
注意,
RIGHT OUTER JOIN
是RIGHT JOIN
的同义词。
MySQL RIGHT JOIN示例
假设有两个表:t1
和t2
,其结构和数据如下:
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE t1 (
id INT PRIMARY KEY,
pattern VARCHAR(50) NOT NULL
);
CREATE TABLE t2 (
id VARCHAR(50) PRIMARY KEY,
pattern VARCHAR(50) NOT NULL
);
INSERT INTO t1(id, pattern)
VALUES(1,'Divot'),
(2,'Brick'),
(3,'Grid');
INSERT INTO t2(id, pattern)
VALUES('A','Brick'),
('B','Grid'),
('C','Diamond');
以下查询使用模式列连接两个表:t1
和t2
:
mysql> SELECT
t1.id, t2.id
FROM
t1
RIGHT JOIN t2 USING (pattern)
ORDER BY t2.id;
+------+----+
| id | id |
+------+----+
| 2 | A |
| 3 | B |
| NULL | C |
+------+----+
3 rows in set
下图显示了RIGHT JOIN
子句的结果:
请参阅示例数据库(yiibaidb)中的两个表:employees
和customers
表。
以下查询获取销售代表及其客户,参考以下查询语句:
SELECT
concat(e.firstName,' ', e.lastName) salesman,
e.jobTitle,
customerName
FROM
employees e
RIGHT JOIN
customers c ON e.employeeNumber = c.salesRepEmployeeNumber
AND e.jobTitle = 'Sales Rep'
ORDER BY customerName;
执行上面查询,得到以下结果 -
mysql> SELECT
concat(e.firstName,' ', e.lastName) salesman,
e.jobTitle,
customerName
FROM
employees e
RIGHT JOIN
customers c ON e.employeeNumber = c.salesRepEmployeeNumber
AND e.jobTitle = 'Sales Rep'
ORDER BY customerName;
+------------------+-----------+------------------------------------+
| salesman | jobTitle | customerName |
+------------------+-----------+------------------------------------+
| Gerard Hernandez | Sales Rep | Alpha Cognac |
| Foon Yue Tseng | Sales Rep | American Souvenirs Inc |
| Pamela Castillo | Sales Rep | Amica Models & Co. |
| NULL | NULL | ANG Resellers |
| Andy Fixter | Sales Rep | Anna's Decorations, Ltd |
| NULL | NULL | Anton Designs, Ltd. |
| NULL | NULL | Asian Shopping Network, Co |
| NULL | NULL | Asian Treasures, Inc. |
| Gerard Hernandez | Sales Rep | Atelier graphique |
| Andy Fixter | Sales Rep | Australian Collectables, Ltd |
| Andy Fixter | Sales Rep | Australian Collectors, Co. |
... ...
| Martin Gerard | Sales Rep | Vida Sport, Ltd |
| Foon Yue Tseng | Sales Rep | Vitachrome Inc. |
| Barry Jones | Sales Rep | Volvo Model Replicas, Co |
| NULL | NULL | Warburg Exchange |
| Leslie Thompson | Sales Rep | West Coast Collectables Co. |
+------------------+-----------+------------------------------------+
122 rows in set
因为使用RIGHT JOIN
,所有客户(右表)都会显示在结果集中。我们还可以看到,一些客户在销售员(jobTitle
,salesman
)列中没有专门的销售代表则以NULL
表示。
在本教程中,您学习了如何使用MySQL RIGHT JOIN
来查询来自两个或多个表的数据。