内联接(INNER JOIN)()
在RDBMS的世界里INNER JOIN是最常见的联接形式也是SQL武器库中最锋利的武器INNER JOIN可以从多个表中组合数据并将数据有重叠部分的子集返回如图所示
图
图中的两个圆分别代表了两个表阴影部分的区域代表了满足JOIN条件的数据集两边的数据被水平地粘合在一起(与UNION操作符相反本章后面还将介绍UNION操作符它在水平方向上追加数据集)
在RDBMS中数据是以最方便计算机理解的形式存储的但查询的问题是由人来提出的SQL就是连接两者的中介
在LIBRARY数据库的设计中一个位置(书柜上的一个空间)只能放一本图书但是一本图书可以具有多个存放位置(假如我们具有同一本图书的多个副本或多个不同的版本)这样如果需要生成书柜中每一个书架上的图书名称的列表那么一部分数据可以从BOOKS表中查询到另一部分数据则位于LOCATION表中BOOKS表中的主键BK_ID和LOCATION表中的外键FK_BK_LOC将把这两个表联接起来联接这两个表的SQL查询如下所示
SELECT
loc_bookcase AS bookcase
loc_shelf AS shelf
loc_position_left AS position
bk_title AS title
FROM location INNER JOIN books
ON locationfk_bk_loc = booksbk_id;
该查询的结果如表所示
表 INNER JOIN的输出结果
INNER JOIN关键字指示数据库引擎根据这两个表来准备数据集并按照指定的关系来JOIN这两个表BOOKS表中的主键BK_ID与LOCATION表中的外键FK_BK_LOC相互匹配在数据库的术语中这称为等值联接(equijoin)即使用一个等于操作符来匹配键值的JOIN联接
等值联接是最常用的联接类型根据等值联接的存在可以从逻辑上推断出必定还存在着非等值联接事实上确实如此SQL提供了非等值联接(nonequijoin)类型的联接它使用不相等操作符(大于小于不等于)将记录联接为单个数据集
尽管其中包含了一些我们需要的数据但非等值联接将产生出乎意料的结果例如在上面的查询中如果使用带有大于操作符的非等值联接来替换等值联接将返回行数据如果使用不等于操作符则将产生行数据深入地考察这些数据就可以分析出非等值联接背后的逻辑这也许并不是我们所期望的联接结果这种类型的联接有时是有用的但在大多数时候可以使用更加简明的方法来获得相同的结果集在熟练掌握SQL之前你应该放弃使用非等值联接的方法
INNER限定符并不是必须使用的关键字部分只使用一个简单的JOIN关键字也可以但是强烈建议使用INNER JOIN作为关键字使SQL代码具有更好的可维护性和更好的可读性本章随后将讨论外联接(OUTER JOIN)使用INNER JOIN这个关键字也可以为区分两者带来便利某些RDBMS支持用NATURAL关键字来代替INNER或OUTER(NATURAL JOIN是等值联接的一种特殊形式即用于联接的两个表的键值列具有相同的列名)另外一些RDBMS则支持其他关键字例如使用EQUI关键字请坚持使用最常用的INNER JOIN语法这样在跨不同的RDBMS时INNER JOIN查询将更有可能被执行
在INNER JOIN的例子中关键问题在于如果数据库中有任何图书未放置在书柜中或者任何书柜中有任何未被占用的书架空间那么这些图书或书架将不会出现在查询结果中
下面逐步分析一下这个查询
SELECT loc_bookcase loc_shelf loc_position_left bk_title
下面是想要联接的数据项
FROM location INNER JOIN books ON locationfk_bk_loc = booksbk_id
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程