mysql几种常见的连接方式

薄洪涛6年前数据库1365
内连接(inner join)

从两张表中取出所有记录做笛卡尔积;利用匹配条件进行匹配;如果内连接没有条件,那么其实就是交叉连接,这是我们应该避免的

clipboard.png

775005-20180917164533997-1623997790.gif

交叉连接

从两张表中取出所有记录做笛卡尔积,所有的结果都会进行保留;记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数 +  第二张表字段数(笛卡尔积),这里我们看到查询出来的记录数为16条

clipboard.png


外连接
按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据
外连接分为两种:左外连接left outer join|left join),右外连接right outer join|left join),写sql时可省略outer,直接写left join,right join
左外连接(left join)
确定主表,这里的order就是主表,左外连接就是拿主表的每一条记录,按照条件去匹配从表的每一条记录,如果满足匹配条件则保留;如果主表记录在从表中一条都没有匹配成功,那么也要保留该主表记录:从表对应的字段值都为NULL,可以看到主表userid为8的订单记录,找不到user表中的对应,所以对应的从表记录字段设置为NULL

clipboard.png

775005-20180917164714732-2096479565.gif

右外连接(right join)
和右外连接类似,这里的user就是主表,右外连接就是拿主表的每一条记录,按照条件去匹配从表的每一条记录,如果满足匹配条件则保留;如果主表记录在从表中一条都没有匹配成功,那么也要保留该主表记录:从表对应的字段值都未NULL,可以看到,user_name为bob和kitty的用户均没有对应的order记录,所以返回NULL

clipboard.png

775005-20180917164753527-12009198.gif

总结
左连接:主表 left join 从表 on 连接条件
右连接:从表 right join 主表 on连接条件
关于左连接和右连接总结性的一句话:
左连接where只影向右表,右连接where只影响左表
全连接

mysql不支持全连接,但是我们可以通过其他关键词组合起来完成全连接查询(其实全连接的数据就是左外连接和右外连接的集合),这里的意思就是获取所有的人,所有的订单,及关联数据

clipboard.png

775005-20180917164847755-1188439905.gif


相关文章

PostgreSQL不常用很有用的数据类型

PostgreSQL不常用很有用的数据类型

最近新项目开始,需要设计数据库,技术大佬用了很多我之前没见过的数据库数据类型,这里做个总结1.货币类型money类型存储固定小数精度的货币数字,表中展示的范围假设有两个小数位。可接受的输入格式很多,包...

记录一次从日志中恢复mysql数据库数据

记录一次从日志中恢复mysql数据库数据

前因:有个大佬在update的时候,忘记加where条件,造成线上数据库中的某个状态值全部被修改,需要马上处理首先面对这种情况,我马上想到的就是从二进制日志文件中恢复,马上查看是否开启了日志,确定开启...

Mongodb 排序导致内存不足

报错信息:MongoDB.Driver.MongoQueryException: QueryFailure flag was Executor error: OperationFailed: Sort...

GROUP_CONCAT用法

GROUP_CONCAT用法

应用场景表A有一条数据,表B有3条数据,通过  A left join B 可以展示出3条数据,如图但是我想让name在一行显示SELECT A.id, GROUP_CONCAT(B.n...

摘抄--别在MySQL中使用UTF-8

摘抄--别在MySQL中使用UTF-8

直接看复现过程insert into user (id,name,sex) values (1,'机智如我','男')[Err] 1366 -&nb...

CREATE TABLE 表名 AS SELECT 语句用法详解

新表不存在,创建新表1.创建新表并且携带数据create table new_table    as select *&...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。