rders o full outer join customers c on c.id=o.customer_id
minus
select o.id,o.order_number,o.customer_id,c.id,c.name
from orders o inner join customers c on c.id=o.customer_id;
查询结果如下:
五、自然连接(natural inner join):
说真的,这种连接查询没有存在的价值,既然是sql2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,sql会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用on语句,不允许指定显示列,显示列只能用*表示(oracle环境下测 试的)。对于每种连接类型(除了交叉连接外),均可指定natural。下面给出几个例子。
语句14:
select *
from orders o natural inner join customers c;
语句15:
select *
from orders o natural left outer join customers c;
语句16:
select *
from orders o natural right outer join customers c;
语句17:
select *
from orders o natural full outer join customers c;
六、sql查询的基本原理:两种情况介绍。
第一、 单表查询:根据where条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据select的选择列选择相应的列进行返回最终结果。
第二、 两表连接查询:对两表求积(笛卡尔积)并用on条件和连接类型进行过滤形成中间表;然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。
第三、 多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。
理解sql查询的过程是进行sql优化的理论依据。
七、on后面的条件(on条件)和where条件的区别:
on条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
where条件:在有on条件的select语句中是过滤中间表的约束条件。在没有on的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
从这里可以看出,将where条件移入on后面是不恰当的。推荐的做法是:
on只进行连接操作,where只过滤中间表的记录。
八、总结
连接查询是sql查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:
1、 查两表关联列相等的数据用内连接。
2、col_l是col_r的子集时用右外连接。
3、col_r是col_l的子集时用左外连接。
4、col_r和col_l彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。例如:
select t1.c1,t2.cx,t3.cy
from tab1 t1
inner join tab2 t2 on (t1.c1=t2.c2)
inner join tab3 t3 on (t1.c1=t2.c3)
left outer join tab4 on(t2.c2=t3.c3);
where t1.x >t3.y;
上面这个sql查询是多表连接的一个示范