当前位置: 首页 > news >正文

MySQL——联合查询数据表

目录

一:本节目标

二: 简介

2.1 为什么要使⽤联合查询

2.2 多表联合查询时MYSQL内部是如何进⾏计算的

2.3 构造练习案例数据

2.4 案例:⼀个完整的联合查询的过程

三:内连接

3.1 语法

3.2实例

四: 外连接

4.1 语法

4.2 ⽰例

五:⾃连接

5.1 应⽤场景

5.2 ⽰例

5.3 表连接联系

六:⼦查询

6.1 语法

6.2 单⾏⼦查询

6.3 多⾏⼦查询

七: 合并查询

7.1 创建新表并初始化数据

7.2 Union

7.3 Union all


一:本节目标

了解联合查询的计算过程
掌握内连接、左外连接、右外连和⾃连接接查询
掌握⼦查询和合并查询
掌握插⼊查询结果和根据查询结果创建表

二: 简介

2.1 为什么要使⽤联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获取,这时就需要使⽤联合查询,这⾥的联合指的是多个表的组合。

我们需要的是给用户呈现的是:
学生表的编号、姓名、性别、班级编号列、以及班级表的班级列
就是一次查询需要从多张表中获得数据,将成为联合查询(表连接查询)。

2.2 多表联合查询时MYSQL内部是如何进⾏计算的

参与查询的所有表取笛卡尔积,结果集在临时表中

观察哪些记录是有效数据,根据两个表的关联关系过滤掉⽆效数据

如果联合查询表的个数越多,表中的数据量越⼤,临时表就会越⼤,所以根据实际情况确定联合查询表的个数,大量的无效数据。

2.3 构造练习案例数据

