热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL数据库基础(笔记整理四)

多表查询当你打算从多个数据表选取信息时,有一种方法叫做联结(join)。把一个数据表与另一个数据表中的信息结合起来

多表查询

当你打算从多个数据表选取信息时,有一种方法叫做联结(join)。把一个数据表与另一个数据表中的信息结合起来才能得到查询结果。联结操作是通过并把两个(或多个)数据表里的同类数据进行匹配而完成的。多表操作的另一种方法是将SELECT语句嵌套在另一个SELECT语句里,前者叫做子查询。例如:

mysql> SELECT student.name,grade_event.date, score.score, grade_event.category
-> FROM grade_event INNER JOIN score INNER JOIN student
-> ON grade_event.event_id = score.event_id
-> AND score.student_id = student.student_id
-> WHERE grade_event.date = '2018-10-07' ;

这条查询先查出给定日期的grade_event行,再利用此行里的event_id 把score数据表里拥有同一event_id 的考试分数都查出来,并且把score和student数据表里都有student_id的数据列查出来,利用这个关系把学号映射为他们的姓名。每找到一组彼此都匹配的grade_event行和score行,score行和student行,就把学生的姓名、考试分数、日期和考试事件的类型显示出来。这条查询与单表查询相比:


  • 在FROM子句里,我们列举出了多个数据表的名字,因为我们要从多个数据表里检索数据

  • 在ON子句里,我们给出了grade_event数据表和score数据表,score数据表和student数据表的联结条件,这grade_event和score数据表里的event_id 列的值必须相互匹配(并且 为了消除歧义,这里对event_id进行了完全限定),而score和student数据表里的student_id列的值必须相互匹配。

换一种情况,加入现在有一个表是记录学生们的考试缺考情况(absence表),如果你想看到缺考的学生信息,就需要把absence表与student表通过student_id 列的值联结起来。例如:

mysql> SELECT student.student_id, student.name,
-> COUNT(absence.date) AS absences
-> FROM student INNER JOIN absence
-> ON student.student_id = absence.student_id
-> GROUP BY student.student_id;

上面的这条查询对于想知道都有哪些学生缺考的情况,查询结果正是我们需要的。但假如你需要对所有学生的考生出勤情况做一个统计,(即需要同时显示出没有缺考的学生信息)那么我们就需要用LEFT JOIN来代替普通的联结操作。 LEFT JOIN 将使MySQL 为联结操作中第一个数据表(即关键字LEFT JOIN左边的数据表)里的每一个中选数据行生成一个输出行。上例可以修改为:

mysql> SELECT student.student_id, student.name,
-> COUNT(absence.date) AS absences
-> FROM student LEFT JOIN absence
-> ON student.student_id = absence.student_id
-> GROUP BY student.student_id;

上面这条查询,不仅可以列出缺考的学生的信息,还会返回没有缺考的学生的信息,并且缺考次数统计为0 。

RIGHT OUTER JOIN ....ON 即为右联结,与左联结正好相反,用法相同。其实对左联结来说,将表的顺序交换就是右联结。还有全联结(全外联结),但MySQL不支持此种联结方式。

联结操作并非只能作用于不同的数据表,你可以把某个数据表和它自身结合起来。例如:你想知道在student表中是否有两个同学籍贯相同。

mysql> SELECT s1.name, s1.city, s1.state FROM student AS s1 INNER JOIN student AS s2
-> ON s1.city = s2.city AND s1.state =s2.state
-> WHERE (s1.name != s2.name)
-> ORDER BY state, city , name;

这条查询有两个需要注意的地方:


  • 它需要两次用到同一个表,所以我们必须为它创建两个别名(s1 和s2)才能把表中的同名数据列区分开来。

  • 用WHERE子句来确保每名学生的记录只能与其他学生相匹配,来剔除“记录与它本身相匹配”的情况。


MySQL认为任何一个查询都是一次“关联” ,并不仅仅是一个查询需要两个表匹配才叫关联,所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至是基于单表查 询)都可以是一次关联。MySQL执行关联的策略很简单:MySQL对任何关联都执行嵌套循环关联操作。即MySQL先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中的匹配行为止。然后根据各个表匹配的行,返回查询需要的各个列。


多表检索的另一类方法,嵌套查询

嵌套查询也就是它一条SELECT语句嵌套在另一条里。例如:

mysql> SELECT * FROM student WHERE student_id
-> NOT IN(SELECT student_id FROM absence);

上面的这条查询把全体没有缺勤的学生找出来。嵌套与内层的SELECT语句用来生成一个absence数据表里出现过的student_id 值的集合,外层的SELECT语句负责把与该机合理的任何一个ID值都不匹配的student数据行检索出来(NOT IN)。


2018/10/14 MySQL数据库基础笔记整理(四)


推荐阅读
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
author-avatar
雪蝴蝶的诺言forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有