天天看点

MySQL内连接、外连接、交叉连接

外连接:

左连接:left join 或 left outer join

以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空。

创建user表,用于记录用户

user_id username
1 王一
2 李二
3 张三

创建log表,用于记录用户的消费情况

logging
100
200

分析用户的消费情况,每一个用户不一定都有消费,就要用到左连接,把每个用户的消费情况查出来,包括那些没有消费的用户。没有消费的显示为NULL。

select * from user left outer join log on user.user_id=log.user_id;
select * from user left join log on user.user_id=log.user_id;           

查询结果:

user_id1
NULL

右连接:right join 或 right outer join

以右边的表为基准,如果右表有数据,而左表没有数据,右表的数据正常显示,左表显示为空,定义完全和左连接相反。

select * from user right join log on user.user_id=log.user_id;
select * from user right outer join log on user.user_id=log.user_id;           

右表中只有两条数据对应着左表中的两条数据,因为是右连接,以右面的为基础,右面没有的,左面有的就会被舍弃。

全连接:

注:MySQL并不支持full join,不过可以通过union 关键字来合并 left join 与 right join来模拟full join.

创建course表:

id course_name stu_id
数学
语文
英语 4
生物

创建student表:

stu_name
5 李四

执行下面语句:

select * from student left join course on student.stu_id=course.stu_id
union 
select * from student right join course on student.stu_id=course.stu_id;           
stu_id1

交叉连接 cross join:

交叉连接得到的是两个表的乘积,也叫笛卡儿积

还是上面的表执行sql语句:

select * from student cross join course;           

得到结果如下:

注:如果不写连接条件,默认也是得到表的笛卡儿积,下面的sql语句中两个表只用了

,

隔开,得到的结果和上面的一样

select * from student,course;           

内连接(等值连接): inner join ,

=

,

>=

<=

<

>

注意内连接不分左表和右表,只是把两个表相对应的数据查出来,自动忽略不对应的数据。

user表,用于记录用户

log表,用于记录用户的消费情况

执行下面的语句

select * from user inner join log on user.user_id=log.user_id;
select * from user,log where user.user_id=log.user_id;