- 1. 删除表(按外键依赖逆序:先删子表,再删父表)
DROP TABLE IF EXISTS score;
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS class;-- 2. 创建表(按依赖顺序:先父表,后子表)-- 班级表(无外键依赖)
CREATE TABLE class (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);-- 课程表(无外键依赖)
CREATE TABLE course (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);-- 学生表(依赖 class)
CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,sno VARCHAR(20) NOT NULL UNIQUE,age INT,gender TINYINT COMMENT '1: 男, 0: 女',enroll_date DATE,class_id INT,FOREIGN KEY (class_id) REFERENCES class(id)
);-- 成绩表(依赖 student 和 course)
CREATE TABLE score (id INT PRIMARY KEY AUTO_INCREMENT,score DECIMAL(5, 2),student_id INT,course_id INT,FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE,FOREIGN KEY (course_id) REFERENCES course(id) ON DELETE CASCADE,UNIQUE KEY uk_student_course (student_id, course_id)
);
# 课程表
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计
算机网络'), ('数据结构');
# 班级表
insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
# 学生表
insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孙悟空', '100002', 18, 1, '1986-09-01', 1),
('猪悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟净', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想毕业', '200004', 18, 1, '2000-09-01', 2);
# 成绩表
insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

2.4 案例:⼀个完整的联合查询的过程

查询学⽣姓名为孙悟空的详细信息,包括学⽣个⼈信息和班级信息
1:先确定要查询的表(学生,班级)
2:过滤无效数据(可以通过表名.列名的方式来指定那个表中的那个列参与比较)得到正确的结果
3:通过where条件进一步过滤结果。

4:进一步精减查询列表

 select student.id,student.name,student.sno,student.age,student.gender,student.enroll_date,class.name from student,class where student.class_id=class.id and student.name='孙悟空';

5:通过别名的查询

总结一下:
1:确定那几张表参与查询
2:根据表与表之间的关系,过滤掉无效数据
3:通过where条件进一步过滤结果
4:精简查询列表,得到想要的结果
5:通过为表起别名,精减查询语句

三:内连接

3.1 语法

select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件;
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;(规范写法)
join两边分别是要链接的表,on后面就是链接条件 

3.2实例

查询"唐三藏"同学的成绩

查询所有同学的总成绩,及同学的个⼈信息
先确定是哪几个表,所有同学的总成绩 那就要分组了(按照id 姓名都可以),然后使用聚合函数 sum加起来

对那个表的列求和,就对那个表的列分组。


Group by 使⽤了student.id进⾏分组,查询表列表中的student.name没有出现在Group by分组中,也没有包含在聚合函数中,这是因为SQL规定在Group by分组查询时,如果查询列表中的列没有出现在GROUP BY⼦句中,但这些列的值在每个分组内部是相同的,那么它们可以出现在查询结果中。

查询所有同学每⻔课的成绩,及同学的个⼈信息

因为一个学生有多门成绩 是一对多的关系,然后把学生和成绩表建立关系

然后把成绩和班级做关联。

四: 外连接

外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。

左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

无论左外联还是右外连 必须找到基准表
左外连接,是以左表为基础
右外连接,是以右边为基础
基准表中的记录会被显示出来

4.1 语法

-- 左外连接,表1完全显⽰select 字段名 from 表名1 left join 表名2 on 连接条件;-- 右外连接,表2完全显⽰select 字段 from 表名1 right join 表名2 on 连接条件;

4.2 ⽰例

查询没有参加考试的同学信息
查询那个表那个就是基准表

左外连接,以左表为基准值,左表中的记录全部显示
右表中如果没有匹配的字段,则用null填充。
不能用等号判断null。

查询没有学⽣的班级:
要查询的信息在那个表,那个就是基准表,我们要插班级表中没有没有被使用的,就是class
基准表中所有信息都会被显示

然后过滤

五:⾃连接

5.1 应⽤场景

⾃连接是⾃⼰与⾃⼰取笛卡尔积,可以把⾏转化成列,在查询的时候可以使⽤where条件对结果进⾏过滤,或者说实现⾏与⾏之间的⽐较。在做表连接时为表起不同的别名。
参与连接的两张是同一个表。

5.2 ⽰例

显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息

1:先查出MySQL和JAVA的id:

再查询成绩表中,JAVA成绩⽐MySQL成绩好的信息

先过滤 然后判断

还有一种写法:

把4个表连接起来 起来,然后创建别名,对应关系一定要找对 :

然后可以直接输入名字:

直接判断大小:

5.3 表连接联系

显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

# 相关的表全部加⼊连接,并确定连接条件select stu.name as 姓名, c.name as 班级, s1.score as MySQL分数, s2.score as Java分数 from
score s1,score s2,course c1,course c2,student stu,class cwheres1.student_id = s2.student_idands1.course_id = c1.idands2.course_id = c2.idands1.score > s2.scoreandstu.id = s1.student_idandstu.class_id = c.idandc1.`name` = 'MySQL'andc2.`name` = 'Java';

首先还是确定表的关系 一定要把那个表和表的关系搞对。

六:⼦查询

⼦查询是把⼀个SELECT语句的结果当做别⼀个SELECT语句的条件,也叫嵌套查询。

6.1 语法

select * from table1 where col_name1 {= | IN} (select col_name1 from table2 where col_name2 {= | IN} [(select ...)
] ...
)

6.2 单⾏⼦查询

嵌套的查询中只返回⼀⾏数据
⽰例:查询与"不想毕业"同学的同班同学
查询学生的同班同学,student.class_id 相等
1:查出不想毕业的class_id
select  class_id  from  class where name = '不想毕业‘;
2:根据class_id查出学生表中学生信息
select * from student where class_id=(1);

6.3 多⾏⼦查询

嵌套的查询中返回多⾏数据,使⽤[NOT] IN关键字

⽰例:查询"MySQL"或"Java"课程的成绩信息

1:确定参与查询的表(课程、成绩)
2:先查询课程表中的课程信息(课程的id为1和3)

3:根据课程编号在分数表中查询对应的分数

4:把以上两个单独的查询合并为一条

 使⽤NOT IN 可以查询除了"MySQL"或"Java"课程的成绩

七: 合并查询

在实际应⽤中,为了合并多个select操作返回的结果,可以使⽤集合操作符 union,union all
把多个查询的结果集 合并在一起统一返回

7.1 创建新表并初始化数据

7.2 Union

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,会⾃动去掉结果集中的重复⾏。

⽰例:查询student表中 id < 3 的同学和student1表中的所有同学

重复的自动过滤

7.3 Union all

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,不会去掉结果集中的重复⾏

http://www.dtcms.com/a/488126.html

相关文章:

  • 在Springboot中处理log4j2日志文件
  • 威海+网站建设一人开公司做网站创业
  • Cookie、Session、JWT、SSO,网站与 APP 登录持久化与缓存
  • 营销网站制作皆选ls15227负责wordpress+边框插件
  • 视频网站开发需求分析外包网站开发公司
  • 个人网站制作基本步骤淄博网站备案公司
  • python单元测试 unittest.mock.patch (二)
  • 手机网站后台编辑器有哪些贵州建筑网站
  • 如果使用自己电脑做网站com是什么网站
  • 泛微 企业网站建设计划网站出现 503怎么了
  • 兰州移动端网站建设如何做好网站站内优化
  • PS基本教学(二)——认识PS软件各个基础模块以及PS基本设置
  • 大模型Agent智能体:开启人工智能新时代
  • 常备资料查询
  • 20251015给荣品的PRO-RK3566开发板在buildroot下打开ov5645【只配置编译了】
  • 淄博网站排名公司苏州网页关键词优化
  • 网站设置密码访问一建二建报考条件及专业要求
  • 青岛市住房城乡建设厅网站php网站建设个人总结
  • 濮阳网站关键词网站做下载wordpress
  • 上海站优云网络科技有限公司简单的网站怎么做
  • django网站开发实例pdfseo交流群
  • 重庆建网站搜索快忻科技html代码注释
  • 如何做公司o2o网站网站制作杭州
  • Python自定义容器完全指南:从基础实现到高级模式
  • 小程序做网站济南网站建设方案咨询
  • 介绍近期github上有名的开源项目
  • 相应式手机网站建设网站可不可以做自己的专利
  • 网站建设菜鸟教程模板建站合同
  • PyQt5 串口上位机开发笔记:如何给界面更换图标
  • 响应式购物网站模板不想让网站保存密码怎么做