内连接、全链接、左外连接、右外连接、交叉连接
今天看到Hibernate的HQL中有关连接查询的知识, 又翻了翻萨师煊老师的《数据库系统概论》参考了几篇博客,总结下关于数据库连接(join)的知识点。
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
id | score | foreign_id |
1 | 95 | 1 |
2 | 65 | 1 |
3 | 79 | 2 |
4 | 88 | 4 |
内连接(自然连接)
就是简单的根据两个表的连接查询,如连接a、b查询有成绩的学生信息:
select a.name, b.score from a inner join b on a.id=foreign_id
(inner是可以省略的)
当然可以进行 < > = 的判断
外连接
全连接(full join)
全联接结果为左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择属性为null否则显示数据
select a.name, b.score from a full join b on a.id=b.foreign_id
mysql是没有全连接的使用union结合左连接与有连接实现
左外链接 (left join)
左外联接的结果包括左表的所有行,如果右表没有匹配值则为null
select a.name, b.score from a left join b on a.id=b.foreign_id
右外链接 (right join)
右外联接和左外链接相反,结果包含右表的所有行,如果左表没有匹配值则为null
select a.name, b.score from a right join b on a.id=b.foreign_id
交叉连接
交叉连接的结果是左表与右表所有的行的组合,如左表x行,右表y行,则结果为x*y行。交叉连接又称笛卡尔积。
select * from a, b
or
select * from a cross join b