外连接:
左连接:left join 或 left outer join
以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空。
创建user表,用于记录用户
user_id | username |
---|---|
1 | 王一 |
2 | 李二 |
3 | 张三 |
创建log表,用于记录用户的消费情况
user_id | logging |
---|---|
1 | 100 |
2 | 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_id | username | user_id1 | logging |
---|---|---|---|
1 | 王一 | 1 | 100 |
2 | 李二 | 2 | 200 |
3 | 张三 | NULL | 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;
查询结果:
user_id | username | user_id1 | logging |
---|---|---|---|
1 | 王一 | 1 | 100 |
2 | 李二 | 2 | 200 |
右表中只有两条数据对应着左表中的两条数据,因为是右连接,以右面的为基础,右面没有的,左面有的就会被舍弃。
全连接:
注:MySQL并不支持full join,不过可以通过union 关键字来合并 left join 与 right join来模拟full join.
创建course表:
id | course_name | stu_id |
---|---|---|
1 | 数学 | 1 |
2 | 语文 | 2 |
3 | 英语 | 4 |
4 | 生物 | 3 |
创建student表:
stu_id | stu_name |
---|---|
1 | 王一 |
2 | 李二 |
3 | 张三 |
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_id | stu_name | id | course_name | stu_id1 |
---|---|---|---|---|
1 | 王一 | 1 | 数学 | 1 |
2 | 李二 | 2 | 语文 | 2 |
3 | 张三 | 4 | 生物 | 3 |
5 | 李四 | NULL | NULL | NULL |
NULL | NULL | 3 | 英语 | 4 |
交叉连接 cross join:
交叉连接得到的是两个表的乘积,也叫笛卡儿积
还是上面的表执行sql语句:
select * from student cross join course;
得到结果如下:
stu_id | stu_name | id | course_name | stu_id1 |
---|---|---|---|---|
1 | 王一 | 1 | 数学 | 1 |
2 | 李二 | 1 | 数学 | 1 |
3 | 张三 | 1 | 数学 | 1 |
5 | 李四 | 1 | 数学 | 1 |
1 | 王一 | 2 | 语文 | 2 |
2 | 李二 | 2 | 语文 | 2 |
3 | 张三 | 2 | 语文 | 2 |
5 | 李四 | 2 | 语文 | 2 |
1 | 王一 | 3 | 英语 | 4 |
2 | 李二 | 3 | 英语 | 4 |
3 | 张三 | 3 | 英语 | 4 |
5 | 李四 | 3 | 英语 | 4 |
1 | 王一 | 4 | 生物 | 3 |
2 | 李二 | 4 | 生物 | 3 |
3 | 张三 | 4 | 生物 | 3 |
5 | 李四 | 4 | 生物 | 3 |
注:如果不写连接条件,默认也是得到表的笛卡儿积,下面的sql语句中两个表只用了,
隔开,得到的结果和上面的一样
select * from student,course;
内连接(等值连接): inner join ,=
,>=
,<=
,<
,>
注意内连接不分左表和右表,只是把两个表相对应的数据查出来,自动忽略不对应的数据。
user表,用于记录用户
user_id | username |
---|---|
1 | 王一 |
2 | 李二 |
3 | 张三 |
log表,用于记录用户的消费情况
user_id | logging |
---|---|
1 | 100 |
2 | 200 |
执行下面的语句
select * from user inner join log on user.user_id=log.user_id;
select * from user,log where user.user_id=log.user_id;
查询结果:
user_id | username | user_id1 | logging |
---|---|---|---|
1 | 王一 | 1 | 100 |
2 | 李二 | 2 | 200 |