`
aone
  • 浏览: 73706 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

转:深入浅出SQL之左连接、右连接和全连接

    博客分类:
  • sql
阅读更多

为了从两个或多个表中选出数据,我们一般使用表连接来实现这个功能。

本节介绍join(连接)的概念. 为此我们准备了两个试验用表: album(专辑表) 和 track(曲目表).

专辑表:包含200首来自Amazon的音乐CD的概要信息。

  album(asin, title, artist, price, release, label, rank)

  曲目表:每张专辑中的曲目(因为是音乐CD,所以也可叫歌曲)的详细信息。

  track(album, dsk, posn, song)

  SQL短语 FROM album JOIN track ON album.asin=track.album 表示连接album和track表。

  其中,album.asin表示专辑的惟一标识号,track.album表示曲目表中和专辑关联的专辑号。

  连接后,得到一个临时表,该临时表中每条记录包含的字段由两部分组成,

  除了专辑表中的对应字段album(title, artist ...),还包含曲目表的所有字段track(album, disk, posn and song)。

  有了这张临时表,很多查询就容易实现了。

  看看一些具体的实例,

  一、列出歌名为'Alison'的专辑名称和作者

SELECT title, artist
FROM album JOIN track
ON (album.asin=track.album)
WHERE song = 'Alison'


  显然,歌名、专辑名称和作者分别在两个表中,必需使用表连接来完成这个查询。

  二、哪个artist录制了歌曲'Exodus'

SELECT artist
FROM album JOIN track ON (asin=album)
WHERE song = 'Exodus'

  用作连接的两个字段asin,album因为在两个表中都是惟一的,所以不一定要加表名作为前缀。

  但为了方便理解,建议使用前缀,形如:album.asin=track.album

  三、列出曲目表中所有属于'Blur'专辑的歌曲

SELECT song
FROM album JOIN track ON (asin=album)
WHERE title = 'Blur'


  如果我们把 album JOIN track ON (asin=album) 看成一个临时表的话,join的概念就很好理解了。

 

內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。

  为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。

party(Code,Name,Leader)
Code: 政党代码
Name: 政党名称
Leader: 政党领袖

msp(Name,Party,Constituency)
Name: 议员名
Party: 议员所在政党代码
Constituency: 选区

  在介绍左连接、右连接和全连接前,有一个数据库中重要的概念要介绍一下,即空值(NULL)。

  有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。

  空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。

  例如:下面的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党)

SELECT code, name FROM party
WHERE leader IS NULL

  又如:一个议员被开除出党,看看他是谁。(即该议员的政党为空值)

SELECT name FROM msp
WHERE party IS NULL

  好了,让我们言归正传,看看什么叫左连接、右连接和全连接。

  A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

  同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。
而full join(全连接)顾名思义,左右表中所有记录都会选出来。

  讲到这里,有人可能要问,到底什么叫:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

  我们来看一个实例:

SELECT msp.name, party.name
FROM msp JOIN party ON party=code

  这个是我们上一节所学的Join(注意:也叫inner join),这个语句的本意是列出所有议员的名字和他所属政党。

  很遗憾,我们发现该查询的结果少了两个议员:Canavan MSP, Dennis。为什么,因为这两个议员不属于任何政党,即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配,即FROM msp JOIN party ON party=code 没有把该记录连接起来,而是过滤出去了。

  在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表。

  现在再看看这句话,“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”,意思应该很明白了吧。执行下面这个语句,那两个没有政党的议员就漏不了了。

SELECT msp.name, party.name
FROM msp LEFT JOIN party ON party=code

  关于右连接,看看这个查询就明白了:

SELECT msp.name, party.name
FROM msp RIGHT JOIN party ON msp.party=party.code

  这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。 那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢,对了,全连接(full join)。

SELECT msp.name, party.name
FROM msp FULL JOIN party ON msp.party=party.code

分享到:
评论

相关推荐

    由浅入深sql语句(外键,左关联,右关联,全关联)

    内连接、左连接、右连接和全连接各有其适用场景,理解它们的原理并灵活运用是提高SQL查询效率的关键。此外,正确设置外键有助于维护数据库的数据完整性和一致性。希望本文能帮助大家更好地掌握SQL中的连接技术,为...

    深入浅出SQL-01

    根据提供的标题“深入浅出SQL-01”和描述“深入浅出SQL 英文版,文字清晰版,分章节”,我们可以推断出这是一份关于SQL(Structured Query Language,结构化查询语言)的教程或者书籍。由于部分内容并未提供实际的...

    锋利的SQL(第2版)图书代码

    《锋利的SQL(第2版)》是张洪举先生的一本关于SQL查询语言的著作,这本书深入浅出地讲解了SQL在实际数据库管理与数据处理中的应用。提供的"锋利的SQL(第2版)代码.pdf"包含了书中的示例代码,旨在帮助读者更好地...

    初级SQL开发指南

    有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。例如,合并两个表的信息: ```sql SELECT * FROM Students JOIN Courses ON Students.ID = Courses.StudentID; ``` 6. ...

    复杂查询书籍

    - **外连接**:包括左外连接、右外连接和全外连接,主要用于处理表中某些记录可能在另一表中找不到匹配的情况。 - **自连接**:指同一表内的连接查询,通常用于检索具有层级结构的数据,如员工管理结构。 #### 五、...

    SQL必知必会-中文-第4版.pdf_sql_ThisIsABook_

    《SQL必知必会》是数据库领域的一本经典著作,主要针对SQL(Structured Query Language,结构化查询语言)进行深入浅出的讲解。SQL是用于管理和处理关系数据库的标准语言,对于任何想要从事与数据打交道的工作的人来...

    SQL教程(SQL编程相关的详细讲解)

    内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)是四种基本的联接类型。 3. 子查询:在SQL中,你可以嵌套查询,即在另一个查询内部使用查询,称为子查询。子查询可以作为...

    [Oracle官方PPT讲义] Oracle DB 11g SQL Fundamentals I

    Oracle DB 11g SQL Fundamentals I 是一套官方提供的PPT讲义,旨在深入浅出地介绍Oracle数据库11g版本中的SQL基础概念和技术。在这一讲义中,你将全面学习到如何与Oracle数据库进行交互,理解SQL语言的基础结构,并...

    SQL数据库实例教程

    《SQL数据库实例教程》是一本深入浅出的指南,旨在帮助读者掌握SQL语言,从而能够高效地管理和操作数据库。在数据库领域,SQL(Structured Query Language)是不可或缺的基础,它是用于查询、更新和管理关系数据库的...

    sql语句在sas中的应用

    SQL过程支持多种表组合方式,包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)等。 **3.2 连接操作** 连接操作是SQL中最常用的数据组合方法之一,主要用于从两个或更多表中检索...

    The Language of SQL

    《SQL语言》是数据库管理领域中的核心教程,尤其在2010年版本中,它深入浅出地讲解了SQL(Structured Query Language)这一关系型数据库管理系统(RDBMS)的语言。SQL,全称为结构化查询语言,是用于管理关系数据库...

    SQL21天自学通,,本人就是学习这本书入门sql的

    《SQL21天自学通》这本书深入浅出地介绍了这些基本概念,并提供了丰富的实例,帮助读者快速掌握SQL操作。在学习过程中,配合书中练习,读者可以逐步提升SQL查询能力,从而在数据分析、数据库管理等领域游刃有余。...

    最棒SQL书籍(SQL COOKBOOK 中文版)

    《SQL Cookbook》中文版深入浅出地讲解了如何有效地使用SQL进行数据查询、更新、插入和删除,以及如何创建和管理数据库对象,如表、视图和索引。以下是本书涵盖的一些核心知识点: 1. **基础查询**:介绍如何使用...

    sql讲解

    谭浩强老师在讲解中深入浅出地介绍了SQL的核心概念和实际应用,让我们一起深入探讨这个精彩的世界。 首先,SQL的基本操作包括数据的增、删、改、查(CRUD)。"增加"(Create)是指创建数据库、表格以及向表格中插入...

    《SQL必知必会 第4版》数据

    《SQL必知必会 第4版》是一本深入浅出介绍SQL语言的经典教材,适合初学者和有一定经验的数据库操作者。SQL(Structured Query Language),结构化查询语言,是用于管理关系数据库的标准语言。这本书涵盖了从基本的...

    浅谈Oracle数据库SQL优化.pdf

    总的来说,Oracle数据库SQL优化是一项涉及多方面考虑的技术工作,需要深入理解SQL执行机制、索引策略以及统计信息的影响。通过对SQL语句的精炼和执行计划的调整,可以显著提升数据库系统的性能和稳定性。在日常维护...

    程序员的SQL金典(不错)

    《程序员的SQL金典》是一本专为程序员设计的关于SQL语言的经典教程,它深入浅出地讲解了SQL在实际编程中的应用与技巧。书中的内容涵盖了SQL的基础知识、高级特性以及最佳实践,旨在帮助程序员提升数据库操作能力,...

    SQL数据库查询技术(图书馆光盘资料)

    在“SQL数据库查询技术”这本书中,它深入浅出地讲解了SQL的基础概念及其在实际操作中的应用。 首先,让我们从基础开始。SQL主要由四个部分组成:数据定义语言(DDL),数据操作语言(DML),数据控制语言(DCL)和...

    Morgan Kaufmann - Joe Celkos Thinking in Sets (Jan 2008)

    4. **连接操作**:Celko深入讨论了JOIN操作,包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN),以及自连接的使用,这些都是在多表查询中处理复杂关系的重要手段。...

    《MySQL必知必会》的学习笔记.zip

    《MySQL必知必会》是一本非常经典的MySQL学习教材,其深入浅出地讲解了数据库管理、查询优化、事务处理等多个关键概念和技术。通过这份学习笔记,我们可以深入了解MySQL的基础知识和高级特性,提升数据库管理与应用...

Global site tag (gtag.js) - Google Analytics