发布于: June 18, 2012, 8:42 pm 分类: MySQL 作者: IECspace 阅读:104次
在SQL标准中规划的连接大致分为以下几种:
1.内连接(inner join):是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。将两个表中存在连接关系的字段中符合连接关系的那些记录
SQL实例:
1 | select fieldlist from table1 [ inner ] join table2 on table1. column =table2. column |
2.外连接(分为左连接和右连接):即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL对应。
左(外)连接(left inner):显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。
SQL实例:
1 | select courses.cno, max (coursename), count (sno) from courses LEFT JOIN grades ON courses.cno=grades.cno group by courses.cno |
右(外)连接(right inner):显示全部右边表中的所有项目,即使其中有些项中的数据未填写完全。右外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。
SQL实例:
1 | select courses.cno, max (coursename), count (sno) from courses RIGHT JOIN grades ON courses.cno=grades.cno group by courses.cno |
3.全连接(full inner):将两个表中存在连接关系的字段的所有记录取出形成记录集的连接,两边表中的内容全部显示(因为全连接无论是否符合连接条件都将会取出查询提到了的表中的字所有字段,所以意义不大)
SQL实例:
1 | select sno, name ,major from students FULL JOIN majors ON students.mno=majors.mno |
4.自身连接:采取别名解决问题
SQL实例:
1 | select c1.cno,c1.coursename,c1.pno,c2.coursename from courses c1,courses c2 where c1.pno=c2.cno |
5.交叉连接(cross join):相当于做笛卡尔积
SQL实例:
1 | select lastname+firstname from lastname CROSS JOIN firstname |
下面贴两个具体的表来演示各连接结果:
a表:
b表:
(1)内连接SQL及查询结果:
(2)左(外)连接SQL及查询结果:
(3)右(外)连接SQL及查询结果: