`
xiaohuohaoxiao
  • 浏览: 3752 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SQL联合语句的视觉解释

    博客分类:
  • sql
sql 
阅读更多

我认为Ligaya Turmelle的关于SQL联合语句的帖子对于新开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

1
2
3
4
5
6
id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。

 

1
2
3
4
5
6
7
8
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
 
id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)

inner join

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
 
id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga      
null  null       3     Darth Vader

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)

Full outer join

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
 
id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)

Left outer join

——————————————————————————-

1
2
3
4
5
6
7
8
9
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
 
id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
 
id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)

 

———————————————————–

 

还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:

1
2
SELECT * FROM TableA
CROSS JOIN TableB

 

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。

 

 

英文原文;Jeff Atwood,编译:伯乐在线 – @奇风余谷

译文链接:http://blog.jobbole.com/40443/

 

分享到:
评论

相关推荐

    超级SQL注入工具

    攻击者可以利用这种漏洞,向数据库系统提交恶意构造的SQL语句,从而获取未授权的信息,修改、删除数据,甚至完全控制数据库。超级SQL注入工具(SSQLInjection)就是专门针对此类漏洞进行检测和利用的工具。 【HTTP...

    SQL结构化查询语言在图书馆业务报表中的应用.pdf

    综上所述,SQL在图书馆业务报表中的应用涉及到数据库查询语言的多个方面,包括但不限于查询语句的基本格式、查询技术的应用、多表联合查询、复杂查询语句的构建以及报表的生成与美化。图书馆工作人员通过掌握SQL语言...

    ASP.Net 2.0+SQL2000程序调试演示动画

    总的来说,这个资源对于初学者或正在学习ASP.NET 2.0和SQL Server 2000联合开发的开发者来说是非常有价值的,它提供了一个互动的学习环境,帮助他们理解和掌握程序调试的关键技巧。通过动画形式,学习者可以更加直观...

    2023汽车品牌数据大全SQL,车型,报价,车图.zip

    在这个上下文中,"2023汽车品牌数据大全SQL"可能是指一个或多个SQL脚本文件,这些文件包含了创建数据库表结构的DDL(Data Definition Language)语句,以及用于插入或更新数据的DML(Data Manipulation Language)...

    狂胜说Mybatis.zip

    2. **动态SQL**:Mybatis的动态SQL功能强大,允许在XML映射文件或者Mapper接口中编写条件语句,如`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<foreach>`等标签,使得SQL构建更加灵活。 3. **Mapper...

    C#编码规范 面试笔试必看

    该资源由京华志与精华志联合出品,旨在促进开发者之间的交流与提升,同时也表明了对CSDN和微软技术生态的支持。 C#是一种广泛应用于开发Windows桌面应用、Web应用、游戏以及移动应用的强大编程语言。遵循良好的编码...

    2021-2022计算机二级等级考试试题及答案No.14668.docx

    12. SQL联合查询:正确的联合查询语法应该在`SELECT`语句之后加上`UNION`,并保持列的数量和类型匹配,选项D符合这一规则。 13. 回收站与文件恢复:清空回收站之前,被删除的文件可以恢复。清空后,文件可能无法...

    土地利用空间数据库

    3. SQL查询:掌握SQL语句,用于插入、更新、删除和查询空间数据,包括基于空间关系的查询,如邻近、包含、相交等。 4. 地图服务:实现地图瓦片服务或WMS/WFS服务,使用户可以通过Web浏览器查看和操作地图数据。 5....

    《ACCESS常用窗体查询》教学文章及实例

    你可以使用SQL语句或Access的查询设计视图来创建选择查询。 2. **参数查询**:是一种动态查询,其中的条件由用户在运行时输入。这种查询在需要根据用户输入进行灵活筛选时非常有用。 3. **联合查询**:将两个或更...

    BIRT使用经验谈 简单例子

    - **JDBC数据源**:创建与数据库的连接,这里使用了预编译的SQL查询语句。 - **组织机构数据集**:用于获取组织结构信息,查询条件为ORGID参数。 - **用户数据集**:联合查询用户和组织机构信息,同样基于预编译...

    2009年4月全国计算机等级考试二级Access笔试试题及答案.pdf

    - **查询分类**:选择查询(最常用,基于准则选取数据)、交叉表查询(统计值显示)、参数查询(用户输入准则)、操作查询(生成表、删除、更新、追加)和SQL查询(更复杂的查询类型,如联合、传递、数据定义和子...

    趋势2014夏令营笔试题

    - **问题**: 语句`SELECT...FROM...WHERE...ORDER BY...`属于哪种联合查询方式? - **解答**: 此语句并不是一种联合查询方式。联合查询通常指的是将多个`SELECT`语句的结果集合并成一个结果集的操作,关键字为`UNION...

    2021-2022计算机二级等级考试试题及答案No.10705.docx

    - **知识点**: SQL 查询包括简单查询(例如 SELECT)、联合查询、子查询等,但不包括所谓的“选择查询”。 - **解析**: SQL 提供了多种查询类型来帮助用户从数据库中检索数据。常见的查询类型包括 SELECT 查询、JOIN...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包2

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics