数据库的几种连表方式详解
数据库主要有五种连表方式
首先需要准备两张表:
图书表 book
id | name | price | publish_id |
1 | 西游记 | 33 | 1 |
2 | 红楼梦 | 56 | 1 |
3 | 三国演义 | 66 | 2 |
4 | 西厢记 | 55 | 6 |
出版社表 publish
id | name | addr |
1 | 北京出版社 | 北京 |
2 | 南京出版社 | 南京 |
3 | 东京出版社 | 东京 |
1.左连接(Left Join)
从左表取出所有记录,与右表匹配。如果没有匹配,以null值代表右边表的列
SQL代码示例:
select * from book left join publish on book.publish_id=publish.id;
效果如下:
id | name | price | publish_id | id | name | addr |
1 | 西游记 | 33 | 1 | 1 | 北京出版社 | 北京 |
2 | 红楼梦 | 56 | 1 | 2 | 南京出版社 | 南京 |
3 | 三国演义 | 66 | 2 | 3 | 东京出版社 | 东京 |
4 | 西厢记 | 55 | 6 | null | null | null |
2.右连接(Right Join)
从右表取出所有记录,与左表匹配。如果没有匹配,以null值代表左边表的列
SQL代码示例:
select * from book right join publish on book.publish_id=publish.id;
效果如下:
id | name | price | publish_id | id | name | addr |
1 | 西游记 | 33 | 1 | 1 | 北京出版社 | 北京 |
2 | 红楼梦 | 56 | 1 | 1 | 北京出版社 | 北京 |
3 | 三国演义 | 66 | 2 | 2 | 南京出版社 | 南京 |
null | null | null | null | 3 | 东京出版社 | 东京 |
3.内连接(Inner Join)
得出同时存在book表和publish表的数据集,就是求两个表的交集
SQL代码示例:
select * from book inner join publish on book.publish_id=publish.id;
效果如下:
id | name | price | publish_id | id | name | addr |
1 | 西游记 | 33 | 1 | 1 | 北京出版社 | 北京 |
2 | 红楼梦 | 56 | 1 | 1 | 北京出版社 | 北京 |
3 | 三国演义 | 66 | 2 | 2 | 南京出版社 | 南京 |
4.全连接(Full Join)
利用左连接,右连接分两次将数据取出,然后用union将数据合并去重
SQL代码示例:
select * from book left join publish on book.publish_id=publish.id union select * from book right join publish on book.publish_id=publish.id;
效果如下:
id | name | price | publish_id | id | name | addr |
1 | 西游记 | 33 | 1 | 1 | 北京出版社 | 北京 |
2 | 红楼梦 | 56 | 1 | 1 | 北京出版社 | 北京 |
3 | 三国演义 | 66 | 2 | 2 | 南京出版社 | 南京 |
4 | 西厢记 | 55 | 6 | null | null | null |
null | null | null | null | 3 | 东京出版社 | 东京 |
5.交叉连接(笛卡尔积)
返回两个表的笛卡尔乘积,作用就是计算两个表之间每个可能的组合,结果集中的记录数等于两张表各自记录数的乘积
SQL代码示例:
select * from book,publish
效果如下:
id | name | price | publish_id | id | name | addr |
1 | 西游记 | 33 | 1 | 1 | 北京出版社 | 北京 |
1 | 西游记 | 33 | 1 | 2 | 南京出版社 | 南京 |
1 | 西游记 | 33 | 1 | 3 | 东京出版社 | 东京 |
2 | 红楼梦 | 56 | 1 | 1 | 北京出版社 | 北京 |
2 | 红楼梦 | 56 | 1 | 2 | 东京出版社 | 东京 |
2 | 红楼梦 | 56 | 1 | 3 | 东京出版社 | 东京 |
3 | 三国演义 | 66 | 2 | 1 | 北京出版社 | 北京 |
3 | 三国演义 | 66 | 2 | 2 | 南京出版社 | 南京 |
3 | 三国演义 | 66 | 2 | 3 | 东京出版社 | 东京 |
4 | 西厢记 | 55 | 6 | 1 | 北京出版社 | 北京 |
4 | 西厢记 | 55 | 6 | 2 | 南京出版社 | 南京 |
4 | 西厢记 | 55 | 6 | 3 | 东京出版社 | 东京 |
添加过滤条件,实现内连接:
select * from book,publish where book.publish_id=publish.id;