自连接

9.3  表的连接类型

9.3.1  自连接

自连接是指表与其自身进行连接,这就需要用到前面介绍的表别名。下面通过一个具体实例来讲解自连接的应用。

实例5  自连接的使用方法

查询成绩中存在不及格课程的学生的姓名、所在系、所有的课程及成绩信息。如果采用前面介绍的SELECT语句查询方法,该实例的实现要分为两步。

1.查询存在不及格课程的学生的学号

之所以查询学号,是因为学号是学生的惟一标识信息。代码:

SELECT   DISTINCT  SNO
FROM   STUDENT
WHERE  MARK<60

运行结果如图9.5所示。

 
图9.5  不及格课程学生的学号

注意 因为可能有的学生的不及格课程多于1门,因此在SELECT子句中使用了DISTINCT关键词,去除重复的学号。

2.根据学号查询相关信息

根据查询的学号结果,查询这些学号的学生的姓名、所在系、所有所修课程及成绩信息。代码:

SELECT   SNAME, DNAME, CNO, MARK
FROM   STUDENT
WHERE  SNO IN (‘9702’,’9703’,’9705’)
ORDER BY  SNAME

运行结果如图9.6所示。

 
图9.6  根据学号查询的相关信息

而如果采用表的自连接,只要通过一步查询就可以实现该实例。代码:

SELECT   DISTINCT S1.SNAME, S1.DNAME, S1.CNO, S1.MARK
FROM   STUDENT AS S1, STUDENT AS S2
WHERE  S1.SNO = S2.SNO
AND   S2. MARK<60
ORDER BY  S1.SNAME

运行结果如图9.7所示。

代码中,FROM子句中的两个表实际上都是表STUDENT。为了独立地使用它们,采用上节介绍的表别名方法,分别为其取别名S1和S2。这样就可以在WHERE子句中,使用S2设定分数查询条件,而在SELECT子句中,使用S1查询满足条件的结果。

需要说明一点,SELECT子句同样要有关键字DISTINCT,如果没有使用DISTINCT关键字,如下面的代码:

 
图9.7  采用表的自连接执行的查询结果

SELECT   S1.SNAME, S1.DNAME, S1.CNO, S1.MARK
FROM   STUDENT AS S1, STUDENT AS S2
WHERE  S1.SNO = S2.SNO
AND   S2. MARK<60
ORDER BY  S1.SNAME

运行结果如图9.8所示。

 
图9.8  采用表的自连接但没有去除重复记录的查询结果

可以发现,结果表中出现了重复的记录。下面分析一下代码的执行过程,从中就不难发现重复记录产生的原因。

系统首先执行FROM子句,将STUDENT表S1与它自身S2的笛卡尔积,作为中间表。实际上,该中间表的每一条记录包含两部分信息,一部分是S1的记录,一部分是S2的记录。而后执行WHERE子句,在中间表中,搜索S2中成绩低于60分的学生的记录,同时要求记录中S1与S2是同一个学生的记录即学号相同。最后执行SELECT语句,从中间表获取S1中相应的信息作为结果表。

当执行WHERE子句,从中间表中逐条搜索S2中成绩低于60分的学生的记录时,由于孙庆有两门课程不及格,所以对于每门不及格的记录都满足搜索条件,因此导致了从S1得到的信息中出现了重复记录。

简单来说,中间表是没有重复记录的,但是S1部分字段是有重复的,而结果集提取的只是S1部分的字段,因此就有可能有重复记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从此记录

从此记录工作、学习、生活的那些事儿&#xff01;转载于:https://www.cnblogs.com/alwaysjava/p/4221362.html

LIKE运算符

6.5 使用LIKE进行模糊查询 当只知道部分字符串时&#xff0c;可使用LIKE运算符来查询数据库&#xff0c;找出与其相关的整个字符串。因此&#xff0c;当把关键字LIKE用在WHERE子句中时&#xff0c;可以比较两个字符串的部分匹配。当对字符串内容有些印象&#xff0c;但并不知…

AND运算符

6.2 组合查询条件 在前一章提到的WHERE子句进行查询时&#xff0c;WHERE子句后面的搜索条件只是单一的。实际上&#xff0c;可以通过布尔运算符AND和OR&#xff0c;将多个单独的搜索条件结合在一个WHERE子句中&#xff0c;形成一个复合的搜索条件。当对复合搜索条件求值时&a…

Cron表达式【一】

Cron表达式【一】 Cron表达式被用来配置CronTrigger实例。 Cron表达式是一个由 7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔&#xff0c;分别表示&#xff1a; 1. Seconds 秒 2. Minutes 分钟 3. Hours 小时 4. Day-of-Month 月…

OR运算符

6.2.2 OR运算符 OR运算符表示“或”的关系。当可能有多个条件为True&#xff0c;但只要有一个为True就满足搜索要求时&#xff0c;可以使用OR运算符来组合搜索条件。OR在结合两个布尔表达式时&#xff0c;只要其中一个条件为True时&#xff0c;便传回True。OR运算符的真值表…

Java基础---网络编程

