inner join / left join / right join

发布时间:2023年12月19日

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 的关键点在于保留左表的所有行,即使在右表中没有匹配的行,也会显示左表的数据。

right join

1.语法

2.查询方式及结果

3.示例

(1)表:
(2)查询
(3)查询结果

4.其它?

文章来源:https://blog.csdn.net/qq_50853940/article/details/135091885
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。