MySQL 自然连接
当我们基于两个或多个表之间的共同列组合行时,这个操作被称为连接。 自然连接是一种通过基于具有相同名称和数据类型的列来组合表的隐式连接的连接操作。 它类似于INNER或LEFT JOIN,但我们不能像在它们中使用ON或USING子句一样在自然连接中使用它们。
要记住的要点:
- 不需要指定要连接的列名。
- 结果表始终包含唯一的列。
- 可以在两个以上的表上执行自然连接。
- 不要使用ON子句。
语法:
以下是一个基本语法示例来说明自然连接:
SELECT [column_names | *]
FROM table_name1
NATURAL JOIN table_name2;
在这个语法中,我们需要在SELECT关键字之后指定要包含在结果集中的 列名 。如果我们想选择两个表中的所有列,则使用 ***** 运算符。接下来,我们将在FROM关键字之后指定要连接的 表名 并在它们之间写入 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 。
自然连接使用三个表
我们知道自然连接也可以在两个以上的表上执行连接操作。为了理解这一点,我们将使用以下语法:
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;
它将给出以下结果。在这里我们可以看到,账号存在于三列中,但在满足自然连接条件的输出中只出现了一次。
自然连接与内连接的区别
SN | 自然连接 | 内连接 |
---|---|---|
1. | 根据相同的列名和数据类型连接表格。 | 根据在ON子句中明确指定的列名连接表格。 |
2. | 总是返回结果集中唯一的列。 | 返回两个表格中与ON子句条件匹配的重复列以及所有属性。 |
3. | 如果在此连接中没有指定条件,则根据共同列返回记录。 | 仅返回存在于两个表格中的行。 |
4. | 自然连接的语法如下: SELECT [列名 | *] FROM 表格名1 NATURAL JOIN 表格名2; | 内连接的语法如下: SELECT [列名 | *] FROM 表格名1 INNER JOIN 表格名2 ON 表格名1.列名 = 表格名2.列名; |