语法1:
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
语法2:
SELECT * FROM table1,table2 WHERE table1.column = table2.column;
(1)查询会对 table1
的每一行的 column
值依次和 table2
的每一行的 column
值进行比较
(2)table1
的每一行的column可能在table2中找到一条/多条/没有column相等的数据,找到几条,那一行的查询结果就是几条
(3)注意:如果table1的某一行没有在table2中找到column
相等的值,那么查询结果中是不会有那一行的数据的
+----+----------+
| ID | Username |
+----+----------+
| 1 ?| Alice? ? ?|
| 2 ?| Bob ? ? ?|
| 3 ?| Charlie |
+----+----------+
????????表:?orders
+---------+---------+
| OrderID | UserID ?|
+---------+---------+
| 101 ? ? | 1 ? ? ? |
| 102 ? ? | 1 ? ? ? |
| 103 ? ? | 2 ? ? ? |
| 104 ? ? | 5? ? ? |
+---------+---------+
SELECT users.ID, users.Username, orders.OrderID
FROM users, orders
WHERE users.ID = orders.UserID;
?+----+----------+---------+
| ID | Username | OrderID |
+----+----------+---------+
| 1 ?| Alice ? ?| 101 ? ? |
| 1 ?| Alice ? ?| 102 ? ? |
| 2 ?| Bob ? ? ?| 103 ? ? |
+----+----------+---------+
(1)在实际执行中,关系型数据库优化器通常会选择最有效的执行计划。
(2)推荐使用语法1的写法,逗号和 WHERE
子句的写法相对于 INNER JOIN
更为早期,可能在一些特殊情况下不被某些数据库系统完全支持或解释。
(3)在 INNER JOIN 中,连接的顺序是可以随意交换的,因为 INNER JOIN 是对称的。
?????????例如:
-- 查询1
SELECT users.ID, users.Username, orders.OrderID, order_details.Product
FROM users
INNER JOIN orders ON users.ID = orders.UserID
INNER JOIN order_details ON orders.OrderID = order_details.OrderID;-- 查询2(连接条件的先后顺序交换了)
SELECT users.ID, users.Username, orders.OrderID, order_details.Product
FROM order_details
INNER JOIN orders ON order_details.OrderID = orders.OrderID
INNER JOIN users ON orders.UserID = users.ID;
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
(1)拿左表的每一行的 column 去依次和右表的每一行的 column 对比。
(2)左表的每一行的 column 可能在右表中找到一条/多条/没有 column 相等的数据。
(3)如果左表的某一行没有在右表中找到 column 相等的值,查询结果中会有那一行的数据,但右表的列会显示为 NULL。
+------+--------+-------------+
| EmpID| Name ? | Department ?|
+------+--------+-------------+
| 1 ? ?| Alice ?| IT ? ? ? ? ?|
| 2 ? ?| Bob ? ?| HR ? ? ? ? ?|
| 3 ? ?| Charlie| Finance ? ? |
+------+--------+-------------+
????????表:?departments
+-------------+--------+
| Department ?| Manager|
+-------------+--------+
| IT ? ? ? ? ?| John ? |
| HR ? ? ? ? ?| Mike ? |
| Sales ? ? ? | Sam ? ?|
+-------------+--------+
SELECT employees.Name, employees.Department, departments.Manager
FROM employees
LEFT JOIN departments ON employees.Department = departments.Department;
+--------+-------------+--------+
| Name ? | Department ?| Manager|
+--------+-------------+--------+
| Alice ?| IT ? ? ? ? ?| John ? |
| Bob ? ?| HR ? ? ? ? ?| Mike ? |
| Charlie| Finance ? ? | NULL ? |
+--------+-------------+--------+
(1)LEFT JOIN 的关键点在于保留左表的所有行,即使在右表中没有匹配的行,也会显示左表的数据。