参考文章:https://blog.csdn.net/chenmozhe22/article/details/83242481
1.左连接------left join:
查询的结果为:两个表格通过on关联的行,显示两个表格的该行的字段
左表所有数据信息全部不变,右表再去匹配左表
如果左边表格有数据,但右边表格没数据,则右表则使用null填充
table: students
id username sex classify score class_id
10000 alien 女 作家 57 1
10001 zhang 男 词人 27 2
10002 ping 女 酱油 31 3
10003 user-3 女 诗人 68 3
10004 user-4 男 作家 6 2
10012 user-12 女 词人 54 5
10018 user-18 自由职业 88 8
table: classes
class_id class_object class_name class_address
1 python2018级 张三 1号楼208室
2 java2017级 王五 8号楼606室
3 go2019级 李四 9号楼168室
9 大数据2018级 jack ma 6号楼222室
select * FROM students s left join classes c on s.class_id=c.class_id;
result:
id username sex classify score class_id class_id(1) class_object class_name class_address
10000 alien 女 作家 57 1 1 python2018级 张三 1号楼208室
10001 zhang 男 词人 27 2 2 java2017级 王五 8号楼606室
10004 user-4 男 作家 6 2 2 java2017级 王五 8号楼606室
10002 ping 女 酱油 31 3 3 go2019级 李四 9号楼168室
10003 user-3 女 诗人 68 3 3 go2019级 李四 9号楼168室
10012 user-12 女 词人 54 5 null null null null
10018 user-18 自由职业 88 8 null null null null
注意:
1.左表的排序,最终根据左表的class_id正序排列了
2.右表中,没有满足s.class_id=c.class_id的信息,全部都使用null填充了
2.右连接------right join:
查询的结果为两个表匹配到的数据
右表所有数据信息全部不变,左表再去匹配右表的数据
如果左表不存在数据, 左表则使用null填充与右表匹配
select * FROM students s right join classes c on s.class_id=c.class_id;
result:
id username sex classify score class_id class_id class_object class_name class_address
10000 alien 女 作家 57 1 1 python2018级 张三 1号楼208室
10001 zhang 男 词人 27 2 2 java2017级 王五 8号楼606室
10002 ping 女 酱油 31 3 3 go2019级 李四 9号楼168室
10003 user-3 女 诗人 68 3 3 go2019级 李四 9号楼168室
10004 user-4 男 作家 6 2 2 java2017级 王五 8号楼606室
null null null null null null 9 大数据2018级 jack ma 6号楼222室
注意:
1.所有的classes表的信息都显示出来了,且最终显示出来的结果信息,classes相关的行数,要比原始的数据多
2.students表中的class_id 没有在classes表class_id中的,都没有显示出来,例如class_id为[5,8]的信息都没显示
3.排序问题,先找到classes表中的class_id,然后再去students表中,从上到下去找对应s.class_id=c.class_id的相关信息;总体先按照classes原有的排序排列,如果classes表中的数据筛选完了,再去students中查找,看看是否还有没有对应classes信息,如果有就再填补classes信息,否者不填补筛选结束。
3.内连接------inner join:
查询的结果为两个表匹配到的数据,
最终显示完全符合左右2个表格的数据,即左右两个表格都有数据的才显示
如果某条数据左边或右边表格没有数据,则不显示
select * FROM students s inner join classes c on s.class_id=c.class_id;
result:
id username sex classify score class_id class_id class_object class_name class_address
10000 alien 女 作家 57 1 1 python2018级 张三 1号楼208室
10001 zhang 男 词人 27 2 2 java2017级 王五 8号楼606室
10002 ping 女 酱油 31 3 3 go2019级 李四 9号楼168室
10003 user-3 女 诗人 68 3 3 go2019级 李四 9号楼168室
10004 user-4 男 作家 6 2 2 java2017级 王五 8号楼606室
1.inner join 这个关联查询,最终得到的结果是2个表格,都符合s.class_id=c.class_id条件的信息才显示出来。
2.每个表格单独存在的信息,都不显示在最终的结果中。
4.全部集合------union:
查询两个表中相同的N个字段,先单独分组a,b临时表, 然后a,b再去重(可以理解为先分组再去重)
最终显示的是,N个选择的字段,并且代表2个表格里面所有的分组(group by)
删除两个表格里面重复的数据,最终只保留一条
注意点:
1.在union左右两个表格的结构必须一样,例如包括的字段数量、名称都一致
2.重复的数据只显示一份,删掉另一份,最终只保留2个表格里面全部的存量数据。
【原始表格:】
【上表重复的部分:】
SELECT id,num FROM num_a UNION SELECT id, num FROM num_b
原文链接:https://blog.csdn.net/chenmozhe22/article/details/83242481
标签:null,join,unijoin,class,classes,user,mysql,号楼,id From: https://www.cnblogs.com/wjs2019/p/18320944