MySQL连接

时间:2019-11-20 08:52:05  来源:igfitidea点击:

简介:在本教程中,您将学习SELECT语句中的各种MySQL连接子句,以从两个表中查询数据。

MySQL连接子句简介

关系数据库由多个相关表组成,这些表使用称为外键列的通用列链接在一​​起。
因此,从业务角度来看,每个表中的数据都不完整。

例如,在示例数据库中,我们拥有使用orderNumber列链接的order和orderdetails表:

要获取完整的订单信息,您需要从订单和``orderdetails''表中查询数据。

这就是加入游戏的原因。

联接是一种基于表之间公共列的值在一个(自联接)或多个表之间链接数据的方法。

MySQL支持以下类型的联接:

  • 内部联接
  • 左联接
  • 正确加入
  • 交叉联接

若要联接表,请对相应的联接类型使用交叉联接,内部联接,左联接或右联接子句。
在FROM子句之后出现的SELECT语句中使用join子句。

请注意,MySQL还不支持FULL OUTER JOIN。

设置样本表

首先,创建两个名为成员和委员会的表:

CREATE TABLE members (
    member_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (member_id)
);

CREATE TABLE committees (
    committee_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (committee_id)
);

其次,在表的成员和委员会中插入一些行:

INSERT INTO members(name)
VALUES('John'),('Jane'),('Mary'),('David'),('Amelia');

INSERT INTO committees(name)
VALUES('John'),('Mary'),('Amelia'),('Joe');

第三,查询表成员和委员会的数据:

SELECT * FROM members;
SELECT * FROM committees;

有些成员是委员会成员,有些则不是。
另一方面,有些委员会成员在成员表中,有些则不在。

MySQL INNER JOIN子句

内部join子句根据称为联接谓词的条件联接两个表。

内部连接子句将第一个表中的每一行与第二个表中的每一行进行比较。
如果两行中的值都导致连接条件的值为true,则内部join子句创建一个新行,该行的列包含两个表中两行的所有列,并将此新行包括在最终结果集中。
换句话说,内部连接子句仅包含值匹配的行。

下面显示了连接两个表table_1和table_2的内部join子句的基本语法:

SELECT column_list
FROM table_1
INNER JOIN table_2 ON join_condition;

如果联接条件使用等于运算符(=),并且两个表中用于匹配的列名称相同,则可以改用USING子句:

SELECT column_list
FROM table_1
INNER JOIN table_2 USING (column_name);

以下语句查找同时也是委员会成员的成员:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
INNER JOIN committees c 
	ON c.name = m.name;

在此示例中,内部连接子句使用表成员和委员会中名称列中的值进行匹配。

以下维恩图说明了内部联接:

由于两个表中的名称列相同,因此可以使用USING子句,如以下查询所示:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
INNER JOIN committees c USING(name);

MySQL LEFT JOIN子句

类似于内部联接,左联接也需要联接谓词。
使用左联接联接两个表时,将引入左右表的概念。

左联接从左表开始选择数据。
对于左表中的每一行,左联接与右表中的每一行进行比较。
如果两行中的值导致连接条件的值为true,则左连接将创建一个新行,该行的列包含两个表中该行的所有列,并将该行包括在结果集中。

如果两行中的值不匹配,则左连接子句仍会创建一个新行,该行的列包含左表中该行的列,而右表中该行的列为NULL。

换句话说,无论右表中是否存在匹配的行,左联接都会从左表中选择所有数据。
如果找不到右表中的匹配行,则将NULL用于最终结果集中右表中的行的列。

这是连接两个表的左连接子句的基本语法:

SELECT column_list 
FROM table_1 
LEFT JOIN table_2 ON join_condition;

如果两个表中用于匹配的列相同,则左联接也支持USING子句:

SELECT column_list 
FROM table_1 
LEFT JOIN table_2 USING (column_name);

以下示例使用左联接将成员与委员会表联接在一起:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
LEFT JOIN committees c USING(name);

下面的维恩图说明了左连接:

该语句使用带有USING语法的left join子句:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
LEFT JOIN committees c USING(name);

要查找不是委员会成员的成员,请添加WHERE子句和IS NULL运算符,如下所示:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
LEFT JOIN committees c USING(name)
WHERE c.committee_id IS NULL;

通常,此查询模式可以在左表中找到在右表中没有对应行的行。

该维恩图说明了如何使用左联接选择仅存在于左表中的行:

MySQL RIGHT JOIN子句

右连接子句与左连接子句类似,不同之处在于表的处理方式相反。
右联接开始从右表而不是左表中选择数据。

右连接子句从右表中选择所有行,并匹配左表中的行。
如果右表中的行没有左表中的匹配行,则左表的列在最终结果集中将为NULL。

这是正确连接的语法:

SELECT column_list 
FROM table_1 
RIGHT JOIN table_2 ON join_condition;

与left join子句类似,right子句也支持USING语法:

SELECT column_list 
FROM table_1 
RIGHT JOIN table_2 USING (column_name);

要在右表中查找在左表中没有对应行的行,还可以将WHERE子句与IS NULL运算符一起使用:

SELECT column_list 
FROM table_1 
RIGHT JOIN table_2 USING (column_name)
WHERE column_table_1 IS NULL;

该语句使用正确的联接来联接成员和委员会表:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
RIGHT JOIN committees c on c.name = m.name;

该维恩图说明了正确的连接:

以下语句使用带有USING语法的right join子句:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
RIGHT JOIN committees c USING(name);

要查找不在成员表中的委员会成员,请使用以下查询:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
RIGHT JOIN committees c USING(name)
WHERE m.member_id IS NULL;

该维恩图说明了如何使用正确的联接来选择仅存在于正确的表中的数据:

MySQL CROSS JOIN子句

与内部联接,左联接和右联接不同,交叉联接子句没有联接条件。

交叉联接是联接表中各行的笛卡尔乘积。
交叉联接将第一个表中的每一行与右表中的每一行组合在一起,以生成结果集。

假设第一个表有n行,第二个表有m行。
将第一个表与第二个表连接起来的交叉联接将返回nxm行。

下面显示了交叉联接子句的基本语法:

SELECT select_list
FROM table_1
CROSS JOIN table_2;

本示例使用交叉联接子句将成员与委员会表联接在一起:

SELECT 
    m.member_id, 
    m.name member, 
    c.committee_id, 
    c.name committee
FROM
    members m
CROSS JOIN committees c;

交叉联接对于生成计划数据很有用。
例如,您可以使用客户,产品和年份的交叉联接来制定销售计划。

在本教程中,您学习了各种MySQL连接语句,包括交叉连接,内部连接,左连接和右连接,以查询来自两个表的数据。