mysql嵌套查询学生表,【Mysql】利用内连接与嵌套查询实现多表查询,主键、外键的基本...

虽然多表查询,在计算机的必须课,数据库,里面已经大讲特讲,但是这个难点很多老师都没有讲深讲透。跟你净扯一大堆,左连接右连接的东西,让人一头雾水。老师把

虽然多表查询,在计算机的必须课,数据库,里面已经大讲特讲,但是这个难点很多老师都没有讲深讲透。跟你净扯一大堆,左连接右连接的东西,让人一头雾水。老师把所有多表查询的方法告诉你,但是到头来一种方法都没有掌握。其实只要记住一种就够了,学会多表查询,除了在你考数据库能够拿到很高分之外,到了实际应用,很多地方都用到多表查询。比如论坛工程中分析回帖发帖的关系,提供该用户发了什么帖子的功能、比如信息管理系统中,分析班级与学生、老师之间的关系,提供该班级中存在多少学生的查询功能。就需要用到多表查询,你总不能把每一表都弄到如同视图一般,然后关系表不要把?说到地就是如何创建不同的视图给不同攻城狮使用,下面使用MYSQL举个例子说明,如何利用内连接与嵌套查询,实现多表查询。其实所有数据库都一样,SQL语句是通用的。

一、基本目标

已知,在test数据库,可自行脑补为school数据库,中存在如下表:

8d052a2652465a85c04bbc703c25531f.png

(1)学生表i_student,里面记录着该学校所有学生的数据,表示该学校中有3个学生a,b,c

c6e337f8983c758d1cd2991d4cac6d7e.png

(2)班级表i_class,里面记录着该学校所有班级的数据,表示该学校中有2个学生1,2

15aad20944d4ea055f06c370d2834536.png

(3)班级-学生关系表i_class_student,里面记录着该学校所有班级与学生的对应关系,表示该学校中1班有学生1,2,2班有学生3

4843e2721b5e6e5e2dbe6c8cbc13779c.png

然后问题来了,求1班中有哪些学生?怎么用SQL语句查询?

二、基本思想

其实这三张表有如下简单的关系:

bfee64cb8bf9a0325f9542ab4cea392c.png

班级-学生关系表i_class_student的class_id数据取自班级表i_class的主键id,班级-学生关系表i_class_student的student_id数据取自学生表i_student的主键id,存在一个所谓的“参照完整性”,如图上面的那个箭头就是外键嘛。其余表中的钥匙图标就是主键嘛,每一个表的ID列存在所谓的“实体完整性”嘛,也就是说ID列数字不能再出现第二次或许不能不填,也就所谓的唯一且非空。

三、制作过程

1、基于上面的分析,你可以先对班级-学生关系表i_class_student下手,使用如下的语句:

select student_id from i_class_student where class_id=1

查出1班辖下的所有student_id

ef75ce6f51259c582e8c779e271e49f9.png

2、再对学生表i_student下手,根据找出这些student_id对应的学生名字就行了嘛,这里要把上面的查询结果,与整张学生表i_student中的ID列与姓名列name连起来再查询。首先你要有张学生表i_student的ID列与姓名列name。虽然现在整张学生表i_student中的ID列与姓名列name就是整张学生表i_student,但是实际中学生表i_student往往不止存两列信息。通过一句简单得不能再简单,凡是学过数据库都必须知道的语句查出整张学生表i_student中的姓名列name:

select id,name from i_student查询结果如下:

7b42486762202f3fcb6fcb48b67e4045.png

3、设第一步的查询结果为t1,第二步的查询结果为t2,把t1与t2两张表连接起来,只存在保留id与student_id对应的结果,就得到最后的结果:

61b2c332c22878b27c52fb3c8ca25a53.png

所以同样把第一步的查询语句与第二步的查询语句,加条件地内连接起来,便得到如下的查询语句,但此时我们无需再查询学生表i_student的id了,,这个id只作比对作用,可以把第二步的查询语句中的id去掉,

select name from i_student as t1

INNER JOIN

(select student_id from i_class_student where class_id=1) as t2

where t1.id=t2.student_id也自然而然地得到正确的结果:

04d13e4b0d7a9f6d3cd9a077834dbcc7.png

班级1不正是有a,b两个学生吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值