当无涯教程基于两个或多个表之间的公共列合并行时,此操作称为联接。 自然联接是一种联接操作,它通过基于具有相同名称和数据类型的列的表进行组合来创建隐式联接。它类似于 INNER 或LEFT JOIN,但是不能像在自然连接中那样使用ON或USING子句。
以下是说明自然联接的基本语法:
SELECT [column_names | *] FROM table_name1 NATURAL JOIN table_name2;
使用这种语法,无涯教程需要在SELECT关键字之后指定要包含在结果集中的列名。如果要从两个表中选择所有列,将使用 * 运算符。接下来,将在FROM关键字之后指定用于连接的表名(table_name),并在它们之间编写 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语句来验证表数据:
现在,无涯教程将看到满足natural join的条件。可以通过使用 DESCRIBE 语句检查表结构来做到这一点。见下图:
在此图中,无涯教程可以看到列名ID和帐户(account)及其数据类型相同,可以满足自然联接条件。因此,可以对它们使用自然联接(natural join)。
使用自然连接执行以下语句以连接表:
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子句用于从表中返回过滤结果。以下示例通过自然连接子句对此进行了说明:
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> 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;
它将给出以下结果。在这里,可以看到在所有三列中都存在该帐号,但是在满足自然加入条件的输出中仅到达了一次。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)