今天是我时隔五年再次动起键盘写文章,距离我上一次写文章,初中作文......所以我的文章并没有雕章琢句,更不会惊天地泣鬼神,只要大家能学到知识,我就很开心了。呀丫丫......又开始罗嗦一大堆没用的了,废话不多说了。开始直入今天要讲的技术主题——MySQL多表查询初探

一、叙述

今天我们要讲的技术内容就是关于MySQL技术最重要的内容之一,大家都知道,对于数据库而言,增删改查(C增R查U改D删-CRUD)中的查询操作是4种操作中频率出现最大、也是最难的。而简单的单表查询操作,相对而言较简单,可多表关联查询那可是把纵多数据库初学者给难倒了。我写这篇文章的目的,也是为了跟着大家从不同的视角来学习这些知识。可能这些是老师没有讲过的知识,书本上没有看到过的知识,也没关系,我相信大家如果认真的看了这篇文章,那么你对多表关联查询,一定会有一个初步的认识。

二、建表

我们要选的题材的是学生选课这样一个系统,这个系统提取出三张表,学生信息表(student)、课程表(course)、学生选课表(student_course)。

建表语句如下:

CREATE TABLE`student` (

`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '学生id',

`name`varchar(45) DEFAULT NULL COMMENT '学生姓名',

`sex`varchar(45) DEFAULT NULL COMMENT '学生性别',

`age`int(11) DEFAULT '0' COMMENT '学生年龄',PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE`course` (

`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '课程id',

`code`varchar(45) DEFAULT NULL COMMENT '课程号',

`name`varchar(45) DEFAULT NULL COMMENT '课程名称',PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE`student_course` (

`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '选课id',

`s_id`int(11) DEFAULT NULL COMMENT '学生id',

`c_id`int(11) DEFAULT NULL COMMENT '课程id',

`score`float DEFAULT '0' COMMENT '课程分数',PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入如下测试数据:

student表

course表

student_course表

三、多表关联查询语句讲解

1、第一种多表查询讲解

select from where group by having order by limit

知识讲解:很多同学以为执行语句是从Select关键字开始的,其实这是一种错误的看法。在我看来,select是最后执行的,怎么?有些同学现在可能开始不相信我了,可老师告诉我们select关键字是查询语句啊,如果不是先执行select,难道是先执行limit不成?答案不对,当然不可能先执行limit操作了。让我们从现在开始剖析一条查询语句的执行过程,以及语句的执行顺序。其实一条查询语句最先是从from关键字开始执行,from关键字开始执行,把所有表取出来,如果查询多于一张表的,将这些表进行一个笛卡尔乘积,不懂的同学可百度百科学习一下,简单来说,就是表1每行数据与表2每行数据交叉相乘,然后产生一张虚拟表T1。下一步开始对虚拟表T1执行where条件过滤,然后产生虚拟表T2。下一步对虚拟表T2执行group by分组操作,然后产生虚拟表T3。下一步对虚拟表T3执行hiving过滤,然后产生虚拟表T4。下一步对虚拟表T4执行select字段获取所需要的字段数据,然后产生结果表T5。下一步对虚拟表T5执行order by排序操作,然后产生虚拟表T6。下一步对虚拟表T6执行limit查询条数,然后产生虚拟表T7。表T7是我们执行这条查询语句所获得的结果,很多同学应该还听的有些云里雾里的。但是我已经概括了一条多表查询语句的执行过程了,接下来我们详细展开来讲。

2、查询过程详解

我们来点实际的,对一条SQL语句进行解剖吧!

我们已经知道张三的名字,接下来想查询张三选课的各科成绩。因为我对这个查询已经很老手了,所以开始来讲解步骤吧。

查询语句:select student.name,course.name, student_course.score FROM student, student_course, course where student.id=student_course.s_id and course.id=student_course.c_id AND student.name='张三'

最终结果:

(1)、首先查询语句从from关键字开始执行,FROM student, student_course, course ,将三张表进行笛卡尔乘积,产生虚拟表T1,虚拟表T1结果如下图

(2)、对虚拟表T1执行where操作,where student.id=student_course.s_id and course.id=student_course.c_id AND student.name='张三',为什么要进行这个操作,前面两个条件是进行外建关联,把不属于每个人的数据给过滤掉,最后一个条件就是指定要保留的数据。执行完之后产生虚拟表T2

我们来剖析这个步骤的执行,多表查询最重要的操作,我觉得应该是数据的过滤这一步。

对上一个执行结果虚拟表T1进行Where条件1执行:student.id=student_course.s_id,执行结果见下面第二张图

这操作过程我给画出来了,红线分割的第一部分 表别名为:student,红线分割的第二部分 表别名为:student_course, 红线分割的第三部分 表别名为:course。因为要where执行第一个条件student.id=student_course.s_id。所以就是每一行数据的第一列student.id和第六列student_course.s_id相等的,我才保留下来,这些打上蓝色歪歪扭扭的勾就是执行完第一个条件还能保留下来的数据。也就是下面这张图

对虚拟表T1执行Where的第一个条件后,我们开始执行第二个条件:course.id=student_course.c_id,执行结果见下面第二张图

这操作过程我给画出来了,红线分割的第一部分 表别名为:student,红线分割的第二部分 表别名为:student_course, 红线分割的第三部分 表别名为:course。因为要where执行第一个条件后执行第二个条件course.id=student_course.c_id。所以就是每一行数据的第七列student_course.c_id和第九列course.id相等的,我才保留下来,这些打上蓝色歪歪扭扭的勾就是执行完第二个条件还能保留下来的数据。也就是下面这张图

对虚拟表T1执行Where的第二个条件后,我们开始执行第三个条件:student.name='张三',也就是上图的第二列数据等于张三的行我们才保留下来,执行结果见下图

(3)、对虚拟表T1执行where操作后产生虚拟表T2,最后我们执行select student.name,course.name, student_course.score选取我们所需要的列数据,产生虚拟表T3,也就是最终结果,如下第二张图

最终我们只选择 student.name,course.name, student_course.score这些列作为最终结果,也就是T2表的第二列, 第八列,第十一列,执行完select得到虚拟表T3,也就是最终结果表,如下图

至此,我们已经得到想要的结果,也分析了多表查询语句的执行顺序。

(未完,待续。。。。。。)

mysql course表_MySQL多表查询初探相关推荐

  1. mysql带账号联查表_MySQL联表查询的简单示例

    MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型 ...

  2. mysql中调用多个表_MySQL 多表查询

    文章转载的:http://www.cnblogs.com/BeginMan/p/3754322.html 一.多表查询方法分类 1.交叉连接查询(得到的是两个表的乘积,类似于矩阵乘积) select ...

  3. mysql score表_MySQL连表查询练习题

    建库 库名:linux50 字符集:utf8 校验规则:utf8_general_ci mysql> create database if not exists linux5 charset u ...

  4. mysql左驱动表_MySQL多表联表查询驱动表选择

    联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件) ...

  5. mysql子查询存到另一张表_MySQL多表查询与子查询

    多表查询 多表查询实际上根据查询要求先将两个表连接起来,形成一张新表,再在新表中查询出满足条件的记录多表查询可分为连接查询和子查询. 一. 连接查询(可分为外连接和内连接)关于外链接的几点说明: A. ...

  6. mysql历史表_MySQL历史表设计和查询

    TL; DR:这个设计是否正确,我应该如何查询? 我们假设我们有city和地址的历史记录表,其设计如下: CREATE TABLE city_history ( id BIGINT UNSIGNED ...

  7. mysql 实务操作_mysql多表操作

    多表查询 内连接:过滤为空的数据(查询的实际上是两张表数据的交集部分) select * from 表1,表2 where 表1.字段=表2.字段; //隐式内连接,使用where条件消除笛卡尔积 s ...

  8. mysql类型设计_mysql设计表结构数据类型的选择

    选择合适的数据类型 在使用MySQL创建数据表的时候会遇到一个问题,如何为字段选择合适的数据类型.比如创建一个员工信息表,每个字段都可以用很多种类型来定义, int,char,float等等. cha ...

  9. 清除mysql数据碎片_MySQL 清除表空间碎片方法总结

    mysql数据库会生成空间碎片了,这些空间碎片对于我们来讲影响不大但如果空间碎片多了会导致mysql查询缓存了,下面一起来看MySQL 清除表空间碎片方法吧,具体的如下所示. 碎片产生的原因 (1)表 ...

最新文章

  1. IT人员健康信号之舌苔
  2. 窗外传来嬉闹声,我默默关上窗
  3. Android6.0 keyguard锁屏加载流程分析
  4. [小才能]防备误删文件
  5. leetcode131. 分割回文串(回溯)
  6. linux vim debugger,Vim 调试:termdebug 入门
  7. 《Unix环境高级编程》学习笔记:从点到面
  8. 终于,腾讯也要造车了
  9. matlab对excel数据求均值,matlab对excel数据的处理,判断时间是否相同,求均值
  10. 蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
  11. 无人机系统测试软件,无人机航测软件(pix4D)
  12. 和Keyle一起学ShaderForge – Create Base Shader
  13. 2024考研《艺术学概论》彭吉象|复习笔记(下篇)(7-12章)
  14. 计算机键入命令,win7系统安装软件出现命令行选项语法错误键入“ 命令/?”怎么办...
  15. 盘点7款常用的数据分析工具
  16. matlab三个商人三个随从,商人们怎样安全过河 (附MATLAB程序完整)
  17. Python中的数值运算与逻辑运算
  18. 最新苹果手机iPhone各机型尺寸以及像素对照表
  19. 雷电2接口_Intel发布雷电4接口,相比之前的雷电3,雷电4都改进了什么?
  20. 微机原理与接口技术:接口概述 详细笔记

热门文章

  1. java proguard_java防止反编译之proguard混淆代码
  2. python类的学习TypeError: Dog() takes no arguments
  3. 愚人节,360搜索和搜狗提前发动愚人攻略
  4. 微博动态来自Android,Android新浪微博开发(二)主UI的实现:动态建立TabActivity
  5. Oracle PL/SQL 存储过程
  6. 中国矿业大学计算机学院兼辅,江苏师范大学科文学院举行辅导员“周末下午茶”茶坊开业仪式暨Cup1活动...
  7. 计算机考研辅导书电子版,2021广东工业大学计算机技术考研真题经验参考书.pdf...
  8. Python处理json字符串
  9. 手把手教你!0基础小白也可以使用谷歌服务器搭建自己的博客网站
  10. BZOJ3578:GTY的人类基因组计划2(集合hash,STL)