内联接(INNER JOIN)()
该查询从两个表(LOCATION表和BOOKS表)中获取数据并且仅仅获取那些匹配的数据行使用等于操作符的INNER JOIN表示仅获取匹配的行匹配的规则是LOCATION表中数据行的FK_BK_LOC列值必须与BOOKS表中BK_ID列的值相同
试一试从RDBMS中提取联接的数据
下面将对LIBRARY数据库中的图书按照关键词进行查询目前SEARCHTAGS表中包含了所有类型的关键词这些关键词是在将图书添加到数据库中时创建的中间表SEARCH_BOOKS用于在BOOKS表和要搜索的关键词之间建立关系使用一个JOIN查询可以搜索出LIBRARY数据库中以关键词SQL标记的所有图书下面将使用Microsoft SQL Server数据库引擎来实现该功能对于其他任何RDBMS也可以运行这些代码
() 打开Microsoft SQL Server Management Studio使用Windows身份验证连接到数据库
() 单击位于左上角的New Query按钮输入下面的SQL查询
SELECT
bk_title AS title
FROM books bk INNER JOIN search_books sb
ON bkbk_id = sbbk_id
INNER JOIN searchTags st
ON sbtag_id = sttag_id
WHERE sttag_value = SQL
() 单击工具栏上的Execute按钮并观察返回的查询结果
title
SQL Bible
Wiley Pathways: Introduction to Database Management
Microsoft SQL Server Weekend Crash Course
SQL Functions: Programmers Reference
( row(s) affected)
示例说明
该查询具有两个JOIN语句第一个JOIN语句从BOOKS表和SEARCH_BOOKS表联接数据第二个JOIN语句从SEARCH_BOOKS表和SEARCHTAGS表联接数据
该查询将从所有表对中获取数据并将其联接为一个单一的结果集然后再对其应用筛选条件tag_value = SQL最后将所有满足条件的记录返回给客户端
可以采用多种办法来获得相同的结果集下面是使用嵌套子查询的一个例子
SELECT bk_title as title FROM books where bk_id IN
(SELECT bk_id FROM search_books WHERE tag_id IN
(SELECT tag_id FROM searchTags where tag_value = SQL))
读者可以自行判断哪一种代码更容易理解是使用JOIN的代码还是使用子查询的代码?笔者认为前者更好理解一些
在后面的小节中还将回到这一问题并分析在结果集中包含空的书架或者包含未放置图书的情况下面让我们来介绍使用相同的基本JOIN规则将更多的数据包含在最终的结果集中
JOIN语法相对较新尽管RDBMS已经认可JOIN语法很多年了但数据库章中使用的任何查询都可以使用WHERE子句重写RDBMS依然能理解这样的查询例如
SELECT
loc_bookcase
loc_shelf
loc_position_left
bk_title
FROM location
WHERE locationfk_bk_loc = booksbk_id
使用新语法的动机是什么呢?首先新语法已经被SQL标准委员会批准目前本书中讨论的所有RDBMS都支持JOIN语法其次RDBMS仅仅是为了向后兼容而提供了对旧语法的支持在以后的版本中有可能废弃该语法可以看到新语法增强了代码的可读性可以预防某些常见的SQL错误例如无意间产生笛卡尔积的查询这将在本章后面讨论
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程