数据库表的各种连接
数据库表的各种连接
1. 内连接(inner join)
select * from A inner join B on A.a = B.b
内连接返回表A和表B在指定字段向匹配的行。
在Oracle中必须要有on关键字指定连接字段
在MySql中可以不带on关键字,下面这句在MySql中返回的是A和B表的交叉连接(笛卡尔积),行数为A表行数乘以B表行数,但是不会生成数据表。
select * from A inner join B
2. 外连接
2.1 左外链接
select * from A left join B on A.a = B.b
左外链接以左边的表为基准,左边表中的所有行都会返回,当右边表中在指定字段有匹配时,返回匹配行。如果右表没有匹配时,返回右表所有字段为null的行
2.2 右外连接
右外连接除以右表为基准外与左外连接完全相同。
2.3 全外连接
select * from A full join B
以两边的表为基准,当某行在另一张表中没有匹配时,另一张表的列为空值。
3.交叉连接(笛卡尔积)
select * from A cross join B
返回A中的每一行与B中的所有行进行连接的数据表
返回的行数为:A的行数乘以B的行数。
如果A或B表的比较大时交叉连接生成的数据表会异常庞大,强烈不建议使用交叉连接。
4.自然连接
自然连作用于其他连接之上,禁止指定连接列,且只能查询 * 信息。返回结果为去除重复列的连接表。等值连接要求连接的两张表中必须含有完全相同的字列(名字相同,类型可比)
如:
select * from A natural left join B
该句返回A和B表的去除重复属性的列的左连接。
查询信息必须为select * , 不允许指定连接列,Oracle会自动找到相同的列进行连接
以下两种写法都会报错:
select A.a from A natural left join B //报错
select * from A natural left join B on A.a = B.b // 报错
5.等值连接
在多表连接查询时只要是连接条件使用的是‘=’号都可以称之为等值连接,等值连接不会自动去除相同的属性列,且不要求连接的属性子列完全相同(不要求名字相同,但类型必须可比)自然连接可以算是一种特殊的等值连接。
等值连接的常见写法
// 写法一
select * from A,B,C where A.a = B.b and B.b = C.c
// 写法二
select * from (A inner join B on A.a = B.b) inner join C on C.c = B.b
其中写法一使用where的方式,称之为隐式连接,写法二使用on的方式为显示连接。
where的方式会先对全表做笛卡尔积(即A*B*C),然后使用where条件进行过滤。
on的方式会先对两张表进行过滤,过滤的结果在与第三张表进行笛卡尔积,如果A*B之后过滤掉的数据非常多时,那么on方式的运算量会比where小得多,所以on方式性能会更好。但是在数据库中这两种方式的性能几乎相同,因为数据库会自动对where方式进行优化