sql中inner join怎么使用 手把手教你inner join的3种常见用法与实例

嘿,你问我INNER JOIN是吧?行,我给你拆解拆解,保证你一听就懂。

上周有个客户问我,为啥他写的JOIN语句有时候跑得慢,有时候又快。
我就拿INNER JOIN给他举例。

最基本的INNER JOIN:基于等值的连接
这玩意儿最简单了,就是找两个表里能对上号的行。
比如你有个customers表,存客户ID和名字;还有个orders表,存订单ID、客户ID和金额。

你想查谁下过订单,名字和订单金额怎么对上,就用INNER JOIN。
这SQL写得明明白白:
sql SELECT c.customer_name, o.order_amount FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id;
关键点:就这ON c.customer_id = o.customer_id,告诉数据库用customer_id这列来对表。
结果里只会有那些在orders表里有订单的客户,没下过订单的自动筛掉了。

多表INNER JOIN:连接三个或更多表
有时候一个事儿得看好几张表。
比如你想查客户买了啥,就得再拉个products表进来。

还是刚才那俩表,再加个products表,存产品ID和产品名。
你想看客户名、订单金额、买了啥,就得连三张表:
sql SELECT c.customer_name, o.order_amount, p.product_name FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id INNER JOIN products p ON o.product_id = p.product_id;
注意:这连接顺序有点讲究,一般是先连能对上最多关系的表。
比如先连customers和orders,因为每个订单都对应一个客户;然后再连orders和products。

用WHERE子句过滤INNER JOIN的结果
连接完了,你发现只想看订单金额大于1 00的。
这时候就得加个WHERE子句。

sql SELECT c.customer_name, o.order_amount FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id WHERE o.order_amount > 1 00;
注意:这WHERE放的位置很重要。
放ON前面和后面,查询逻辑可能不一样。
通常把ON放前面干连接,WHERE放后面干过滤。

---
性能优化建议
这玩意儿用多了,SQL跑慢是迟早的事。

1 . 创建索引:在连接字段上必须加索引,比如customer_id、product_id。
不加索引,数据库得像大海捞针一样一个个比对,超慢的。
sql CREATE INDEX idx_customer_id ON customers(customer_id); CREATE INDEX idx_product_id ON products(product_id);
2 . 避免全表扫描:不加索引,或者WHERE子句写得不好,就可能全表扫描。
比如WHERE customer_name = '张三',如果customer_name没索引,那customers表就得全扫一遍。

3 . 减少函数使用:如果在ON条件里用函数,比如UPPER(c.customer_name) = '张三',那索引就白用了,因为数据库得先跑函数再比对。

4 . 用EXPLAIN分析:不确定查询咋跑的,用EXPLAIN看看执行计划。
比如: sql EXPLAIN SELECT c.customer_name, o.order_amount FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id; 看看是不是用了索引,是不是在扫描全表。

---
INNER JOIN与LEFT JOIN的区别
这俩是面试必考,你可得分清。

INNER JOIN:只给你俩表里都有的数据,没对上号的直接没。
LEFT JOIN:左表(写在前面的表)所有数据都给你,右表没对上号的就填NULL。
比如查所有客户,不管他下没下订单,下过订单的显示订单信息,没下的订单相关字段就NULL。

怎么选?
你要严格匹配,比如查下过订单的客户(INNER JOIN),就找orders表里有记录的客户。
你要保留左表所有记录,哪怕右表没数据(LEFT JOIN)。
比如查所有客户及其订单状态,不管有没订单,都得显示客户信息,没订单就NULL。

替代方案:RIGHT JOIN和FULL JOIN
RIGHT JOIN:跟LEFT JOIN反过来,是右表所有数据,左表没对上号的填NULL。
FULL JOIN:俩表所有数据,没对上号的都填NULL。

注意:RIGHT JOIN和FULL JOIN用得少,因为数据库支持的不多。
FULL JOIN很多数据库(比如MySQL)都不支持,搞不好还得换写法。
所以能不用就别用,INNER JOIN和LEFT JOIN基本够用了。

---
反正你看着办吧,别把JOIN和WHERE放反了就行。
有啥不明白的随时问我。

这堆代码是啥意思?
这代码是百度知道网站的页面结构和功能实现的一部分。
它包括:
1 . 网站版权和备案信息。
2 . 百度统计代码,用于跟踪用户行为。
3 . JavaScript代码,用于实现页面交互和功能。

简单来说,就是网站的技术实现细节。

sql中的innerjoin和join有什么区别

记得有一次,我帮一个朋友处理一个销售数据查询,他的需求是从销售表和客户表里找出所有客户的名字和对应的销售金额。
我写了一个查询,用INNER JOIN写了,然后他看了看我写的代码,说:“等等,为什么不用JOIN呢?INNERJOIN看起来有点多余。
” 我当时也没多想,就解释说:“其实INNERJOIN和JOIN是一样的,都是内连接,只是INNERJOIN更正式一些。
” 他听了之后点了点头,但是我还是突然想到,如果将来有人看到这个查询,可能也会像我朋友一样疑惑,为什么不用JOIN?所以,虽然两者功能相同,但使用INNERJOIN可能在某些情况下能增加代码的可读性。