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

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

一、基本目标

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

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

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

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

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

二、基本思想

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

班级-学生关系表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

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

查询结果如下:

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

所以同样把第一步的查询语句与第二步的查询语句,加条件地内连接起来,便得到如下的查询语句,但此时我们无需再查询学生表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

也自然而然地得到正确的结果:

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

时间: 2024-08-25 19:40:45

【Mysql】利用内连接与嵌套查询实现多表查询,主键、外键的基本概念的相关文章

MySQL 外连接、内连接,连接查询、多表查询、子查询、视图

MySQL连接查询.多表查询.子查询: 连接查询:事先将两张或多张表join,根据join的结果进行查询: [导入hellodb.sql数据库],输入密码即可 [[email protected] home]# mysql -uroot -p  mydb < /home/hellodb.sql     hellodb.sql数据库下载链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re [查看students表] mysql> select * from stu

MySQL的内连接,左连接,右连接,全连接

内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   之类的比较运算符).包括相等连接和自然连接. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行 左连接(LEFT   JOIN   或   LEFT   OUTER   JOIN)是右左边表中的数据为基准,若左表有数据右表没有数据,否则显示左表中的数据右表中的数据显示为空 右连接(RIGHT  JOIN  或  RIGHT   OUTER   JOIN)是以右边表中的数据为基准,若右表有数据左表没有

mysql第四篇:数据操作之多表查询

mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname VARCHAR(50) not null COMMENT '部门名称' )ENGINE=INNODB DEFAULT charset utf8; #添加部门数据 INSERT INTO `dept` VALUES ('1', '教学部'); INSERT INT

Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入

SELECT:查询 SELECT select-list FROM tb WHERE qualification  根据标准qualification查找对应的行 查询语句类型:  qualification条件  field领域  distinct独特的 简单查询: 多表查询: 子查询: SELECT * FROM tb_name: 查询tb_name表的所有信息 SELECT field1,field2 FROM tb_name: 投影显示所设定的领域条目(field),一个field就是一

MySQL主键 外键 索引

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

MySQL 主键外键

笛卡儿积 多表查询 ,多个表变成一个表 完整性约束条件primary key    标识该属性为该表的主键,可以唯一的标识对应的元组foreign key    标识该属性为该表的外键,是与之联系的某表的主键not null       标识该属性不能为空unique         标识该属性的值是唯一的auto_increment 标识该属性的值自动增加default        为该属性设置默认值设置从表 外键constraint 外键别名 foreign key(属性1.1, 属性1.

MySQL基础之 主键外键设置

外键: 定义:如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表. 作用:外键是用来实现参照完整性的,不同的外键约束方式将可以是两张表紧密的结合起来.比如修改或者删除的级联操作等,外键主要用来保证数据的完整性和一致性. 条件: 1.创建外键的两个表,父表与子表必须是InnoDB存储引擎. 2.创建外键的时候,父表要创建索引,一般为主键索引.子表在创建外键的时候也必须要创建索引. 3.子表的外键必须和父表的主键数据类型相对应(字段的类型和值必须一样或者相似,比如i

MySQL数据库 多表查询 交叉连接 自然连接 内连接 自连接 外连接 子查询 多表查询练习 单表查询练习 &#109806;

原文: http://blog.gqylpy.com/gqy/466 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

Mysql的内连接,外链接,交叉链接

内连接:只连接匹配的行  inner join select A.*,B.* from A,B where A.id = B.parent_id 外链接包括左外链接,右外链接,全外链接 左外链接:包含左表的所有行,右表不匹配的显示null select A.*,B.* from A left join B on A.id = B.parent_id 右外链接:包含右表所有行,左表不匹配的显示null 全外链接:包含左右两表的全部行 full join 交叉链接:笛卡尔积 将一个数据源中的每个行与