第一讲 概述 1、网络模型&#xff1a;OSI参考模型和TCP/IP参考模型 图示&#xff1a; 一般来说开发处于传输层和网际层&#xff0c;应用层为&#xff1a;FTP和HTTP协议等&#xff0c;传输层为&#xff1a;UDP和TCP等&#xff0c;网际层为&#xff1a;IP。 通常用户操作的是…

AND、OR运算符的组合使用

6.2.3 AND、OR运算符的组合使用 在WHERE子句中&#xff0c;通过AND、OR运算符可以同时连接多个条件&#xff0c;当然AND、OR运算符也可以同时使用。但是当AND、OR运算符同时存在时&#xff0c;其优先级如何确定呢&#xff1f;与大多数语言一样&#xff0c;SQL语言认为AND运算…

Nginx配置指定媒体类型文件强制下载

由于业务需要&#xff0c;在点击显示链接&#xff08;如www.xxx.com/2015-01-15/xxx.png&#xff09;显示媒体资源&#xff08;如图片、视频、音频、文档&#xff09;&#xff0c;而在点击下载链接&#xff08;如www.xxx.com/2015-01-15/xxx.png?downloadtrue&#xff09;请求…

IN运算符的使用

6.3 IN运算符 在查询中&#xff0c;有时只要满足多个条件中的一个条件即可&#xff0c;如查询地址在北京、上海或者重庆的学生信息&#xff0c;这时候可以使用IN运算符。 6.3.1 IN运算符的使用 IN运算符允许根据一行记录中&#xff0c;是否有一列包括在一系列值之中&#…

app后端设计(php)

来源&#xff1a;http://blog.csdn.net/column/details/mobilebackend.html?page1 做了3年app相关的系统架构&#xff0c;api设计&#xff0c;先后在3个创业公司中工作&#xff0c;经历过手机网页端&#xff0c;android客户端&#xff0c;iphone客户端&#xff0c;现在从事日p…

NOT运算符与运算符

6.4.2 NOT运算符与<>运算符 对于简单的条件查询&#xff0c;NOT运算符与<>运算符的功能几乎没有什么区别&#xff0c;那么NOT运算符的优势体现在哪里呢&#xff1f;答案是它可以与其他运算符组合使用&#xff0c;这一点是<>运算符所不能实现的。在6.4.1节已…

bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (三) 图片裁剪

官方的例子 是 长方形的。 我这里 用于 正方形的头像 所以 做如下 修改 #preview-pane .preview-container {width: 73px;height: 73px;overflow: hidden;} 可惜很莫名奇妙的是 有的时候 他自动把图片 变小了&#xff0c;而且针对的都是 小图&#xff0c;大图 都显示正常 发现…

“%”通配符

6.5.2 “%”通配符 在SQL语言中最常用的通配符可能就是“%”了&#xff0c;它表示任意字符的匹配&#xff0c;且不计字符的多少。下面通过几个典型实例来说明“%”通配符的使用。 1&#xff0e;开头&#xff0f;结尾匹配 从COURSE表中查询所有以“计算机”开头的所有课程的…

Wireshark基本介绍和学习TCP三次握手

Wireshark基本介绍和学习TCP三次握手 原文&#xff1a;http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html wireshark介绍 wireshark的官方下载网站&#xff1a; http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件&#xff0c;功能十分强大。可…

“_”通配符

6.5.3 “_”通配符 “_”通配符的功能与“%”通配符基本相同&#xff0c;只是它只表示任意一个字符的匹配。当然&#xff0c;要表示两个字符的匹配&#xff0c;就需要使用两个“_”通配符&#xff0c;即写成“__”。 只有在用户确定所要查询的字符串的个数&#xff0c;只是不…

“[]”通配符

6.5.4 “[]”通配符 “[]”通配符用于指定一系列的字符&#xff0c;只要满足这些字符其中之一&#xff0c;且位置出现在“[]”通配符的位置的字符串就满足查询条件。 当然&#xff0c;各种通配符也可以组合使用。组合使用各种通配符时&#xff0c;一定要弄清其表示的匹配条…

QT分页控件,开源,供大家使用

下载地址&#xff1a;http://files.cnblogs.com/dragonsuc/qt5.rar 转载于:https://www.cnblogs.com/dragonsuc/p/4242342.html

使用ESCAPE定义转义符

6.5.5 使用ESCAPE定义转义符 在使用LIKE关键字进行模糊查询时&#xff0c;“%”、“_”和“[]”单独出现时&#xff0c;会被认为是通配符。为了在字符数据类型的列中查询是否存在百分号&#xff08;%&#xff09;、下划线&#xff08;_&#xff09;或者方括号&#xff08;[]&…

STL学习小结

STL就是Standard Template Library&#xff0c;标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说&#xff0c;STL是一些“容器”的集合&#xff0c;这些“容器”有list, vector,set,map等&#xff0c;STL也是算法和其它一些组件的集合。这里的“容器…

内连接(INNER JOIN)

9.3.3 内连接&#xff08;INNER JOIN&#xff09; 内连接也称为等同连接&#xff0c;返回的结果集是两个表中所有相匹配的数据&#xff0c;而舍弃不匹配的数据。也就是说&#xff0c;在这种查询中&#xff0c;DBMS只返回来自源表中的相关的行&#xff0c;即查询的结果表包含的…