mysql course表_MySQL多表查询初探

本文介绍了MySQL多表查询的基本概念和操作,通过学生选课系统举例,详细讲解了从建表到多表关联查询的过程,包括从FROM开始的执行顺序,以及WHERE条件、SELECT字段选择、ORDER BY和LIMIT等子句的作用。
摘要由CSDN通过智能技术生成

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

2a492bafc0475fc5a80c4d623870bce9.png

course表

6104607cfb87ba8219e0ba86aab2cfbd.png

student_course表

b53671c8f62ffaac853ff78f3e5105fa.png

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

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='张三'

最终结果:

789f63e8e7338bb4158ccaa66546859b.png

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

06f77c664487c87547a57e0072551a76.png

(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,执行结果见下面第二张图

9bc340d0c00d2671ce87725d2216aff9.png

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

3120178f8374e93eb5e6042b04cf35f6.png

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

59fb715255801f913968010f689c55f6.png

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

d866160d14a67c56f30a396f91df0d31.png

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

02f4871459868d5af5c56603c8480e00.png

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

e925ad04805438bcc89f34407143db4a.png

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

7dcfe78c7da267a2d7b0333127882228.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值