Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1

Mysql的join…on…and…与join…on…where…的区别

Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1的区别

建表和数据准备

创建左表和右表,以及建表语句和数据插入

create table tab_left(
 id int,
 name int,
 age int,
 sex int
);
insert into tab_left values(1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6);

create table tab_right(
	id int,
	state int,
	money int
);
insert into tab_right values(1,1,1),(2,2,2),(3,3,3),(4,4,4),(7,7,7),(8,8,8);

查看tab_left数据

select * from tab_left;

Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第1张图片
查看表tab_right数据

select * from tab_right;

Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第2张图片

内连接

两者无区别

通过id进行内连接,以及指定左表的name等于一个特定值,只能得到name等于特定值的记录。

select * from tab_left l join tab_right r on l.id=r.id where l.name=2;

select * from tab_left l join tab_right r on l.id=r.id and l.name=2;

结果一致
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第3张图片

select * from tab_left l join tab_right r on l.id=r.id and r.state=8;

内连接后,8不包含,where过滤无记录,所以为null
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第4张图片

左连接(右连接类似)

join...on....and... 在左连接(右连接)符合条件进行内连接,不符合进行外连接

join...on...where...,先进行外连接,在进行过滤

where 1
select * from tab_left l left join tab_right r on l.id=r.id where l.name=2;

先通过id进行外连接,再过滤name等于特定值的记录。
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第5张图片

and 1
select * from tab_left l left join tab_right r on l.id=r.id and l.name=2;

如果只进行左连接,1到4应该进行内连接,5到6进行外连接,

加上name的连接条件就下 相当于 只对符合条件的进行内连接,其它使用外连接。只有2符合,进行内连接
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第6张图片

where 2
select * from tab_left l left join tab_right r on l.id=r.id where r.state=3;

先通过id进行外连接,再过滤state等于特定值的记录。
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第7张图片

and 2
select * from tab_left l left join tab_right r on l.id=r.id and r.state=3;

如果只进行左连接,1到4应该进行内连接,5到6进行外连接,

加上state的连接条件就下 相当于 只对符合条件的进行内连接,其它使用外连接。只有3符合,进行内连接
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第8张图片

and 3
select * from tab_left l left join tab_right r on l.id=r.id and r.state=8;

如果只进行左连接,1到4应该进行内连接,5到6进行外连接,

加上state的连接条件就下 相当于 只对符合条件的进行内连接,其它使用外连接。没有符合条件的,所以右边全为null。
Mysql A left(right) join B on A.id=B.id and A.age=1与A left(right) join B on A.id=B.id where A.age=1_第9张图片

你可能感兴趣的:(数据库,mysql,数据库)