基本查询一节的示例中,我们有从 instructor 和 teaches 表组合信息,匹配条件是 instructor.ID 等于 teaches.ID 的查询,ID 属性是两个表中具有相同名称的所有属性,按照两个表中所有相同名称属性组合实际上是一种通用情况,即 from 子句中的匹配条件在最自然的情况下需要在所有匹配名称的属性上相等。因此,SQL 提供了完成这种操作的运算,称之为自然连接(natural join)。实际上,SQL 还支持更丰富的连接(join)运算,后面会提到。

自然连接运算作用于两个关系,并产生一个关系作为结果,不同于两个关系上的笛卡尔积,笛卡尔积将第一个关系的每个元组与第二个关系的所有元组都进行连接;自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。

因此,回到 instructor 和 teaches 关系的例子上,它们的自然连接只考虑在唯一共有属性 ID 上取值相同的元组对。

mysql> select name, course_id
    -> from instructor natural join teaches;
+------------+-----------+
| name       | course_id |
+------------+-----------+
| Srinivasan | CS-101    |
| Srinivasan | CS-315    |
| Srinivasan | CS-347    |
| Wu         | FIN-201   |
| Mozart     | MU-199    |
| Einstein   | PHY-101   |
| El Said    | HIS-351   |
| Katz       | CS-101    |
| Katz       | CS-319    |
| Crick      | BIO-101   |
| Crick      | BIO-301   |
| Brandt     | CS-190    |
| Brandt     | CS-190    |
| Brandt     | CS-319    |
| Kim        | EE-181    |
+------------+-----------+
15 rows in set (0.01 sec)

我们知道 from 子句可以涉及多个关系,现在我们可以说,这些关系也可以是自然连接的结果,这是很直观的,因为自然连接的结果也是一个关系。

考虑查询,列出教师的名字以及他们讲授课程的名称。

mysql> select name, title
    -> from instructor natural join teaches, course
    -> where teaches.course_id = course.course_id;
+------------+----------------------------+
| name       | title                      |
+------------+----------------------------+
| Crick      | Intro. to Biology          |
| Crick      | Genetics                   |
| Srinivasan | Intro. to Computer Science |
| Katz       | Intro. to Computer Science |
| Brandt     | Game Design                |
| Brandt     | Game Design                |
| Srinivasan | Robotics                   |
| Katz       | Image Processing           |
| Brandt     | Image Processing           |
| Srinivasan | Database System Concepts   |
| Kim        | Intro. to Digital Systems  |
| Wu         | Investment Banking         |
| El Said    | World History              |
| Mozart     | Music Video Production     |
| Einstein   | Physical Principles        |
+------------+----------------------------+
15 rows in set (0.01 sec)

这个查询首先计算 instructor 和 teaches 的自然连接,如前所见,再计算这个救过和 course 的笛卡尔积,然后按照 where 子句筛选出结果,注意 where 子句中的 teaches.course_id 表示自然连接结果中的 course_id 域,这是因为该域最终来自 teaches 关系。

下面的查询给出的结果虽然在当前模式下相同,但其实是有问题的。

mysql> select name, title
    -> from instructor natural join teaches natural join course;
+------------+----------------------------+
| name       | title                      |
+------------+----------------------------+
| Crick      | Intro. to Biology          |
| Crick      | Genetics                   |
| Srinivasan | Intro. to Computer Science |
| Katz       | Intro. to Computer Science |
| Brandt     | Game Design                |
| Brandt     | Game Design                |
| Srinivasan | Robotics                   |
| Katz       | Image Processing           |
| Brandt     | Image Processing           |
| Srinivasan | Database System Concepts   |
| Kim        | Intro. to Digital Systems  |
| Wu         | Investment Banking         |
| El Said    | World History              |
| Mozart     | Music Video Production     |
| Einstein   | Physical Principles        |
+------------+----------------------------+
15 rows in set (0.00 sec)

它的问题在于 course 关系和 instructor 关系中都包含了 dept_name 属性,因此它们自然连接的结果要在这个属性上相同,这样的查询会遗漏以下模式的元组对,教师所讲授的课程不是他所在系的课程,前一个查询能够正确输出这样的元组对。

为了应付这个问题,即在保留自然连接的简洁性的同时规避过多的属性匹配,SQL 提供了一种自然连接的构造形式,允许用户来指定需要哪些列相等。

mysql> select name, title
    -> from (instructor natural join teaches) join course using (course_id);
