(一)表连接分类
表连接分为:CROSS JOIN、INNER JOIN、OUTER JOIN、SELF JOIN
(二)CROSS JOIN 交叉连接
CROSS JOIN连接用于生成两张表的笛卡尔集。
1、返回的记录数为两个表的记录数乘积。比如,A表有n条记录,B表有m条记录,则返回n*m条记录。
2、将A表的所有行分别与B表的所有行进行连接。
语法:
select 列名1,列名2 ... 列名n from table_name1 T1 cross join table_name2 T2;
或
select 列名1,列名2 ... 列名n from table_name1 T1,table_name2 T2;
(三)INNER JOIN 内连接
内连接就是关联的两张或多张表中,根据关联条件,显示所有匹配的记录,匹配不上的,不显示。
语法:
select 列名1,列名2 ... 列名n from table_name1 T1 inner join table_name2 T2 on T1.column_name=T2.column_name;
或
select 列名1,列名2 ... 列名n from table_name1 T1 join table_name2 T2 on T1.column_name=T2.column_name;
或
--如果两张表的关联字段名相同,也可以使用USING子句
select 列名1,列名2 ... 列名n from table_name1 T1 join table_name2 T2 using (column);
或
--oracle写法
select 列名1,列名2 ... 列名n from table_name1 T1,table_name2 T2 where T1.column_name=T2.column;
(四)外连接
外连接分为三种:
1. LEFT OUTER JOIN / LEFT JOIN(左外连接)
2. RIGHT OUTER JOIN / RIGHT JOIN(右外连接)
3. FULL OUTER JOIN / FULL JOIN(全外连接)
4.1 左外连接 && 右外连接
左外连接就是关联的两张或多张表中,根据关联条件,显示匹配的记录,左表中有的记录,但是右表中没有匹配上的,以空(null)显示。
语法:
select 列名1,列名2 ... 列名n from table_name1 T1 left outer join table_name2 T2 on T1.column_name=T2.column_name;
或
select 列名1,列名2 ... 列名n from table_name1 T1 left join table_name2 T2 on T1.column_name=T2.column_name;
或
--如果两张表的关联字段名相同,也可以使用USING子句
select 列名1,列名2 ... 列名n from table_name1 T1 left join table_name2 T2 using (column);
或
--oracle写法
select 列名1,列名2 ... 列名n from table_name1 T1 , table_name2 T2 where T1.column_name=T2.column_name(+);
4.2 全外连接
全外连接就是关联的两张或多张表中,根据关联条件,显示所有匹配和不匹配的记录。
左表中有的记录,但是右表中没有匹配上的,以空(null)显示。右表中有的记录,但是左表中没有匹配上的,也以空(null)显示。
语法:
select 列名1,列名2 ... 列名n from table_name1 T1 full outer join table_name2 T2 on T1.column_name=T2.column_name;
或
select 列名1,列名2 ... 列名n from table_name1 T1 full join table_name2 T2 on T1.column_name=T2.column_name;
或
--如果两张表的关联字段名相同,也可以使用USING子句
select 列名1,列名2 ... 列名n from table_name1 T1 full join table_name2 T2 using (column);
4.3 自连接
自连接,就是把一张表取两个别名,当做两张表来使用,自己和自己关联。
语法:
select 列名1,列名2 ... 列名n from table_name T1 inner join table_name T2 on T1.column_name1=T2.column_name2;