知识大全 N路INNER JOIN
Posted 图书
篇首语:最怕一生碌碌无为,还安慰自己平凡可贵。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 N路INNER JOIN相关的知识,希望对你有一定的参考价值。
SQL实战新手入门:N路INNER JOIN 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
N路INNER JOIN
当两个表之间不存在直接的关系时该怎么联接这两个表呢?在这种情况下 联接操作需要涉及更多的表!在上一小节INNER JOIN的练习中已经演示了一个实际的例子
例如 有时我们需要列出所有的图书以及各图书相应的作者 请注意 在数据库中一本图书并不知道它的作者信息在哪里(即在BOOKS表的数据行中并没有关于该图书作者的信息) 而作者信息的记录同样也不知道该作者编写的图书的信息在什么地方 但是 在数据库中有一个BOOKS_AUTHORS表 它包含了这样的知识 哪一本图书是哪一个作者编写的 以及哪一个作者编写了哪些图书 BOOKS_AUTHORS表中的每一行都包含了一个BOOKS表的外键和一个AUTHORS表的外键 如果一本图书是由多个作者编写的 那么该BOOKS_AUTHORS表中就具有多行记录 每一行包含了相同的图书ID和不同的作者ID 反之亦然(对于任何一个编写了多本图书的作者)
由于BOOKS表中的数据行没有对于AUTHORS表的外键 AUTHORS表的数据行也没有对于BOOKS表的外键 因此没有办法直接将这两个表联接起来 但是可以将这两个表联接到BOOKS_AUTHORS表
SELECT
books bk_title AS Book
authors au_last_name AS Author
FROM books INNERJOIN books_authors
ON books bk_id = books_authors bk_id
INNER JOIN authors
ON authors au_id = books_authors au_id;
联接的结果如表 所示 正如我们所期望的 如果一本书的作者超过一位 那么有多少个作者 在列表中就会列出多少条记录
表 列出图书及其相应的作者
在结果集中可能会出现重复的图书名称 也可能会出现重复的作者名字 但是图书名称与作者名字的每一个组合在结果集中仅仅只会出现一次
接下来分析一下该查询返回的数据集背后的逻辑 下面是该查询的第一部分 SELECT字段列表
SELECT
books bk_title AS Book
authors au_last_name AS Author
该字段列表并没有什么神奇 它告诉查询引擎我们感兴趣的字段 并为字段列表中的列定义一个比默认名称更加可爱的列名(别名) 注意 虽然查询了多个表 但并非一定要从每一个表中都获取数据 在本例中 只需要一些来自BOOKS表的字段和一些来自AUTHORS表的字段 而并不需要获取BOOKS_AUTHORS表中的字段
FROM books INNER JOIN books_authors
ON books bk_id = books_authors bk_id
上面的子句定义了第一个INNER JOIN 指定了要联接哪两个表 以及如何联接这两个表 在本例中 联接条件是BOOKS表中的BK_ID列的值必须与BOOKS_AUTHORS表中BK_ID列的值相等(两个表中的列名不一定要相同 但是相同的列名使用起来会比较方便)
INNER JOIN authors ON authors au_id = books_authors au_id
上面的子句定义了第二个INNER JOIN 请注意它与第一个INNER JOIN子句的不同 在第一个INNER JOIN子句中指定了两个表 books INNER JOIN books_authors 但在第二个INNERJOIN中仅仅指定了一个表 INNER JOIN authors 这里并不需要指定其他的表 它已经被绑定到之前指定的两个表中的一个 并且行匹配规则将指定它与哪一个表进行联接(在本例中 行匹配规则是 AUTHORS表中AU_ID列的值与BOOKS_AUTHORS表中AU_ID列的值相等)
运行该查询后 如果BOOKS表中包含在BOOKS_AUTHORS表中没有记录的图书 则结果集中不会包含这样的图书 如果AUTHORS表中的任何作者在BOOKS_AUTHORS表中并不存在 则结果集中也不会包含这样的作者
试一试使用四路联接
如何查询位于书柜的顶层书架中名称以SQL开头的图书以及图书的作者呢?当然 这需要联接LOCATION表 BOOKS表和AUTHORS表 由于在图书与图书的作者之间是一个多对多关系 因此必须包含BOOKS_AUTHORS表作为中间表 以解决多对多关系的复杂性问题 下面将使用Microsoft SQL Server来演示联接的功能 在本书所讨论的其他任何一种RDBMS中 下面的脚本无须修改都能正常运行 下面让我们来实践一下吧
( ) 打开Microsoft SQL Server Management Studio 使用Windows身份验证连接到数据库
( ) 单击左上角的New Query按钮 输入下面的SQL查询
SELECT
au_last_name AS author
bk_title AS title
FROM books bk INNER JOIN books_authors ba
ON bk bk_id = ba bk_id
INNER JOIN authors au
ON ba au_id = au au_id
INNER JOIN location loc
ON bk bk_id = loc fk_bk_loc
WHERE loc loc_shelf =
AND bk bk_title LIKE SQL%
( ) 单击工具栏上的Execute按钮 观察返回的结果
author title
Kriegel SQL Bible
Trukhnov SQL Bible
Kriegel SQL Functions: Programmers Reference
Jones SQL Functions: Programmers Reference
Stephens SQL Functions: Programmers Reference
Plew SQL Functions: Programmers Reference
Garrett SQL Functions: Programmers Reference
( row(s) affected)
示例说明
在之前的例子中 联接的价值在于尽量减少选取的记录 直到数据集完全符合指定的筛选标准 在本例中 数据库引擎将从按照JOIN语句联接的所有表对中匹配记录(即BOOKS/BOOKS_AUTHORS BOOKS_AUTHORS/AUTHORS和BOOKS/LOCATION表对) 最后再应用筛选条件 减小数据集 仅仅返回满足条件LOC_SHELF = 和BK_TITLE以SQL开头的记录(请回忆一下带有LIKE谓词的匹配模式)
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
cha138/Article/program/SQL/201311/16472相关参考
SQL实战新手入门:内联接(INNERJOIN)(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
SQL实战新手入门:再探JOIN 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第章组合数据集
Java多线程初学者指南(5):join方法的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:交叉联接(CROSSJOIN) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:全联接(FULLJOIN) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 全
关于C#中Thread.Join()的一点理解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 今
(list[delimiter]) 参数描述 listRequiredAonedimensionalarraythatcontainsthesubstringstobejoined 必选项包
SQL实战新手入门:左联接(LEFTOUTERJOIN) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
SQL实战新手入门:右联接(RIGHTOUTERJOIN) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
数据库学习:MySQLJoin详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 还是先Crea