在本教程中,您将学习如何使用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 请参阅示例数据库(51frwdb)中的两个表: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来查询来自两个或多个表的数据。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!