SQL的内连接和外连接

 

PDF下载地址:SQL-内连接与外连接.pdf

连接查询在关系型数据库中经常用到,是多表联合查询的基础。 
主要包含:内连接外连接交叉连接

 


内连接

内连接又分为等值连接不等值连接自然连接

连接查询中使用的比较运算符有:=, >, <, <>, >=, <=, !>, !<

等值连接

等值连接使用”=”来进行比较运算。 
请看下面的例子: 

student_idstudent_nameclass_id
1aaa15
2bbb16
3ccc17

 

class_idclass_name
15五班
16六班
17七班
18八班

如果需要查出一下内容:

每个学生所对应的班级名称

此时就可用以下sql语句:

SELECT * FROM
T_student ts,T_class tc
WHERE
ts.class_id=tc.class_id

或者:

SELECT * FROM
T_student ts inner join T_class tc
ON
ts.class_id = tc.class_id

查询结果如下:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班

结论如下:

等值连接:

若要连接表t1和t2,比较条件为t1.a=t2.a,那么数据库会用t1中a列的所有元素逐个和t2中的a进行比较,如果相等,则输出该行。

至于数据库内部如何实现,我们暂且不去深究。

不等值连接

内连接中,不使用”=”作为比较运算符,就叫不等值连接。 
如果需要查询以下内容:

T_student表和T_class表中,class_id字段不相等的所有组合

此时就可用以下sql语句:

SELECT * FROM
T_student ts,T_class tc
WHERE
ts.class_id <> tc.class_id

或者:

SELECT * FROM
T_student ts inner join T_class tc
ON
ts.class_id <> tc.class_id

查询结果如下:

student_idstudent_nameclass_idclass_idclass_name
2bbb1615六班
3ccc1715七班
1aaa1516五班
3ccc1716七班
1aaa1517五班
2bbb1617六班
1aaa1518五班
2bbb1618六班
3ccc1718七班

结论如下:

不等值连接

若要连接表t1和t2,比较条件为t1.a不等于t2.a,那么数据库会用t1中a列的所有元素逐个和t2中的a进行比较,如果不相等,则输出该行。

自然连接

自然连接是一种特殊的等值连接,和等值连接差不多,区别在于:

自然连接会去掉重复的列; 
自然连接要求比较的两个列属性必须相同,等值连接则不需要;

如果需要查出以下内容:

每个学生所对应的班级名称

sql语句和等值连接差不多:

SELECT ts.*,tc.class_name FROM
T_student ts inner join T_class tc
ON
ts.class_id = tc.class_id

查询结果如下:

student_idstudent_nameclass_idclass_name
1aaa15五班
2bbb16六班
3ccc17七班

由此可见:

自然连接相当于在等值连接的基础上,加了显示的限定条件,从而实现列去重

外连接

外连接又分为左连接右连接全连接

左连接

左连接以左表为基础,显示左表中的所有记录(显示的记录条数=左表中记录的条数)。再用左表中的指定列来和右表中的指定列比较,满足则输出值,不满足则输出NULL 
如果需要查出以下内容:

每个学生所对应的班级名称

此时就可用以下sql语句:

SELECT * FROM
T_student ts left join T_class tc
ON
ts.class_id = tc.class_id

查询结果如下:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班

但如果T_student表中增加一条字段:

student_idstudent_nameclass_id
4ddd20

此时再用上一条sql语句查询,则结果变为:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班
4ddd20NULLNULL

结论如下:

左连接

以左表为基础,显示的记录条数=左表中记录条数。如果左表中选出的字段符合条件则显示,否则显示NULL

右连接

与左连接恰恰相反。以右表为基础,显示记录的条数=右表中记录条数,然后和左表中的字段比较,符合条件则输出,否则输出NULL。 
使用以下sql语句:

SELECT * FROM
T_student ts right join T_class tc
ON
ts.class_id = tc.class_id

查询结果为:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班
NULLNULLNULL18八班

结论如下:

右连接

以右表为基础,显示记录的条数=右表中记录条数。如果左表中选出的字段符合条件则显示,否则显示NULL

全连接

全连接类似于左连接和右连接的综合,显示记录的条数=指定比较字段在两个表中的不同种类数。对于空余字段则显示NULL。 
使用以下sql语句:

SELECT * FROM
T_student ts full join T_class tc
ON
ts.class_id = tc.class_id

查询结果为:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班
NULLNULLNULL18八班

但如果T_student表中增加一条字段:

student_idstudent_nameclass_id
4ddd20

此时再用上一条sql语句查询,则结果变为:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1616六班
3ccc1717七班
4ddd20NULLNULL
NULLNULLNULL18八班

结论如下:

全连接

指定比较字段在两个表中的不同种类数。对于空余字段则显示NULL

交叉连接

交叉连接很简单,就是两个表做笛卡尔积。 
如果不加where做选择比较,那么显示的记录行数就是两个表行数的乘积。 
使用以下sql语句:

SELECT * FROM
T_student cross join T_class

或者:

SELECT * FROM
T_student,T_class

查询结果为:

student_idstudent_nameclass_idclass_idclass_name
1aaa1515五班
2bbb1615六班
3ccc1715七班
1aaa1516五班
2bbb1616六班
3ccc1716七班
1aaa1517五班
2bbb1617六班
3ccc1717七班
1aaa1518五班
2bbb1618六班
3ccc1718七班

如果是有where进行选择,那就先进行笛卡尔积,然后在笛卡尔积的结果中进行选择(效率很差)。 
结论如下:

交叉连接

没有where进行选择,结果为两个表的笛卡尔积 
where进行选择,先做笛卡尔积,在笛卡尔积的结果中进行选择

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值