mysql inner join left join ,right join区别

inner join 内连接,left join 左连接,right join右连接;

create table if not exists `Persons` (
	Id_P smallint not null,
	LastName varchar(25) not null,
	FirstName varchar(50) not null,
	Address varchar(100) not null,
	City varchar(25) not null
)charset utf8;
insert into Persons  values
 ('1', 'Adams', 'John', 'Oxford Street', 'London'),
 ('2', 'Bush', 'George', 'Fifth Avenue', 'New York'),
 ('3', 'Carter', 'Thomas', 'Changan Street', 'Beijing');

create table if not exists Orders(
	Id_O smallint not null,
	OrderNO int not null,
	Id_P smallint not null
)charset utf8;

insert into Orders values
(1, 77895, 3),
(2, 44678, 3),
(3, 22456, 1),
(4, 24256, 1),
(5, 34764, 65);

先来看看inner join

select * from Persons inner join Orders on Persons.Id_P = Orders.Id_P;

会发现,得出的每一条数据都不会有空值 。

再来看看左连接:

select * from Persons left join Orders on Persons.Id_P = Orders.Id_P;

会发现,右边会出现空值 ,也就是说左边的为准,左边是指persons表,你会在左连接的表中找到Persons表的三条完整的数据 ,如果在Orders表中没有数据,则用null来补全。同理,右连接也是这个道理。

select * from Persons right join Orders on Persons.Id_P = Orders.Id_P;

以右边的Orders的5条数据为准,可以在右连接的表中完完找出Orders的5条数据,如果左边对应不上则用null值来比较。

select * from Persons inner join Orders on Persons.Id_P > Orders.Id_P;

细看上面的语句,找出Persons.Id_P 大于 Orders.Id_P的数据。首先先从Persons的第一条数据开始找,然后对就Orders表,看看有哪一条是数据是比Persons的Id_p少的,然后挑选出来,其实就两个foreach循环。按照上面的原理,你可以试试左右连接的> 和 <; 

其实内连接就是左右连接的集合。下面来做一下下面的例子:

有一张表是用来记录每天的收入table rmb,要求计算出当天以上的总收入。

DROP TABLE IF EXISTS `rmb`;
CREATE TABLE `rmb` (
  `date` char(8) NOT NULL,
  `rmb` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `rmb` VALUES ('20140301',100),('20140302',50),('20140309',500);
#思路:首先进行自己连接查询:条件是小于或等于当天的日期,再以分组求和

select tmp1.`date`, tmp1.rmb, sum(tmp2.rmb) total from rmb as tmp1
left join rmb as tmp2 
on  tmp1.`date` >= tmp2.`date` group by tmp1.`date`;

create table if not exists `Match`(
matchID int not null primary key auto_increment,
hostTeamID int not null,
guestTeamID int not null,
matchResult varchar(20) not null,
matchTime datetime not null
)charset utf8;

create table Team(
temaID int not null primary key auto_increment,
temaName int not null
)charset utf8;
# 要求 Match的hostTeamID 与 guestTeamID 都 
# 与 Team中的teamID关联 查出
# 2014-03-01 到 2014-03-31之间举行的所有比赛,关且
    # 用以下形式列出
# 拜仁 2 : 0 不来梅 2014-03-21
# 思路:
# 先选出主队的队名
# 结果
# 再取出客队的名称
主要是采用三表查询:

select team.teamName, Matchresult, tmp.teamName, matchTime from `match`
left join team 
on hostTeamID = team.TeamID 
left join 
team as tmp 
on guestTeamID = tmp.TeamID where  MatchTime between '2014-03-01' and '2014-03-31';

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值