当前位置:首页 > 数据库 > Mysql

MySQL右连接(RIGHTJOIN)

在本教程中,您将学习如何使用MySQL RIGHT JOIN来查询来自两个或多个表中的数据。

1. MySQL RIGHT JOIN子句介绍

MySQL RIGHT JOIN子句类似于LEFT JOIN子句,除了表的处理相反以外。

以下语句使用RIGHT JOIN子句从两个表:t1t2中查询数据:

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 JOINLEFT JOIN子句在功能上是等效的,只要表顺序被切换,它们就可以互相替换。

注意,RIGHT OUTER JOINRIGHT JOIN的同义词。

MySQL RIGHT JOIN示例

假设有两个表:t1t2,其结构和数据如下:

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');

以下查询使用模式列连接两个表:t1t2

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)中的两个表:employeescustomers表。

以下查询获取销售代表及其客户,参考以下查询语句:

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,所有客户(右表)都会显示在结果集中。我们还可以看到,一些客户在销售员(jobTitlesalesman)列中没有专门的销售代表则以NULL表示。

在本教程中,您学习了如何使用MySQL RIGHT JOIN来查询来自两个或多个表的数据。



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