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

Mysql关联查询

Mysql关联查询

1、数据准备

# 班级表
create table class(id int primary key auto_increment,name varchar(20),description varchar(100)
);

在这里插入图片描述

# 学生表
create table student(id int primary key auto_increment,sn varchar(20),name varchar(20),email varchar(20),class_id int,monitor_id int,constraint student_class_id foreign key (class_id) references class(id)constraint student_monitor_id foreign key (monitor_id) references student(id)
);

在这里插入图片描述

# 课程表
create table course(id int primary key auto_increment,name varchar(20)
);

在这里插入图片描述

# 成绩表
create table score(student_id int,course_id int,score double,constraint score_student_id foreign key (student_id) references student(id),constraint score_course_id foreign key (course_id) references course(id)
);

在这里插入图片描述

2、笛卡尔积

会使用某一张表中的每一条记录都与另外一张表的所有记录进行组合,比如表A有x条记录,表B有y条记录,最终组合数为x*y,常常与where一起使用,此时也被称为等值连接

# 查询同学姓名="xumeng03"的同学的成绩(等值连接)
select s.sn as 学号, s.name as 同学姓名, score.score as 成绩
from student s,score
where s.id = score.student_idand s.name = "xumeng03"# 查询所有同学的个人信息和总成绩
select s.sn as 学号, s.name as 同学姓名, sum(score.score) as 成绩
from student s,score
where s.id = score.student_id
group by 学号;# 查询所有同学的个人信息和各科成绩
select s.sn as 学号, s.name as 同学姓名, c.name as 课程, score.score as 成绩
from student s,score,course c
where s.id = score.student_idand score.course_id = c.id
order by 学号 asc;# 查询所有同学的的班级
select s.sn as 学号, s.name as 同学姓名, c.name as 班级名称
from student s,class c
where s.class_id = c.id;

3、内连接

返回所有满足条件的记录

# 查询同学姓名="xumeng03"的同学的成绩(内连接)
select s.sn as 学号, s.name as 同学姓名, score.score as 成绩
from student sjoin score on s.id = score.student_id and s.name = "xumeng03"# 查询所有同学的个人信息和总成绩(内连接)
select s.sn as 学号, s.name as 同学姓名, sum(score.score) as 成绩
from student sjoin score on s.id = score.student_id
group by 学号;# 查询所有同学的个人信息和各科成绩(内连接)
select s.sn as 学号, s.name as 同学姓名, c.name as 课程, score.score as 成绩
from student sjoin score on s.id = score.student_idjoin course c on score.course_id = c.id
order by 学号 asc;# 查询所有同学的的班级(内连接)
select s.sn as 学号, s.name as 同学姓名, c.name as 班级名称
from student sjoin study.class c on c.id = s.class_id
where s.class_id = c.id;

4、外连接

驱动表(主表):除了显示满足条件的数据,还需要显示不满足条件的数据的表

从表(副表):只显示满足关联条件的数据的表

  • 当关联表中数据数据在两个表中都有体现,则内连接与左外连、右外连接接结果一致
  • 多次join on时,每次join on 语句都只计算两个表的笛卡尔积

4.1、左外连接

# 查询所有同学的的班级(左外连接)
select s.sn as 学号, s.name as 同学姓名, c.name as 班级名称
from student sleft join study.class c on c.id = s.class_id
where s.class_id = c.id;# 查询所有同学的个人信息和各科成绩(左外连接,必定展示student中所有内容)
select s.sn as 学号, s.name as 同学姓名, c.name as 课程, score.score as 成绩
from student sleft join score on s.id = score.student_idleft join course c on score.course_id = c.id
order by 学号 asc;

4.2、右外连接

# 查询所有同学的的班级(右外连接)
select s.sn as 学号, s.name as 同学姓名, c.name as 班级名称
from student sright join study.class c on c.id = s.class_id
where s.class_id = c.id;# 查询所有同学的个人信息和各科成绩(右外连接,必定展示course中所有内容)
select s.sn as 学号, s.name as 同学姓名, c.name as 课程, score.score as 成绩
from student sright join score on s.id = score.student_idright join course c on score.course_id = c.id
order by 学号 asc;

5、自连接

# 查询每个同学的班长
select s1.sn as 学号, s1.name as 学生姓名, s2.name 班长姓名
from student s1,student s2
where s1.monitor_id = s2.id

6、子查询

# 查询名称="xumeng03"的同班同学
select sn as 学号, name as 学生姓名
from student
where class_id in (select id from student where name = "xumeng03");

7、合并查询

or只能对一张表的查询结果进行合并,但union可以对多张表的查询结果进行合并(要求多个结果的列须对应)

使用union关键字对多个查询结果进行合并时会自动去重,但union all不会去重

# 查询名称="xumeng03"的同学和他的班长
select *
from student
where name = "xumeng03"
union
select *
from student
where id = (select monitor_id from student where name = "xumeng03")
http://www.lryc.cn/news/223265.html

相关文章:

  • MOSFET和IGBT栅极驱动器TLP250H(D4-TP1,F)电路的基本原理
  • Vue - Syntax Error: TypeError: this.getOptions is not a function 项目运行时报错,详细解决方案
  • C 语言类型转换
  • 数据结构-链表的简单操作实现
  • 竞赛选题 深度学习手势识别 - yolo python opencv cnn 机器视觉
  • 【算法练习Day42】买卖股票的最佳时机 III买卖股票的最佳时机 IV
  • 苹果手机如何备份通讯录?看完这篇就懂了!
  • [yarn]yarn异常
  • C++ NULL 与nullptr 区别
  • Google Chrome 浏览器 119.0.6045.106 版本提示 STATUS_INVALID_IMAGE_HASH 崩溃
  • 网络IO
  • 数据库管理-第115期 too many open files(202301107)
  • 一行命令让你的服务器命令行亮起来!!!!
  • 线性代数(二)| 行列式性质 求值 特殊行列式 加边法 归纳法等多种方法
  • OpenCV入门7:图像形态学变换
  • Apache Storm 2.5.0 集群安装与配置
  • Android-将编码的base64图像,添加水印,转换成File存储到手机
  • AI 绘画 | Stable Diffusion 图生图
  • Nat. Med. | 基于遗传学原发部位未知癌症的分类和治疗反应预测
  • RocketMQ如何安全的批量发送消息❓
  • 计算机视觉与深度学习 | 基于视觉惯性紧耦合的SLAM后端优化算法
  • GDI+ 绘制透明图
  • 【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据
  • Linux Hadoop平台伪分布式安装
  • 【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式
  • createElement的用法
  • Mabitys总结
  • JAVA安全之Log4j-Jndi注入原理以及利用方式
  • Spring源码系列-框架中的设计模式
  • 数据的读取和保存-MATLAB