联结/连接

SQL 最强大的功能之一就是能在数据查询的执行中联结( join )表。联结是利用 SQL 的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习 SQL 的极为重要的部分。

创建联结

SELECT vend_name,prod_name,prod_price
FROM Vendors,Products
WHERE Vendors.vend_id=Products_vend_id;


我们来看这段代码。SELECT语句与前面所有语句一样指定要检索的列。这里最大的差别是所指定的两列(prod_name和prod_price)在一个表中,而第三列(vend_name)在另一个表中。

现在来看FROM子句。与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表:Vendors和Products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确地联结,WHERE子句指示 DBMS 将Vendors表中的vend_id与Products表中的vend_id匹配起来。
可以看到,要匹配的两列指定为Vendors.vend_id和Products.vend_id。这里需要这种完全限定列名,如果只给出vend_id, DBMS 就不知道指的是哪一个(每个表中有一个)。从前面的输出可以看到,一条SELECT语句返回了两个不同表中的数据。

警告:完全限定列名
就像前一课提到的,在引用的列可能出现歧义时,必须使用完全限定列名(用一个句点分隔表名和列名)。如果引用一个没有用表名限制的具有歧义的列名,大多数 DBMS 会返回错误。

WHERE 子句的重要性

使用WHERE子句建立联结关系似乎有点奇怪,但实际上是有个很充分的理由的。要记住,在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在数据库表的定义中没有指示 DBMS 如何对表进行联结的内容。你必须自己做这件事情。在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

笛卡儿积( cartesian product )

由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;


警告:不要忘了 WHERE 子句
要保证所有联结都有WHERE子句,否则 DBMS 将返回比想要的数据多得多的数据。同理,要保证WHERE子句的正确性。不正确的过滤条件会导致 DBMS 返回不正确的数据。

提示:叉联结
有时,返回笛卡儿积的联结,也称叉联结( cross join )。

内联结

目前为止使用的联结称为等值联结( equijoin ),它基于两个表之间的相等测试。这种联结也称为内联结( inner join )。其实,可以对这种联结使用稍微不同的语法,明确指定联结的类型。下面的SELECT语句返回与前面例子完全相同的数据:

SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是以INNER JOIN指定的部分FROM子句。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。
至于选用哪种语法,请参阅具体的 DBMS 文档。

外联结

联结包含了那些在相关表中没有关联行的行。这种联结称为外联结。
下面的SELECT语句给出了一个简单的内联结。它检索所有顾客及其订单:

SELECT Customers.cust_id,Orders.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id=Orders.cust_id;

外联结语法类似。要检索包括没有订单顾客在内的所有顾客,可如下进行:

SELECT Customers.cust_id,Orders.order_num
FRPM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id=Orders.cust_id;


类似上一课提到的内联结,这条SELECT语句使用了关键字OUTER JOIN来指定联结类型(而不是在WHERE子句中指定)。但是,与内联结关联两个表中的行不同的是,外联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。

左外连接(LEFT JOIN或LEFT OUTER JOIN) :包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行;

RIGHT OUTER JOIN

SELECT Customers.cust_id, Orders.order_num
FROM Customers RIGHT OUTER JOIN Orders
ON Orders.cust_id = Customers.cust_id;

SQL必知必会-联结相关推荐

  1. 《SQL必知必会》第十三课 创建高级联结表 使用不同类型的联结 使用带聚集函数的联结 使用联结时应注意的问题

    第十三课 创建高级联结表 #使用表别名的原因 #不同的联结类型以及每类联结所使用的语法 #如何与联结一起使用聚集函数 #使用联结时的注意问题 一.使用表别名 [1]前面(第七课)介绍使用别名引用被检索 ...

  2. GitHub#SQL#:SQL必知必会

    https://github.com/CyC2018/Interview-Notebook 一.基础 二.创建表 三.修改表 四.插入 五.更新 六.删除 七.查询 八.排序 九.过滤 十.通配符 十 ...

  3. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

  4. MySQL必知必会——第十五章联结表

    联结表 本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句. 联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表. 在能够有效地使用联结前,必须了解关系 ...

  5. 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作

    上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...

  6. SQL必知必会读书笔记

    <SQL必知必会> 1.SQL概述(概念.优点.数据库术语) * 日常生活中的数据库案例举例(例如在网站搜索东西:登录账号密码:取钱:) * 数据库概念:数据库database(以一种有组 ...

  7. SQL必知必会第4版读书笔记

    SQL必知必会_4 前言 @author 鲁伟林 在读电子版<<SQL必知必会>> 第4版时,做了下笔记.供以后自己或者其他学习者参考. 电子版<<SQL必知必会& ...

  8. 根据SQL必知必会学习SQL(MYSQL)

    很久都没有整理SQL语句了,遇到让写SQL语句的题也很迷茫,所以就重拾一下知识,本文章根据SQL必知必会进行梳理 文章目录 一.检索所有列 1.select 1.1检索单个列 1.2 检索多个列 1. ...

  9. 【SQL】【读书笔记】《MySQL必知必会》

    本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...

  10. SQL必知必会挑战题答案

    SQL必知必会挑战题答案 创建数据表 -- ----------------------------------------- -- Sams Teach Yourself SQL in 10 Min ...

最新文章

  1. 4 用python进行OpenCV实战之图像变换1(平移)
  2. PCA(2):PCA算法实现的两种方式
  3. Activiti工作流从入门到入土:整合spring
  4. BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!
  5. 20170904_C基础
  6. 揭秘视频千倍压缩背后的技术原理之预测技术
  7. word万维计算机教程,计算机课件word文档.doc
  8. 【词向量】从Word2Vec到Bert,聊聊词向量的前世今生(一)
  9. java 获取系统变量(环境变量和设置变量)
  10. Centos添加ip黑名单禁止某个ip访问,对登陆失败的主机进行封禁
  11. DbVisualizer 使用方法 图解(可以连接多种数据库的客户端)
  12. python火了_【资源篇】Python那么火,你还不知道如何人门?
  13. Bazinga HDU - 5510
  14. 以太网交换机的功能与特点
  15. vscode中打开浏览器的快捷键_VSCode设置默认打开的浏览器的方法
  16. JAVA实现生成原生二维码并上传至阿里云
  17. 一篇故事告诉你什么是微服务架构
  18. tableau无法建立连接_的Tableau错误连接到本地MySQL数据库
  19. 美拍应该如何引流?如何利用美拍引流?美拍引流方法
  20. mcjava盗版联机_盗版我的世界怎么局域网联机

热门文章

  1. 卡巴斯基误杀奇虎360
  2. macos 全局代理 app_「主观向」macOS 好软推荐(使用体验)
  3. bash 历史记录_您将实际使用的7个Bash历史记录快捷方式
  4. 为什么要使用GraphQL?
  5. 力软敏捷开发框架真正源码_敏捷真正使谁受益?
  6. wikipedia_教职员工可以通过Wikipedia进行教学吗?
  7. (20) Vue.js 框架基础面试题
  8. (41)css 三大隐藏属性
  9. Bootstrap 表单的扩展控件
  10. android 视频恢复软件,视频恢复软件免费版