1、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行
组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
第一种写法:(只使用where)
select t.teacher_name, s.student_name from teacher t,student s where t.id = s.teacher_id;
第二种写法:(join .. on.. )
select t.teacher_name, s.student_name from teacher t join student s on t.id = s.teacher_id;
第三种写法:(inner join .. on..)
select t.teacher_name, s.student_name from teacher t inner join student s on t.id = s.teacher_id;
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
(1)左(外)连接:左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL
第一种写法:(left join .. on ..)
select t.teacher_name, s.student_name from teacher t left join student s on t.id = s.teacher_id;
第二种写法:(left outer join .. on ..)
select t.teacher_name, s.student_name from teacher t left outer join student s on t.id = s.teacher_id;
第三种写法:"(+)" 所在位置的另一侧为连接的方向
select t.teacher_name, s.student_name from teacher t, student s where t.id = s.teacher_id(+);
(2)右(外)连接:与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL
第一种写法:(right outer join .. on ..)
select t.teacher_name, s.student_name from teacher t right join student s on t.id = s.teacher_id;
第二种写法:(right outer join .. on ..)
select t.teacher_name, s.student_name from teacher t right outer join student s on t.id = s.teacher_id;
第三种写法:"(+)" 所在位置的另一侧为连接的方向
select t.teacher_name, s.student_name from teacher t, student s where t.id(+) = s.teacher_id;
(3)完整外部连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
select t.*,s.* from teacher t full join student s on t.id = s.teacher_id
(4)交叉连接:返回被连接的两个表所有数据行的笛卡尔积,返回到的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
第一种写法:(,)
SELECT * FROM student, teacher
第二种写法(CROSS JOIN)
SELECT * FROM student CROSS JOINteacher
3、全连接。返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)(目前mysql、oracle不支持)