基于 MySQL 的数据库实践(自然连接)
在基本查询一节的示例中,我们有从 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.A1 且 t1.A2 = t2.A2 的情况下就能匹配 r1 的元组 t1 和 r2 的元组 t2,即使它们都有属性 A3,也不考虑这个属性的事。
基于 MySQL 的数据库实践(自然连接)的更多相关文章
- 基于 MySQL 的数据库实践(基本查询)
首先根据准备工作中的操作导入大学模式,打开数据库连接后进入到 MySQL 的交互界面,再使用命令 use db-book; 切换到 db-book 数据库. 单关系查询 SQL 查询的基本结构由三个子 ...
- 基于 MySQL 的数据库实践(准备工作)
背景 本学期在北京大学选修了<数据库概论>的实验班课程,由于 SQL 语法并不是特别理论的内容,因此课上暂时也没有特别展开.出于探索数据库领域的兴趣,使用国内普遍使用的数据库软件 MySQ ...
- (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 决策树分析算法)
随着大数据时代的到来,数据挖掘的重要性就变得显而易见,几种作为最低层的简单的数据挖掘算法,现在利用微软数据案例库做一个简要总结. 应用场景介绍 其实数据挖掘应用的场景无处不在,很多的环境都会应用到数据 ...
- Python操作MySQL以及数据库索引
目录 python操作MySQL 安装 使用 SQL注入问题 MySQL的索引 为什么使用索引 索引的种类 主键索引 唯一索引 普通索引 索引优缺点 不会命中索引的情况 explain 索引覆盖 My ...
- 新浪微博基于MySQL的分布式数据库实践
提起微博,相信大家都是很了解的.但是有谁知道微博的数据库架构是怎样的呢?在今天举行的2011数据库技术大会上,新浪首席DBA杨海潮为我们详细解读了新浪微博的数据库架构——基于MySQL的分布式数据库实 ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
[点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...
- 在Jena框架下基于MySQL数据库实现本体的存取操作
在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...
- 数据库连接池(基于MySQL数据库)
使用JDBC是怎么保证数据库客户端和数据库服务端进行连接的? 通过代码: conn=DriverManager.getConnection(url, username, password); JDBC ...
随机推荐
- Spark Kudu 结合
Kudu的背景 Hadoop中有很多组件,为了实现复杂的功能通常都是使用混合架构, Hbase:实现快速插入和修改,对大量的小规模查询也很迅速 HDFS/Parquet + Impala/Hive:对 ...
- npm包使用语义化版本号
npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...
- redis的主从复制(读写分离)/哨兵(主从切换)配置
准备两个redis服务,两台机器,依次命名文件夹子master,slave1 10.10.10.7 10.10.10.8 1.master修改配置文件 [root@db2 conf]# cat 637 ...
- 网络通信 --> epoll用法
epoll用法 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll. epoll函数 1. 创建epoll的句柄 siz ...
- Java基础学习笔记五 Java基础语法之面向对象
面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- 敏捷冲刺每日报告三(Java-Team)
第三天报告(10.27 周五) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- django restful 1-在线Python编辑器
客户端(浏览器)----> 前端页面-----> 后端处理数据,并把数据以 json 形式发送到前端 online_app.py from django.conf import setti ...
- SQL的介绍及MySQL的安装
基础篇 - SQL 介绍及 MySQL 安装 SQL的介绍及MySQL的安装 课程介绍 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成, ...
- js:防抖动与节流
http://blog.csdn.net/crystal6918/article/details/62236730