SQL join用法

MySQL/Oracle等都是关系型数据库,即查询数据时需要关联多个表一起查询。
以下示例使用DB是MySQL 5.6.16
示例数据如下(创建表的SQL见文末,数据就自己填吧,暴露了是水哥的粉丝。。。)
members表
这里写图片描述
groups表
这里写图片描述

join

1. cross join

2种格式:

select * from members, groups;
select * from members join groups;

这里写图片描述
分析:返回的结果总数是两个表的行数的笛卡儿积,即全组合,6 * 3 = 18条结果。

2. inner join(join & where条件语法)

3种格式

select * from members m inner join groups g on m.group_id = g.group_id;
select * from members m join groups g on m.group_id = g.group_id;
select * from members m, groups g where m.group_id = g.group_id;

这里写图片描述

分析:以上3中查询方式返回的结果都是一致的,返回的是在两个表中都有匹配的数据,即查到的结果中不存在没有group的member(members表中的member_name = ‘魏魏’),也不存在没有member的group。

TIPS:
引入join后,就有了左表和右表的概念,很简单,SQL语句中,写在join关键字左边的就是左表,写在右边的就是右表。如果是查询表中所有列(即join时不指定表的某些列),那么返回的结果集中会先显示左表的列,再显示右表的列。下同。

3. outer join(left join & right join & full join)

outer join是相对 inner join 来说的,可以根据需要选择是全部展示出左表中的数据,或者全部展示出右表中的数据。

  • left join(left outer join)
    2种格式
select * from members m left join groups g on m.group_id = g.group_id;
select * from members m left outer join groups g on m.group_id = g.group_id;

这里写图片描述
分析:①注意与inner join不同的是,这次把“魏魏”这条数据也查出来了,其对应的group信息都是null;②left join是 left outer join的一种简写方式。

  • right join(right outer join)
    也是2种格式
select * from members m right join groups g on m.group_id = g.group_id;
select * from members m right outer join groups g on m.group_id = g.group_id;

这里写图片描述
分析:①注意与inner join不同的是,这次把“云之队”这条数据也查出来了,其对应的members信息都是null;②与left join 不同的是,“魏魏”这条数据没有查出来;③right join是 right outer join的一种简写方式。

  • full join
select * from members m full join groups g on m.group_id = g.group_id; -- 尴尬,MySQL不支持full join,替代方法如下

select * from members m left join groups g on m.group_id = g.group_id
union
select * from members m right join groups g on m.group_id = g.group_id;

这里写图片描述
分析:可以看到full join 将左表和右表的所有数据都展示出来了。

5. 嵌套查询(子查询)

场景:查询members表中和小珩是同一个group的成员
下面分别给出嵌套查询和使用join的两种格式:

select * from members m where m.group_id =
    ( select m.group_id from members m where m.member_name = '小珩'); -- 嵌套查询
select m1.member_id, m1.member_name, m1.group_id from members m1, members m2 where m1.group_id = m2.group_id and m2.member_name = '小珩'; -- join查询

查看下速度,再选择最优的方法:

select * from members m where m.group_id =
    ( select m.group_id from members m where m.member_name = '小珩');
/* 受影响行数: 0  已找到记录: 3  警告: 0  持续时间 1 查询: 0.016 sec. */
-- 嵌套查询
select m1.member_id, m1.member_name, m1.group_id from members m1, members m2 where m1.group_id = m2.group_id and m2.member_name = '小珩';
/* 受影响行数: 0  已找到记录: 3  警告: 0  持续时间 1 查询: 0.015 sec. */

好吧(╯▽╰),数据少的情况下是差不多的,但是有人说相对来说join会快一些,如果数据量多的时候还是要比较一下两种方法的优劣。

union

篇幅有点长,放下一篇写吧。。。

参考:
1.实践出真知;
2.可以参考w3 school: http://www.w3school.com.cn/sql/sql_join.asp
3.或者是MySQL官网文档: https://dev.mysql.com/doc/refman/8.0/en/join.html*


附:创建表的SQL

-- members的创建语句
CREATE TABLE `members` (
    `member_id` INT(11) NOT NULL COMMENT '成员id',
    `member_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
    `group_id` INT(11) NULL DEFAULT NULL COMMENT '队id'
)
COMMENT='成员'
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

-- groups的创建语句
CREATE TABLE `groups` (
    `group_id` INT(11) NOT NULL COMMENT '队id',
    `group_name` VARCHAR(64) NOT NULL COMMENT '队名称' COLLATE 'utf8mb4_unicode_ci'
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值