inner join
1.语法
语法1:
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
语法2:
SELECT * FROM table1,table2 WHERE table1.column = table2.column;
2.查询方式及结果
(1)查询会对 table1
的每一行的 column
值依次和 table2
的每一行的 column
值进行比较
(2)table1
的每一行的column可能在table2中找到一条/多条/没有column相等的数据,找到几条,那一行的查询结果就是几条
(3)注意:如果table1的某一行没有在table2中找到column
相等的值,那么查询结果中是不会有那一行的数据的
3.示例
(1)表:users
+----+----------+
| ID | Username |
+----+----------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+----------+
表: orders
+---------+---------+
| OrderID | UserID |
+---------+---------+
| 101 | 1 |
| 102 | 1 |
| 103 | 2 |
| 104 | 5 |
+---------+---------+
(2)查询
SELECT users.ID, users.Username, orders.OrderID
FROM users, orders
WHERE users.ID = orders.UserID;
(3)查询结果
+----+----------+---------+
| ID | Username | OrderID |
+----+----------+---------+
| 1 | Alice | 101 |
| 1 | Alice | 102 |
| 2 | Bob | 103 |
+----+----------+---------+
4.其它
(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;
left join
1.语法
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
2.查询方式及结果
(1)拿左表的每一行的 column 去依次和右表的每一行的 column 对比。
(2)左表的每一行的 column 可能在右表中找到一条/多条/没有 column 相等的数据。
(3)如果左表的某一行没有在右表中找到 column 相等的值,查询结果中会有那一行的数据,但右表的列会显示为 NULL。
3.示例
(1)表:employees
+------+--------+-------------+
| EmpID| Name | Department |
+------+--------+-------------+
| 1 | Alice | IT |
| 2 | Bob | HR |
| 3 | Charlie| Finance |
+------+--------+-------------+
表: departments
+-------------+--------+
| Department | Manager|
+-------------+--------+
| IT | John |
| HR | Mike |
| Sales | Sam |
+-------------+--------+
(2)查询
SELECT employees.Name, employees.Department, departments.Manager
FROM employees
LEFT JOIN departments ON employees.Department = departments.Department;
(3)查询结果
+--------+-------------+--------+
| Name | Department | Manager|
+--------+-------------+--------+
| Alice | IT | John |
| Bob | HR | Mike |
| Charlie| Finance | NULL |
+--------+-------------+--------+
4.其它
(1)LEFT JOIN 的关键点在于保留左表的所有行,即使在右表中没有匹配的行,也会显示左表的数据。