手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQL 连接查询语法及使用
SQL 连接查询语法及使用
摘要:一、交叉连接(crossjoin)交叉连接(crossjoin):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积。例...

一、交叉连接(cross join)

交叉连接(cross join):有两种,显式的和隐式的,不带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;

语句1和语句2的结果是相同的,查询结果如下:

二、内连接(inner join)

内连接(inner join):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。

语句3:隐式的内连接,没有inner join,形成的中间表为两个表的笛卡尔积。

select o.id,o.order_number,c.id,c.name

from customers c, orders o

where c.id=o.customer_id;

语句4:显示的内连接,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积。

select o.id,o.order_number,c.id,c.name

from customers c inner join orders o on c.id=o.customer_id;

语句3和语句4的查询结果:

三、外连接(outer join):

外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(left outer join)、右外连接(right outer join)和全外连接(full outer join)。

三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:

左外连接还返回左表中不符合连接条件单符合查询条件的数据行。

右外连接还返回右表中不符合连接条件单符合查询条件的数据行。

全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即"全外=左外union 右外".

说明:左表就是在"(left outer join)"关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,outer 关键字是可省略的。

下面举例说明:

语句5:左外连接(left outer join)

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o left outer join customers c on c.id=o.customer_id;

语句6:右外连接(right outer join)

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o right outer join customers c on c.id=o.customer_id;

注意:where条件放在on后面查询的结果是不一样的。例如:

语句7:where条件独立。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o left outer join customers c on c.id=o.customer_id

where o.order_number<>'mike_order001';

语句8:将语句7中的where条件放到on后面。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o left outer join customers c on c.id=o.customer_id and o.order_number<>'mike_order001';

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,on后面只跟连接条件,而对中间表限制的条件都写到where子句中。

语句9:全外连接(full outer join)。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o full outer join customers c on c.id=o.customer_id;

注意:mysql是不支持全外的连接的,这里给出的写法适合oracle和db2.但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面sql在oracle下执行的结果:

语句10:左外和右外的合集,实际上查询结果和语句9是相同的。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o left outer join customers c on c.id=o.customer_id

union

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o right outer join customers c on c.id=o.customer_id;

语句9和语句10的查询结果是相同的,如下:

四、联合连接(union join):

这是一种很少见的连接方式。oracle、mysql均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。

语句11:联合查询(union join)例句,还没有找到能执行的sql环境。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o union join customers c on c.id=o.customer_id

语句12:语句11在db2下的等价实现。还不知道db2是否支持语句11呢!

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders o full outer join customers c on c.id=o.customer_id

except

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;

语句13:语句11在oracle下的等价实现。

select o.id,o.order_number,o.customer_id,c.id,c.name

from orders 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 连接查询语法及使用】相关文章:

SQL Server 版本变更检查 警告

SQLServer 2008中通过DBCC OPENTRAN和会话查询事务

SQL 注入式攻击的本质

SQL Server 2005 返回修改后的数据

SQL SERVER 查询正在实行的SQL语句

初学者SQL语句

SQL Server 2008 R2安装配置方法图文教程

SQL Server 2008 密钥 key 使用方法

SQL高级查询

SQLServer基础语法实例应用(三)

精品推荐
分类导航