`

SQL表联接

    博客分类:
  • SQL
 
阅读更多

所有的连接一般分为两大类:

内部联接

外部链接

 

 

一.内部联接

内部联接的两个语法

SQL:2003

定义的语法使用SELECT语句的FROM子句来连接表:

…
from <table>
[inner|natural|cross] join <table>
[on <condition>]|[using <column name>,…],…
…
 

说明:

1.内部联接选项

在一个内部联接中,有下列选项:

INNER关键字是可选的,它用于明确区分内部联接和外部链接。

NATURAL关键字用于指定两个表之间的自然连接,即通过名称相同的列将两个表联接起来。NATURAL关键字不能同时调用ON和USING字句。在三大RDBMS中,只有Oracle 11g可以使用NATURAL。

CROSS 关键字用于交叉联接。

 

2.ON和USING字句

ON子句指定连接条件(等值连接或非等值连接)。

指定一个自然连接时,USING子句指示要使用的列。当自然联接无法正常工作时,也将用到USING子句。

在三大RDBMS中,只有Oracle 11g支持USING字句,但ON字句也可以得到相同的结果。

 

旧语法

每个供应商通常都使用另一个语法在WHERE子句执行连接。

 

...
where
[<qualifier>.]<coluimn_name><join_condition> [<qualifier>.]<coluimn_name>
and
[<qualifier>.]<coluimn_name><join_condition> [<qualifier>.]<coluimn_name>
, ...

 

 

 

 

在等同联接中,join_condition可以是= 

在非等同联接中,join_condition可以是>,<,>=,<=,!=

 

 

 

等同联接

最常用的表连接类型,两列之间完全匹配。

 

SQL:2003标准语法

 

select cust_id_n,cust_name_s,phone_phonenum_s,phone_type_s
from customer join phone
on cust_id_n=phone_custid_fn
 

 

 

 

自然联接

自然联接是一种在RDBMS中执行的同等联接特例,基于下面的假设:“总是通过名称相同的一列(或多列)联接表。”

换言之,在SELECT语句的FROM子句中,不需要在ON分子句中显示指定列,完全省略分子句ON。

 

旧语法

在SELECT语句的WHERE子句中联接表。

该语法的反对者的主要观点是WHERE子句中不能混合联接和谓词,它的唯一目的是对产生的结果集设置“

垂直”限制。

支持者的主要观点是对于联接很多表的查询,旧语法更具有可读性。另一个主要争论点是遗留代码,尤其

 

是对于Oracle,在9i版本之前,标准语法都是不好用的。

 

 

非同等联接

有时需要基于条件而不是等同性来联接表。同等联接的典型应用时处理主键/外键关系,而非同等联接则不同,非同等联接通常会以一种无意义的方式填充结果集。

例:如果用<>(不等于)代替前一节查询中的=(等于)运算符,那么查询结果将返回所有客户和电话号码的组合。而不豪阔那些实际上标识有效客户、电话号码的列表。换言之,结果和笛卡尔积有些相似。

 

 

 

自连接

自连接:一个表不与其他表而与自身进行连接。

尽管实际上表与自身进行连接,但是处理的仍然是同一表的两个实例。或者说是两个相同的表,而不只是一个表,所以,自联接可以认为是多表联接的一种特殊情况。

 

注意:理解一个表和它实例的不同之处也是很重要的。两个表实例可以认为是表的数据被载入两个不同的存储单元,彼此完全分离。

 

 

SELECT r.reseller_id_n AS res_id,
     r.reseller_name_s AS res_name,
     s.reseller_id_n AS sup_id,
     s.reseller_name_s AS sup_name
FROM reseller r JOIN reseller s
on    r.reseller_supplier_id=s.reseller_id_n
 

 

 

 

交叉连接(笛卡尔积)

两个表的交叉联接或笛卡尔积,可以定义为从两个源表中,选取可能的匹配行组成另一个表(可能是虚表)。

SQL:2003

 

select cust_name_s,phone_phonenum_s from customer cross join phone
 

 

  

旧语法

select cust_name_s,phone_phonenum_s from customer , phone
 

 

对两个以上的表进行连接

 

多表联接的联接数目

n个表的查询中,应该至少有n-1个连接。如果少于n-1个联接,结果将是一个笛卡尔积。

注意:最常见的(和最危险的)交叉联接类型发生在包含两个以上的表的查询中,这种情况下,不必省略where子句,只需要跳过十几个表中的两个表的联接就足够了。

 

 

SQL2003

连接4个表的查询中

select distinct customer.cust_name_s
from customer
join order_head
on customer.cust_id_n=order_header.ordhdr_custid_fn
join order_line
on order_head.ordhdr _id_n= order_line. ordline_ordhdrid _fn
join product
on product.prod_id_n=order_line. ordline_prodid_fn

 

 

旧语法

在where子句中写入联接条件。

 

 

 

 

 

 

二.外部联接

 

根据包含NULL值的列联接表

外部联接的两个语法

 

SQL:2003

…
from <table>
{left|right|full[outer]}|union join
<table>
[on <condition>]|[using <column name>,…]
, …
  

但是只有Oracle实现了using字句。

 

旧语法

使用where子句。但Oracle和SQL Server实现方式也不相同(DB2没有用于外部联接的“旧”语法,它一开始旧兼容SQL2003)

Oracle 11g

旧的右外联接或左外联接,通过在表面之后添加一个(+)来表示,并且这个表在=的相应边没有匹配行,完

 

全外部联接只能通过与SQL:2003兼容的语法指定。

 

右外连接

 

...
where
[<qualifier>.]<coluimn_name>= [<qualifier>.]<coluimn_name>(+)
...
  

左外连接

 

...
where
[<qualifier>.]<coluimn_name>(+)= [<qualifier>.]<coluimn_name>
...
 

 

 

左外部联接

外部连接背后的总体思想是检索表A(左)或表B(右)的所有行,如果在对应的表中没有匹配值,联接列便为NULL。一个左(或右)外部联接对所有连接表中不匹配的列也返回NULL值(只包含那些含NULL联接列的行时)。

 

1.SQL2003标准语法

 

分享到:
评论

相关推荐

    SQL多表连接

    本文档为通用SQL数据库查询时所用,讲述的是多表连接!~

    SQL表连接图解

    SQL表连接是数据库查询中非常重要的一个概念,它允许我们从多个表中获取相关数据,合并成一个单一的结果集。本文将详细解释SQL中的四种主要表连接类型:内连接(Inner Join)、左连接(Left Join)、右连接(Right ...

    多表连接的多种方式.sql

    多表连接的多种方式.sql

    sql表连接查询使用方法(sql多表连接查询)

    SQL表连接查询是数据库操作中不可或缺的部分,尤其在处理涉及多张表的复杂查询时显得尤为重要。表连接允许我们从多个相关联的表中检索出所需的数据,避免了单独对每张表进行多次操作,提高了查询效率。接下来,我们...

    SqlServer连接工具

    SQL Server连接工具是数据库管理员和开发人员用于与Microsoft SQL Server交互的重要软件。这些工具提供了多种功能,包括数据库的创建、管理、查询、备份、恢复以及性能优化等。在本篇文章中,我们将深入探讨SQL ...

    从两种SQL表连接写法来了解过去

    SQL表连接是数据库查询中的重要概念,用于合并两个或多个表的数据,以便在查询结果中获得完整的信息。这里主要讨论两种常见的SQL表连接写法,它们分别是基于`WHERE`子句的传统连接(ANSI SQL 86标准)和使用`JOIN`...

    SqlDbx连接oracle

    首先,连接Oracle数据库通常需要Oracle客户端软件,但这里提到的“Sqldbx连接oracle,不用安装client”,意味着SqlDbx可能通过一种无需完整Oracle客户端的方式来实现连接。这种连接方式通常依赖于Oracle的Instant ...

    在SQL中,你为达此目的将需要进行一个四表连接的查询。

    在SQL中,你为达此目的将需要进行一个四表连接的查询。 =运算符不仅可以被用来比较属性的值,也可以用来比较实

    SQL多表连接查询优化的相关研究

    一、SQL连接查询类型: 1. 内连接(INNER JOIN):返回两个表中匹配的行。 2. 左连接(LEFT JOIN):返回左表的所有行,即使右表没有匹配的行,结果用NULL填充。 3. 右连接(RIGHT JOIN):与左连接相反,返回右表的...

    oracle sqldeveloper连接mysql、SQLServer第三方dll

    解决oracle sqldeveloper无法连接mysql、SQLServer问题,sqlDeveloper是ORACLE数据库开发工具,自带的是无法连接MS SQL Server以及mysql的,想连接的话需要第三方工具。 使用方法: 解压出来后将2个jar放入jlib...

    如何连接SQL数据库

    系统需要收集、存储和处理用户的故障报告,这涉及到创建数据库表,定义数据结构,以及编写处理数据的SQL语句。首先,你需要确定使用SQL Server还是Access作为后端数据库,然后按照上述方法建立连接。确保系统的数据...

    SQL连接器 SQL连接器

    SQL连接器是数据库管理系统与应用程序之间的重要桥梁,它允许程序通过特定的接口与各种数据库进行交互,从而实现数据的查询、插入、更新和删除等操作。在本文中,我们将深入探讨SQL连接器的工作原理、常见类型以及...

    SQL中不同类型的表连接

    在关系型数据库中,join操作是将不同的表中的数据联合在一起时非常通用的一种做法。首 先让我们看看join是如何操作的,然后我们探索一下当join和where语句同时存在的时候的 执行顺序问题,最后来谈一谈不同类型的...

    sqlserver连接字符串大全

    ### SQL Server连接字符串详解 在IT领域中,数据库的连接是进行数据操作的基础步骤之一。本文将基于“SQL Server连接字符串大全”的主题,详细介绍不同版本的SQL Server(如2000、2005等)及其不同环境下的连接字符...

    如何查看sql server数据库连接数

    可以通过系统表来查询 SQL Server 数据库连接数。具体步骤如下: 1. 使用以下查询语句:`SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID] FROM [Master].[dbo].[SYSDATABASES] WHERE ...

    SQL SERVER连接oracle数据库几种方法

    SQL SERVER 连接 Oracle 数据库几种方法 在实际开发中,我们经常需要在 SQL Server 中连接 Oracle 数据库,以便实现数据交换和集成。那么,如何在 SQL Server 中连接 Oracle 数据库呢?下面我们将介绍几种常见的...

    SQL server 连接测试工具

    "SQL server 连接测试工具"就是为了满足这一需求而设计的,它帮助用户验证与SQL Server实例的连接,并在连接成功后将相关信息写入配置文件,简化了数据库管理的工作流程。 1. **连接测试**:连接测试工具的主要功能...

Global site tag (gtag.js) - Google Analytics