MySQL - Natural Join

MySQL - Natural Join 首页 / MySQL入门教程 / MySQL - Natural Join

当无涯教程基于两个或多个表之间的公共列合并行时,此操作称为联接。 自然联接是一种联接操作,它通过基于具有相同名称和数据类型的列的表进行组合来创建隐式联接。它类似于 INNER LEFT JOIN,但是不能像在自然连接中那样使用ON或USING子句。

以下是说明自然联接的基本语法:

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

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

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@learnfk.com'),
	('Jenifer', 2035, 'jenifer@learnfk.com'),
	('Mathew', 5564, 'mathew@learnfk.com'),
	('Smith', 4534, 'smith@learnfk.com'),
	('David', 7648, 'david@learnfk.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语句来验证表数据:

MySQL Natural Join

现在,无涯教程将看到满足natural join的条件。可以通过使用 DESCRIBE 语句检查表结构来做到这一点。见下图:

MySQL Natural Join

在此图中,无涯教程可以看到列名ID和帐户(account)及其数据类型相同,可以满足自然联接条件。因此,可以对它们使用自然联接(natural join)。

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

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

将得到以下结果:

MySQL Natural Join

无涯教程可以借助使用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 Natural Join

现在,将在列名的位置使用(*),如下所示:

mysql> SELECT * FROM customer NATURAL JOIN balance;

假设无涯教程在列名的位置使用星号(*),然后自然连接会自动搜索相同的列名及其数据类型并在内部进行连接。此外,它不会在输出中显示重复的列。因此,执行上面的语句后,应该获得下面的输出:

MySQL Natural Join

NATURAL JONI WHERE子句

WHERE子句用于从表中返回过滤结果。以下示例通过自然连接子句对此进行了说明:

mysql> SELECT cust. customer_name, bal.balance 
FROM customer AS cust 
NATURAL JOIN balance AS bal
WHERE bal.balance > 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 Natural Join

要使用自然联接来联接三个表,无涯教程需要执行以下语句:

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;

它将给出以下结果。在这里,可以看到在所有三列中都存在该帐号,但是在满足自然加入条件的输出中仅到达了一次。

无涯教程网

MySQL Natural Join

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

算法面试通关40讲 -〔覃超〕

Linux实战技能100讲 -〔尹会生〕

Go 并发编程实战课 -〔晁岳攀(鸟窝)〕

技术面试官识人手册 -〔熊燚(四火)〕

说透数字化转型 -〔付晓岩〕

手把手带你写一个Web框架 -〔叶剑峰〕

编程高手必学的内存知识 -〔海纳〕

深入剖析Java新特性 -〔范学雷〕

超级访谈:对话玉伯 -〔玉伯〕

好记忆不如烂笔头。留下您的足迹吧 :)