数据库表连接问题

一、交叉连接
交叉连接有两种:显示的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有cross join.
select o.id,o.order_number,c.id,c.name from orders o,customers c
where o.id=1
语句2:显式的交叉连接,使用cross join.
select o.id,o.order_number,c.id,c.name from orders o cross join customers c
where o.id=1
二、内连接
显示的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的连接表就是数据库在做查询形成的中间表)
语句3:隐式内连,没有inner join,形成的中间表为两个表的笛卡尔积。
select o.id,o.order_number,c.id,c.name from orders o,customers c
where c.id=o.customer_id
语句4:显示内连,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积。
select o.id,o.order_number,c.id,c.name from orders o inner join customers c
on c.id=o.customer_id
三、外连接:外联不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接、右外连接和全外连接。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连还返回左表中不符合连接条件但符合查询条件的数据行。
右外连还返回右表中不符合连接条件但符合查询条件的数据行。
全外连接还返回左表中不符合连接条件但符合查询条件的数据行,并且还返回右表中不符合连接条件但符合查询条件的书建行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外union右外”。
说明:左表就是在“left outer join”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,outer关键字是可省略的。

on条件和where条件的区别?
on条件:是过滤两个连接表笛卡尔积形成中间表的约束条件。
where条件:在有on条件的select语句中是过滤中间表的约束条件。在没有on的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
where条件移入on后面是不恰当的。推荐的做法是:
on只进行连接操作,where只过滤中间表的记录。

猜你喜欢

转载自blog.csdn.net/qq_28710139/article/details/84836961