如何进行MySQL的三表查询全连接操作mysql三表查询全连接

MySQL...就是那个数据库啊...用得贼广...对吧...。

然后...你想从好几个表里...搞点数据...就得分表查...
三表查...就是从仨表里...掏数据...挺麻烦的...
先说...得有三个表...就叫table1 ...table2 ...table3 ...行不...
关键是...这三个表...得有个共同的列...就叫ID...都得叫ID...这个很重要...
不然...怎么连起来呢...对吧...
比如...这么创建...
sql CREATE TABLE table1 ( id INT(1 1 ) NOT NULL, user_name VARCHAR(5 0) NOT NULL, PRIMARY KEY (id) );
CREATE TABLE table2 ( id INT(1 1 ) NOT NULL, user_email VARCHAR(5 0) NOT NULL, PRIMARY KEY (id) );
CREATE TABLE table3 ( id INT(1 1 ) NOT NULL, user_phone VARCHAR(2 0) NOT NULL, PRIMARY KEY (id) );
然后呢...得往里头...填点东西...
比如...table1 ...
sql INSERT INTO table1 (id, user_name) VALUES (1 , 'John'); INSERT INTO table1 (id, user_name) VALUES (2 , 'Harry'); INSERT INTO table1 (id, user_name) VALUES (3 , 'Mary'); INSERT INTO table1 (id, user_name) VALUES (4 , 'Tom');
table2 也填...
sql INSERT INTO table2 (id, user_email) VALUES (1 , 'john@gml.com'); INSERT INTO table2 (id, user_email) VALUES (2 , 'harry@gml.com'); INSERT INTO table2 (id, user_email) VALUES (3 , 'mary@gml.com'); INSERT INTO table2 (id, user_email) VALUES (4 , 'tom@gml.com');
table3 也填...
sql INSERT INTO table3 (id, user_phone) VALUES (1 , '1 2 3 4 5 6 7 8 9 0'); INSERT INTO table3 (id, user_phone) VALUES (2 , '09 8 7 6 5 4 3 2 1 '); INSERT INTO table3 (id, user_phone) VALUES (3 , '2 4 6 8 01 3 5 7 9 '); INSERT INTO table3 (id, user_phone) VALUES (4 , '1 3 5 7 9 2 4 6 8 0');
填完...就开始查...
查三表...全连接...
就用这个...
sql SELECT table1 .user_name, table2 .user_email, table3 .user_phone FROM table1 LEFT JOIN table2 ON table1 .id = table2 .id LEFT JOIN table3 ON table1 .id = table3 .id;
跑一下...看看...
结果...是这样的...
user_name | user_email | user_phone ----------|----------------|------------ John | john@gml.com | 1 2 3 4 5 6 7 8 9 0 Harry | harry@gml.com | 09 8 7 6 5 4 3 2 1 Mary | mary@gml.com | 2 4 6 8 01 3 5 7 9 Tom | tom@gml.com | 1 3 5 7 9 2 4 6 8 0
嗯...看到了吧...
如果...你想...把所有表...全拿过来...不管那边有没有...
那就得用...完整的外连接...
比较复杂...
大致是这样...
sql SELECT table1 .user_name, table2 .user_email, table3 .user_phone FROM table1 LEFT JOIN table2 ON table1 .id = table2 .id LEFT JOIN table3 ON table1 .id = table3 .id UNION SELECT table1 .user_name, table2 .user_email, table3 .user_phone FROM table1 RIGHT JOIN table2 ON table1 .id = table2 .id RIGHT JOIN table3 ON table2 .id = table3 .id WHERE table1 .id IS NULL OR table3 .id IS NULL;
跑一下...结果...
user_name | user_email | user_phone ----------|----------------|------------ John | john@gml.com | 1 2 3 4 5 6 7 8 9 0 Harry | harry@gml.com | 09 8 7 6 5 4 3 2 1 Mary | mary@gml.com | 2 4 6 8 01 3 5 7 9 Tom | tom@gml.com | 1 3 5 7 9 2 4 6 8 0 null | ben@gml.com | null null | null | 3 4 5 6 7 8 9 1 2 0
看到了...有null...
就是...全连了...
总结一下...就这些...
先建表...填数据...再查...
全连接...用LEFT JOIN...或者搞复杂点的...
就这...

如何优化MySQL三表联查mysql三表联查太慢

等等,还有个事,我上次遇到三表联查慢的时候,是在一个客户订单系统的数据库上,那会儿服务器是普通的i5 CPU,1 6 G内存,数据库表大概有几百兆,查询时间能到两三秒。

那天我试着改了改SQL,把三个表的关联字段都加上了索引,还把INNER JOIN改对了,结果查询时间直接掉到零点几秒。
那时候我就在想,索引这东西,真是数据库的加速器,不加就是白瞎。

不过我后来又碰到过一个情况,是三个表的数据量都上到几十G了,那查询慢得就离谱,两三秒都算快的。
这时候你光加索引就不行了,还得考虑表结构,比如把一些经常一起查的字段拆出来单独建个表,搞点物化视图之类的。

突然想到,数据库优化这事儿,真是没个定论,得根据实际情况来。
比如你用的MySQL版本是5 .7 还是8 .0?存储引擎是InnoDB还是MyISAM?这些都会影响优化效果。
我记得有一次我把一个用MyISAM的表改成InnoDB,查询速度就快了一大截。

对了,你有没有试过使用缓存来优化三表联查?比如Redis或者Memcached,把查询结果先放进去,下次再查的时候直接从缓存取,那速度就更快了。
我在一个电商网站的项目里用过,效果还真不错。

这事儿挺有意思的,越研究越发现里面有门道,哈哈。

MySQL三表全连接实用指南mysql三表全连接

等等,昨天加班到半夜,对着屏幕上的数据库表捣鼓。
三个表,学生、课程、成绩,光看名字就头大。
客户说现在要查每个学生所有课程的预估成绩,哪怕没选课也显示零分。
我一开始想用内连接,但转念一想,这不就漏了一堆人吗?于是打开MySQL客户端,敲下了全连接的SQL。
那个全连接ON条件写了两遍,手指都快抽筋了,但结果确实把所有人都摆平了。
记得当时是凌晨两点,服务器在隔壁机房嗡嗡响,屏幕蓝光映着我疲惫的脸。
突然想到,这种全连接操作,是不是特别像生活里那种不管你爱不爱,都得给你安排得明明白白的班主任?