多表查询
尽管对单个表的查询并不罕见,但在应用环境下大多数的查询都需要针对两个,3个甚至更多的表。
笛卡尔积
在 from 子句中包含了两个表,并使用关键字join隔开。这种连接被称为交叉连接,它在实际应用中很少使用。
内连接
通常在对两个表使用内连接时,最好在 from 子句中显式指定连接类型。如果没有指定连接类型,那么服务器将会默认使用内连接。select <column> from a inner join b on a.key = b.key
如果连接两个表的列名是相同的,那么可以使用 using 子句替代 on 子句。select <column from a inner join b using (key)>
using 实际上只能在某些特殊情况下起到简化语法的作用。
ANSI 连接语法
所有的主流数据库( Oracle Database, Microsoft SQL Server, MySQL, IMB DB2 Universal Database 和 Sybas Adaptive Server ) 都采用了SOL92 的连接语法。由于数据库大多都出现在 SQL92 标准发布之前,它们同样也容许一些旧的连接语法。
ANSI连接语法具备下列优点: - 连接条件和过滤条件被分隔到两个子句中(on 子句和 where 子句),是查询语句更容易与理解 - 每两表之间的连接条件都在它们自己的 on 子句中列出,这样不容易错误地忽略了某些连接条件 - 使用 SOL92 连接语法的查询语句可以在各种数据库服务器中通用,而旧的语法在不同服务器上的表现可能略有不同。 SOL92 连接语法的优势在同时包含连接和过滤条件的复杂查询中表现的更加明显(更加易于理解)。
连接 3 个或更多的表
连接 3 个表的方法与连接两个表类似,只是有些许不同。在两个表的连接查询中, from 子句包含了两个表名和一种连接类型,以及一个 on 子句以指定两表是如何连接的。对于 3 个表的连接,在 from 子句中将包含 3 个表和两种连接类型,以及两个 on 子句。
注意:SQL 是一种非过程化的语言,也就是说只需要描述要获取的数据库对象,因此,在 from 子句个表出现的顺序并不重要。
连接条件和过滤条件
SOL 对于放置条件的位置是很灵活的,需要仔细构建所需要的查询。