+------------+----------------------------+
| name       | title                      |
+------------+----------------------------+
| Crick      | Intro. to Biology          |
| Crick      | Genetics                   |
| Srinivasan | Intro. to Computer Science |
| Katz       | Intro. to Computer Science |
| Brandt     | Game Design                |
| Brandt     | Game Design                |
| Srinivasan | Robotics                   |
| Katz       | Image Processing           |
| Brandt     | Image Processing           |
| Srinivasan | Database System Concepts   |
| Kim        | Intro. to Digital Systems  |
| Wu         | Investment Banking         |
| El Said    | World History              |
| Mozart     | Music Video Production     |
| Einstein   | Physical Principles        |
+------------+----------------------------+
15 rows in set (0.00 sec)

join ... using 运算中需要给定一个属性名列表,其两个输入中都必须具有指定名称的属性,考虑运算 r1 join r2 using (A1, A2),它与 r1 和 r2 的自然连接类似,只不过在 t1.A1 = t2.A1t1.A2 = t2.A2 的情况下就能匹配 r1 的元组 t1 和 r2 的元组 t2,即使它们都有属性 A3,也不考虑这个属性的事。

基于 MySQL 的数据库实践(自然连接)的更多相关文章

  1. 基于 MySQL 的数据库实践(基本查询)

    首先根据准备工作中的操作导入大学模式,打开数据库连接后进入到 MySQL 的交互界面,再使用命令 use db-book; 切换到 db-book 数据库. 单关系查询 SQL 查询的基本结构由三个子 ...

  2. 基于 MySQL 的数据库实践(准备工作)

    背景 本学期在北京大学选修了<数据库概论>的实验班课程,由于 SQL 语法并不是特别理论的内容,因此课上暂时也没有特别展开.出于探索数据库领域的兴趣,使用国内普遍使用的数据库软件 MySQ ...

  3. (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 决策树分析算法)

    随着大数据时代的到来,数据挖掘的重要性就变得显而易见,几种作为最低层的简单的数据挖掘算法,现在利用微软数据案例库做一个简要总结. 应用场景介绍 其实数据挖掘应用的场景无处不在,很多的环境都会应用到数据 ...

  4. Python操作MySQL以及数据库索引

    目录 python操作MySQL 安装 使用 SQL注入问题 MySQL的索引 为什么使用索引 索引的种类 主键索引 唯一索引 普通索引 索引优缺点 不会命中索引的情况 explain 索引覆盖 My ...

  5. 新浪微博基于MySQL的分布式数据库实践

    提起微博,相信大家都是很了解的.但是有谁知道微博的数据库架构是怎样的呢?在今天举行的2011数据库技术大会上,新浪首席DBA杨海潮为我们详细解读了新浪微博的数据库架构——基于MySQL的分布式数据库实 ...

  6. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  7. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  8. 在Jena框架下基于MySQL数据库实现本体的存取操作

    在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...

  9. 数据库连接池(基于MySQL数据库)

    使用JDBC是怎么保证数据库客户端和数据库服务端进行连接的? 通过代码: conn=DriverManager.getConnection(url, username, password); JDBC ...

随机推荐

  1. 笔记:I/O流-文件操作

    Java库中使用 Path 和 Files 类封装了在用户机器上处理文件系统所需要的所有功能,可以使用Paths来获取一个具体的Path对象,来表示具体的路径. 路径 Path表示的是一个目录名序列, ...

  2. ELK日志收集平台部署

    需求背景 由于公司的后台服务有三台,每当后台服务运行异常,需要看日志排查错误的时候,都必须开启3个ssh窗口进行查看,研发们觉得很不方便,于是便有了统一日志收集与查看的需求. 这里,我用ELK集群,通 ...

  3. rpm打包工具---FPM

    FPM的安装:fpm是由ruby gem仓库里面安装的所以要先装ruby.yum安装的ruby版本是1.8.7版本,使用gem命令会报错: >= 1.9.3,所以要安装一个比1.9.3版本高的 ...

  4. WEB 表格测试点

    Web页面的表格测试点: 1.表格列名 2.表格翻页.表格跳转到多少页.最后一页.首页 3.表格每页显示的数据, 数据的排序 4.表格无数据 5.表格支持的最大数据量 6.表格中数据内容超长时,显示是 ...

  5. eclipse中svn的各种状态图标详解

    - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽略文件. A file ignored by version co ...

  6. Node.js + gulp 合并静态页模版,文件更新自动热重载。浏览器可预览

    github地址:https://github.com/Liaozhenting/template 使用的是ejs的语法.其实你用什么文件后缀都可以,都是按ejs来解析. 模板文件放在componen ...

  7. 在Winform混合式框架中整合外部API接口的调用

    在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们 ...

  8. 贯穿程序员一生的必备开发技能——debug

    1.什么是debug debug是一种运行模式,用来跟踪程序的走向,以及跟踪程序运行过程中参数的值的变化. 2.debug的作用 debug一般用来跟踪代码的运行过程,通常在程序运行结果不符合预期或者 ...

  9. 201621123050 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  10. mongodb 高级操作

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...