MySQL Natural Join自然连接

当我们根据它们之间的公共列组合两个或多个表的行时,此操作称为连接。自然连接是一种连接操作,它通过组合基于具有相同名称和数据类型的列的表来创建隐式连接。它类似于INNERLEFT JOIN,但我们不能将 ON 或 USING 子句与自然连接一起使用,就像我们在它们中使用的那样。

注意事项:

  • 无需指定要加入的列名。
  • 结果表始终包含唯一列。
  • 可以对两个以上的表执行自然连接。
  • 不要使用 ON 子句。

 一、MySQL Natural Join 自然连接 语法

SELECT [column_names | *]   
FROM table_name1   
NATURAL JOIN table_name2;  

在这种语法中,我们需要在 SELECT 关键字之后指定要包含在结果集中的列名。如果我们想从两个表中选择所有列,将使用*运算符。接下来,我们将在 FROM 关键字之后指定要连接的表名,并在它们之间写入NATURAL JOIN子句。

二、MySQL Natural Join 自然连接 示例

让我们了解自然连接在MySQL中的工作原理通过例子。首先,我们将使用以下语句创建两个名为customer和balance的表:

/* -- Table name: customer -*/  
CREATE TABLE customer (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    customer_name VARCHAR(55),  
    account int,  
    email VARCHAR(55)  
);    
  
/* -- Table name: balance -*/  
CREATE TABLE balance (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    account int,  
    balance FLOAT(10, 2)  
);  

接下来,我们将使用以下语句将一些记录填充到两个表中:

/* -- Data for customer table -*/  
INSERT INTO customer(customer_name, account, email)  
VALUES('Stephen', 1030, 'stephen@javatpoint.com'),  
    ('Jenifer', 2035, 'jenifer@javatpoint.com'),  
    ('Mathew', 5564, 'mathew@javatpoint.com'),  
    ('Smith', 4534, 'smith@javatpoint.com'),  
    ('David', 7648, 'david@javatpoint.com');  
  
/* -- Data for balance table -*/  
INSERT INTO balance(account, balance)  
VALUES(1030, 50000.00),   
    (2035, 230000.00),   
    (5564, 125000.00),   
    (4534, 80000.00),   
    (7648, 45000.00);  

接下来,我们将执行SELECT 语句来验证表数据:

现在,我们将看到满足自然连接条件的条件。我们可以通过使用DESCRIBE语句检查表结构来做到这一点。见下图:

在这张图片中,我们可以看到列名 id 和 account 及其数据类型都满足自然连接条件。因此我们可以对它们使用自然连接。

使用自然连接执行以下语句以连接表:

mysql> SELECT cust. customer_name, bal.balance   
FROM customer AS cust   
NATURAL JOIN balance AS bal; 

我们将得到以下结果:

我们可以使用 ON 子句在 INNER JOIN的帮助下完成同样的工作。这是解释此连接的查询:

mysql> SELECT cust. customer_name, bal.balance   
FROM customer AS cust   
INNER JOIN balance AS bal   
ON cust.id = bal.id; 

执行成功后,我们会得到和自然连接一样的结果:

现在,我们将使用 (*) 代替列名,如下所示:

mysql> SELECT * FROM customer NATURAL JOIN balance;  

假设我们使用星号 (*) 代替列名,那么自然连接会自动搜索相同的列名及其数据类型并在内部连接它们。此外,它不会在输出中显示重复的列。因此,执行上述语句后,我们应该得到以下输出:

三、使用 WHERE 子句自然连接

WHERE 子句用于从表中返回过滤结果。以下示例使用自然连接子句说明了这一点:

mysql> SELECT cust. customer_name, bal.balance   
FROM customer AS cust   
NATURAL JOIN balance AS bal  
WHERE bal.balance > 50000;  

我们将得到以下结果,其中显示账户余额大于 50000的客户信息。

四、使用三个表的 自然连接 Natural Join

我们知道自然连接也可以对两个以上的表进行连接操作。为了理解这一点,我们将使用如下语法:

SELECT [column_names | *]   
FROM table_name1   
NATURAL JOIN table_name2  
NATURAL JOIN table_name3;  

让我们使用以下语句创建另一个名为cust_info的表:

CREATE TABLE cust_info (  
    account int,  
    mobile VARCHAR(15),  
    address VARCHAR(65)  
);  

然后,我们将记录填充到该表中:

INSERT INTO cust_info(account, mobile, address)  
VALUES(1030, '598675498654', '777 Brockton Avenue, Abington MA 251'),   
    (2035, '698853747888', '337 Russell St, Hadley MA 103'),   
    (5564, '234456977555', '20 Soojian Dr, Leicester MA 154'),   
    (4534, '987656789666', '780 Lynnway, Lynn MA 19'),   
    (7648, '756489372222', '700 Oak Street, Brockton MA 23');  

我们可以使用 SELECT 语句验证数据。见下图:

使用自然连接来连接三张表,我们需要执行如下语句:

mysql> SELECT C.customer_name, C.account, B.balance, I.mobile   
FROM customer AS C  
NATURAL JOIN balance AS B  
NATURAL JOIN cust_info AS I;  

它将给出以下结果。在这里,我们可以看到帐号出现在所有三列中,但在满足自然连接条件的输出中仅出现一次。

五、自然连接和内连接的区别

Natural Join自然连接 Inner Join内连接
它基于相同的列名及其数据类型连接表。 它根据在 ON 子句中明确指定的列名连接表。
它总是返回结果集中的唯一列。 它返回两个表的所有属性以及与 ON 子句条件匹配的重复列。
如果我们没有在这个连接中指定任何条件,它会根据公共列返回记录。 它仅返回两个表中都存在的那些行。
自然连接的语法如下:
SELECT [column_names | *]
FROM table_name1
NATURAL JOIN table_name2;
内连接的语法如下:
SELECT [column_names | *]
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name = table_name2.column_name;

热门文章

优秀文章