您的位置:首页 > 其它

多表联合查询:join的用法

2016-06-23 17:48 302 查看
前提条件:假设有两个表,一个是学生表,一个是学生成绩表。



 表的数据有:






一、内连接-inner join :

1.概念:内联接是用比较运算符比较要联接列的值的联接

2.内连接:join 或 inner join

3.sql语句

select * from table1 join table2 on table1.id=table2.id


最常见的连接查询可能是这样,查出学生的名字和成绩:

select s.name,m.mark from student s,mark m where s.id=m.studentid


上面就是我们最常见的inner join,即内连接,把符合student.id=mark.studentid 条件的元组才选出来,也可以写成:

select s.name,m.mark from student s inner join mark m on s.id=m.studentid


符合条件的只有两条结果,查出结果为:



二、左连接:left join 或 left outer join

1.左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

2.sql语句

select * from table1 left join table2 on table1.id=table2.id

左连接是把左边的表的元组全部选出来:

select s.name,m.mark from student s left join mark m on s.id=m.studentid


上面语句就是把左边的表,即student表中的元组全部选出,尽管有些分数表是没数据的,也选了出来,选出的结果为:



三、右连接:right join 或 right outer join

(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

(2)sql语句

select * from table1 right join table2 on table1.id=table2.id

右连接就是把右边表的数据全部取出,不管左边的表是否有匹配的数据:

select s.name,m.mark from student s right join mark m on s.id=m.studentid


上面的语句就是把mark分数表的数据全部取出来,不管student表中是否有数据匹配,如下图所示:



四、完整外部联接:full join 或 full outer join 

(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

(2)sql语句

select * from table1 full join table2 on table1.id=table2.id

把左右两个表的数据都取出来,不管是否匹配:

select s.name,m.mark from student s full join mark m on s.id=m.studentid


如下图所示,学生表和成绩表的数据都取了出来:



比较常用的是第一种,内连接,而且是用这种写法:

select s.name,m.mark from student s,mark m where s.id=m.studentid


 

文章引用自:http://www.cnblogs.com/still-windows7/archive/2012/10/22/2734613.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: