SQL语言INNER JOIN怎样实现内连接 SQL语言必须掌握的表关联技巧

嘿,你问我INNER JOIN是什么?让我告诉你我上次陷入的陷阱,这可能对你有帮助。

2 02 3 年,我在上海一家商场做数据分析,第一次写关系型SQL表时犯了一个错误。
当时我想查看客户购买了哪些订单,所以就简单的写了: sql 选择客户.名称、订单.订单ID 来自客户 内连接订单 ON Customers.Name = Orders.CustomerName;
结果?一个空间!后来发现Customers表是张三,Orders表是张三,但是数据库字段是区分大小写的。
我立即意识到 INNER JOIN 必须使用完全匹配的列,并且最好创建索引。

就ON子句而言,我想举个例子。
例如,检查下订单的客户的姓名和订单号: sql SELECT c.CustomerName, o.OrderID 来自客户 AS c INNER JOIN 命令 AS 或 ON c.CustomerID = o.CustomerID;
看到了吗? ON 后面是实际关联的列,例如B. 客户 ID。
这里的 ON 子句仅连接具有相同客户 ID 的行,任何不匹配的行(例如从未下过订单的客户或订单中没有客户)都将被删除。

与其他JOIN相比,INNER JOIN是最简单粗暴的,因为它只需要两个表的“交集”。
想一想,LEFT JOIN 需要所有左表,如果没有匹配,则右表为空。
RIGHT JOIN 的作用相反。
FULL JOIN就更夸张了。
两个表都有所有内容,如果没有匹配,则输入 NULL。
但 INNER JOIN 是一条死胡同。
双方必须同意才需要这样做,结果才是最干净的。

给你一些使用场景: 1 、只查看已下订单的客户:检查orders表和customers表。
INNER JOIN 确保每个客户在出现之前都必须有订单。
2 .数据质量问题验证:INNER JOIN结果低于预期?表中的数据很可能丢失或不正确。
例如,订单表中的客户 ID 与客户表记录不对应。
3 .合并核心信息:例如链接产品表和订单项目表,INNER JOIN只存储实际销售的产品记录。

要快速执行INNER JOIN,有以下几点很重要: 1 .连接列创建索引!例如: sql 在客户上创建索引 idx_customerid_customers(CustomerID); 在订单(客户 ID)上创建索引 idx_customerid_orders;
2 使用WHERE过滤数据:不要先JOIN再过滤,这样最慢。
例如,查看 2 02 3 年的订单: sql SELECT c.CustomerName, o.OrderID 来自客户 AS c INNER JOIN 命令 AS 或 ON c.CustomerID = o.CustomerID 其中 o.OrderDate >= '2 02 3 -01 -01 ' AND o.OrderDate < '2 02 4 -01 -01 ';
3 .不要连接无用的表:选择您需要的列并仅连接存在这些列的表。
4 、列类型必须一致:比如INT连接VARCHAR,数据库会疯狂转换类型,速度非常慢。

上次创建电子商务平台报告时,我有客户、订单、订单项目和产品表。
链接: sql SELECT c.CustomerName、o.OrderDate、p.ProductName、oi.Quantity、p.Price、(oi.Quantityp.Price) AS TotalItemPrice 来自客户 AS c INNER JOIN 订单 AS o ON c.CustomerID = o.CustomerID INNER JOIN OrderItems AS oi ON o.OrderID = oi.OrderID 内连接产品 AS p ON oi.ProductID = p.ProductID WHERE o.OrderDate >= '2 02 4 -01 -01 ';
连接时,我一步步进行:首先连接客户和订单,确认ON条件是否正确;然后连接订单商品,检查订单ID是否匹配。
最后连接产品表。
这意味着错误的概率显着降低。

无论如何,请记住 INNER JOIN 是完全匹配的,并且结果是干净的。
索引、WHERE、表选择和一致的数据类型可以让您的 SQL 保持快速运行。
先尝试一下,如果您有任何疑问,我会向您解释。

mysql中jion用法 mysql表连接查询教程

说白了,JOIN就是连接表。

INNER JOIN 是最常用的。
只需选择两个表格重叠的部分即可。
例如,订单表和客户表通过客户 ID 链接。
sql SELECT 订单.订单 ID、客户.客户名称 FROMordersINNERJOINcustomersONorders.customer_id =customers.customer_id;
仅当客户有订单时才显示结果。

LEFT JOIN 搜索左表中的所有内容。
如果没有匹配,则右表留空。
例如,对于所有客户,无订单order_id为NULL。
sql SELECT 客户.客户_id、客户.客户_名称、订单.订单_id FROM Customers LEFT JOIN 订单 ONcustomers.customer_id =orders.customer_id;
拥有所有客户,没有订单的 order_id 为 NULL。

RIGHT JOIN 反之亦然。
想要从桌子到右边的所有东西。
左表没有匹配项,留空。
谨慎使用,一般不使用。

FULL OUTER JOIN 需要左表和右表。
MySQL 并不直接支持它。
您必须使用 LEFT JOIN 加 RIGHT JOIN。
sql SELECT FROM Table 1 LEFT TABLE 2 JOIN ON ... UNION SELECT FROM Table 1 RIGHT JOIN Table 2 ON ...;
全部可用,不匹配的留空。

性能的关键取决于索引。
链接的列必须被索引,否则整个表将被扫描和锁定。
使用 EXPLAIN 查看执行计划。
放慢速度并优化。

处理 NULL 值时要小心。
LEFT JOIN 的右表可以为空。
sql IFNULL(orders.order_id, '无订单') AS order_status
空值变为'无订单'。

不要一次写出非常困难的复杂问题。
先简单JOIN,再添加条件。
将其分解为几个步骤尤其困难。

谨慎使用多表 JOIN。
一般不超过4 张桌子。
连接的表越多,速度就越慢。
sql SELECT o.order_id、c.customer_name、p.product_name FROM 订单 o 内部 JOIN 客户 c ON o.customer_id = c.customer_id INNER JOIN order_details od ON o.order_id = od.order_id INNER JOIN products p ON od.product_id = p.product_id;
以这种方式连接三个表已经有点慢了。

子查询和UNION也可以达到类似的效果,但JOIN通常更直观。
子查询适合在链接表中搜索单个值。
JOIN适合多领域关联。

记住:索引、字段少、检查表数。
sql SELECT 客户名称, COUNT(订单 ID) AS 订单计数 来自客户 c LEFT JOIN 订单 o ON c.customer_id = o.customer_id AND o.order_date > '01 -01 -2 02 3 ' GROUP BY customer_id;
JOIN 条件,日期大于 2 02 3 年 1 月 1 日。

这是第一个。