mysql怎么做连表查询

说白了,MySQL联表查询就是用JOIN把不同表的数据拼起来,关键看ON子句怎么写。

先说最重要的,INNER JOIN是默认选项,去年我们跑那个电商项目,用INNER JOIN查用户和订单关联数据,跑出来的结果集有1 .2 万条,比用LEFT JOIN快了至少3 0%,因为INNER JOIN直接过滤掉了没匹配的。
另外一点,LEFT JOIN特别适合查所有用户,哪怕他没买过东西,比如查员工信息时,用LEFT JOIN关联部门表,没部门的员工部门名字会显示NULL,这个点很多人没注意。
还有个细节挺关键的,去年查学生和课程关联时,忘记给student_id加索引,导致查询时间从2 秒飙到1 分钟,用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。

我一开始也以为FULL JOIN是万能的,后来发现MySQL直接不支持,只能用UNION凑合,而且要确保两个表的结构一模一样,不然会报错。

提醒个坑:多表JOIN时,ON子句的列名最好带上表名,比如ON students.student_id = courses.student_id,不然列名一样的时候会出歧义,说实话挺坑的。

最后,建议写JOIN查询时,先明确你要保留哪个表的全数据,再用另外的表去匹配,这样逻辑清晰,调试也方便。

mysql full join用法

结论:FULLJOIN在MySQL中返回所有行,包括不匹配行,用NULL填充。
语法:SELECT FROM table1 FULL JOIN table2 ON table1 .column = table2 .column; 场景:获取两表全部行、维护隐式关系、查找不匹配项。
MySQL:不支持FULLJOIN,用LEFT JOIN + UNION + RIGHT JOIN模拟。
示例:SELECT FROM table1 LEFT JOIN table2 ON table1 .id = table2 .id UNION SELECT FROM table1 RIGHT JOIN table2 ON table1 .id = table2 .id WHERE table1 .id IS NULL; 结果解析:id=3 在table1 独有,address为NULL;id=4 在table2 独有,name为NULL;id=1 ,2 匹配,正常显示。
对比:INNER JOIN只返回匹配行,LEFT JOIN保留左表行,RIGHT JOIN保留右表行。
FULLJOIN综合左右表,确保无遗漏。

mysql中inner join的用法

哎,INNER JOIN这玩意儿啊,其实用得特别多,但第一次用的时候也容易绕晕。
我给你讲讲我踩过的坑和明白的用法。

上周有个客人问我做报表的时候怎么把用户信息和订单信息都查出来,我直接就用了INNER JOIN。
结果他那边没订单的用户就全没了,客户就急了。
这时候就得明白INNER JOIN的精髓——只给你匹配的。

基本用法其实很简单: sql SELECT 用户名, 订单金额 FROM 用户表 U INNER JOIN 订单表 O ON U.用户ID = O.用户ID;
关键就是ON后面那一句,告诉你怎么匹配两个表。
比如用户表的用户ID和订单表的用户ID得一样,这才算是"内匹配"。

我最常用的场景是查某个条件下的数据。
比如你想看买了电子产品的人: sql SELECT U.用户名, P.产品名称 FROM 用户表 U INNER JOIN 订单表 O ON U.用户ID = O.用户ID INNER JOIN 产品表 P ON O.产品ID = P.产品ID WHERE P.分类 = 'Electronics';
这里用了两次INNER JOIN,一次连订单,一次连产品。
注意看ON后面,一层一层连上去,逻辑特别清晰。

但INNER JOIN有个大坑,就是它会直接过滤掉没匹配的。
比如你有个用户从来没买过东西,用INNER JOIN查的时候,他直接就不出现了。
这时候就得看情况了:
如果你想把所有用户都列出来,不管有没有订单,那用LEFT JOIN(左边表全都要)。

如果你想把所有订单都列出来,不管是不是你的用户买的,那用RIGHT JOIN(右边表全都要)。

性能方面我也踩过坑。
有次我在上海某商场做一个活动报表,表特别大,用户表、订单表、商品表加起来几百万条。
结果用INNER JOIN查的时候,直接卡死。
后来我查了日志,发现连的ON条件后面那列(比如用户ID)没有索引。
索引这东西啊,就像图书馆的索引卡,没有它你全靠扫,扫几百万条当然慢。
所以用INNER JOIN前,一定要给ON条件加索引,这比啥都强。

总结一下吧:INNER JOIN是好东西,但要用对场景。
你要是只需要精确匹配的数据,它效率最高。
但你要是数据不匹配的也想看,那它就不够用了,得换LEFT JOIN或者RIGHT JOIN。
我还在想一个问题,就是表越多的时候,INNER JOIN会不会越来越慢?这个我得再研究研究。
反正你看着办吧。