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

MySQL【知识改变命运】10

联合查询

  • 0.前言
  • 1.联合查询在MySQL里面的原理
  • 2.练习一个完整的联合查询
    • 2.1.构造练习案例数据
    • 2.2 案例:⼀个完整的联合查询的过程
      • 2.2.1. 确定参与查询的表,学⽣表和班级表
      • 2.2.2. 确定连接条件,student表中的class_id与class表中id列的值相等
      • 2.2.3. 加⼊查询条件
      • 2.2.4. 精减查询结果字段
      • 2.2.5. 可以为表名指定别名
    • 2.3联合查询总结:
  • 3.内连接
    • 3.1 语法
    • 3.2 示例
      • 3.2.1. 查询"唐三藏"同学的成绩
      • 3.2.2.查询所有同学的总成绩,及同学的个⼈信息
      • 3.2.3.查询所有同学的总成绩,及同学的个⼈信息
  • 4. 外连接
    • 4.1.语法
    • 4.2.查询没有参加考试的同学信息
    • 4.3.查询没有学⽣的班级
  • 5. ⾃连接
    • 5.1.应⽤场景
    • 5.2.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息
    • 5.3 表连接练习
      • 5.3.1.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

0.前言

前言:为什么要联合查询?什么是联合查询呢?
1:在学过范式之后,我们会对一张表的数据,按照范式的标准拆分为多张表,这样便于降低数据的冗杂,但是我们如果查询表的数据,我们又如何一次性查询所有的数据呢?这时候就用到了联合查询
2:联合查询就是多个表的组合查询,一次查询涉及两张或则两张以上的表,成为联合查询

1.联合查询在MySQL里面的原理

  • 参与查询的所有表笛卡尔积,结果集在临时表中
  • 实例:创建两张表,一张student 表,一张class表
    在这里插入图片描述
    插入数据
    在这里插入图片描述
    表如下:

在这里插入图片描述

  • 参与查询的所有表取笛卡尔积,结果集在临时表中:
    在这里插入图片描述
    在这里插入图片描述

• 观察哪些记录是有效数据,根据两个表的关联关系过滤掉⽆效数据
在这里插入图片描述
如果联合查询表的个数越多,表中的数据量越⼤,临时表就会越⼤,所以根据实际情况确定联合查询表的个数

2.练习一个完整的联合查询

2.1.构造练习案例数据

# 课程表
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.2 案例:⼀个完整的联合查询的过程

• 查询学⽣姓名为宋江的详细信息,包括学⽣个⼈信息和班级信息

2.2.1. 确定参与查询的表,学⽣表和班级表

# 在from后同时写所有参与查询的表,并⽤逗号隔开(取笛卡尔积)
select *from student,class;

在这里插入图片描述
通过观察两张表联合后的结果集中,有些是无效的数据,如何过滤这些无用的数据呢?

2.2.2. 确定连接条件,student表中的class_id与class表中id列的值相等

连接条件,student表中的class_id与class表中id列的值相等
# 在where⼦句中加⼊连接条件
mysql> select * from student, class where student.class_id = class.id;

在这里插入图片描述

  • 这里有个新的知识点,class_id在student表,但是两张表都有id列,不指定表名时MySQL无法分清要使用那张表的id列。这时候用表名.列名就可以区分。

2.2.3. 加⼊查询条件

在这里插入图片描述

  • 上面查询产生了一个错误,因为我们无法知道这个name是指代的是那张表的name。
  • 正确的写法如下:
    在这里插入图片描述

2.2.4. 精减查询结果字段

selectstudent.id, student.name, student.sno, student.age, student.gender, student.enroll_date, class.name 
from student, class 
wherestudent.class_id = class.id 
andstudent.name = '宋江';

在这里插入图片描述

2.2.5. 可以为表名指定别名

在这里插入图片描述

2.3联合查询总结:

  1. 确定几张表参与查询
  2. 根据表与表之间的关系,确定过滤条件
  3. 通过WHERE条件对整个结果集进行过滤
  4. 精减字段,得到想要的结果
  5. 通过为表起列名,精减SQL语句

3.内连接

3.1 语法

1 select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;(简写)
2 select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 where 其他条件;(规范写法)

3.2 示例

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

  1. 确定几张表:两张学生表和成绩表(取两张表的笛卡尔积)
select * from student,score;

在这里插入图片描述

  1. 根据表与表之间的关系,确定过滤条件
select * from student,score where student.id=score.student_id ;

在这里插入图片描述

  1. 添加where条件
    在这里插入图片描述
  2. 精减查询字段
select student.name,score.score from student,score where student.id=score.student_id and student.name='唐三藏';

在这里插入图片描述

  1. 通过起别名,精减整个sql语句
select s.name,sc.score from student s,score sc where s.id=sc.student_id and s.name='唐三藏';

在这里插入图片描述
在这里插入图片描述

  1. 用规范的写法写:
select s.name, sc.score from student s join score sc on sc.student_id = 
s.id where s.name = '唐三藏';

在这里插入图片描述
总结一下:
在这里插入图片描述

3.2.2.查询所有同学的总成绩,及同学的个⼈信息

select s.name,sum(sc.score) from student s join score sc on s.id=sc.student_id group by s.id;

在这里插入图片描述

  • 这里注意一下这个分组
  • 在这里插入图片描述

分组之后,列的值在组内是相同的,即使该列不是分组列(没有在group by指定),依然可以写在查询列表中。

3.2.3.查询所有同学的总成绩,及同学的个⼈信息

1.select * from student s join score sc on s.id=sc.student_id join course c on c.id=sc.course_id;
2.select * from student s,score sc,course c where c.id=sc.course_id and s.id=sc.student_id;

在这里插入图片描述

  • 切记关联查询表不要超过三张,在以后真正工作的时候不要做大表的表关联查询。

4. 外连接

• 外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。
• 左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。
• 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。
• 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

4.1.语法

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

4.2.查询没有参加考试的同学信息

# 左连接以JOIN左边的表为基准,左表显⽰全部记录,右表中没有匹配的记录⽤NULL填充
select * from student s left join score sc on s.id=sc.student_id; 

在这里插入图片描述

  • 左表中显示所有记录,右边中没有与左表匹配的记录用NULL填充。
    添加where 条件
    在这里插入图片描述

4.3.查询没有学⽣的班级

# 右连接以JOIN右边的表为基准,右表显⽰全部记录,左表中没有匹配的记录⽤NULL填充
select * from student s right join class c on c.id=s.class_id; 

在这里插入图片描述
添加where条件过滤
在这里插入图片描述

5. ⾃连接

5.1.应⽤场景

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

# 不为表指定别名
mysql> select * from score, score;
ERROR 1066 (42000): Not unique table/alias: 'score'
# 指定别名
mysql> select * from score s1, score s2;

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

  • 首先分为两步进行,先要找到课程的id,java是1,MySQL是3

在这里插入图片描述

  • 确定连接条件
    两个表中的student_id 必须相等

在这里插入图片描述

  • 确定符合题目的要求
    要么sc1表中的course_id =1 且 sc2表中的course_id = 3
    要么sc1表中的course_id =3 且 sc2表中的course_id = 1
select  * from score sc1,score sc2 where sc1.student_id=sc2.student_id and sc1.course_id=1 and  sc2.course_id=3 ;

在这里插入图片描述

  • 加入结果集的过滤条件,分数比较
select  * from score sc1,score sc2 where sc1.student_id=sc2.student_id and sc1.course_id=1 and  sc2.course_id=3 and  sc1.score<sc2.score;

在这里插入图片描述
精减查询结果,用别名表示表头
在这里插入图片描述

5.3 表连接练习

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

在这里插入图片描述

相关文章:

MySQL【知识改变命运】10

联合查询 0.前言1.联合查询在MySQL里面的原理2.练习一个完整的联合查询2.1.构造练习案例数据2.2 案例&#xff1a;⼀个完整的联合查询的过程2.2.1. 确定参与查询的表&#xff0c;学⽣表和班级表2.2.2. 确定连接条件&#xff0c;student表中的class_id与class表中id列的值相等2.…...

Java学习教程,从入门到精通, Java 基础语法(4)

1、Java 基础语法 一、Java 简介与开发环境搭建 Java 简介&#xff1a;Java 是一种面向对象的编程语言&#xff0c;具有跨平台、安全、稳定等特点。Java 主要应用于企业级应用、Android 应用开发、大数据处理等领域。开发环境搭建&#xff1a;搭建 Java 开发环境需要安装 JDK…...

反编译工具-Jclasslib的使用,与Java方法调用的探索

这里写目录标题 前言IDEA下查看字节码的两种方法使用idea自带的插件工具安装插件 为什么没有看出方法调用关系原因分析工厂举例 知识补充语言java可移植性 总结 前言 画时序图的时候&#xff0c;我想验证下方法的调用是否写的正确。方法调用不仅涉及到程序的基本逻辑流程&#…...

力扣 简单 876.快慢指针

文章目录 题目介绍题解 题目介绍 题解 class Solution {public ListNode middleNode(ListNode head) {ListNode slow head, fast head;while(fast ! null && fast.next ! null){slow slow.next;fast fast.next.next;}return slow;} }...

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …...

从0开始深度学习(12)——多层感知机的逐步实现

依然以Fashion-MNIST图像分类数据集为例&#xff0c;手动实现多层感知机和激活函数的编写&#xff0c;大部分代码均在从0开始深度学习&#xff08;9&#xff09;——softmax回归的逐步实现中实现过 1 读取数据 import torch from torchvision import transforms import torchv…...

如何利用OpenCV和yolo实现人脸检测

在之前的blog里面&#xff0c;我们有介绍OpenCV和yolo的区别&#xff0c;本文就人脸检测为例&#xff0c;分别介绍下OpenCV和yolo的实现方式。 OpenCV实现人脸检测 一、安装 OpenCV 首先确保你已经安装了 OpenCV 库。可以通过以下方式安装&#xff1a; 使用包管理工具安装&…...

015集——c# 实现CAD excel交互(CAD—C#二次开发入门)

第一步&#xff1a;添加引用 程序集—>扩展 namespace WindowsFormsApp2 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private void 获取当前excel_Click(object sender, EventArgs e…...

【计网笔记】以太网

经典以太网 总线拓扑 物理层 Manchester编码 数据链路层 MAC子层 MAC帧 DIX格式与IEEE802.3格式 IEEE802.3格式兼容DIX格式 前导码&#xff08;帧开始定界符SOF&#xff09; 8字节 前7字节均为0xAA第8字节为0xAB前7字节的Manchester编码将产生稳定方波&#xff0c;用于…...

Java 入门基础篇14 - java面向对象思想以及特性

学习目标&#xff1a; 一、目标 面向对象思想类和对象对象的创建和使用属性和方法封装 开始学习&#xff1a; 二、编程思想 2.1 什么是编程思想 做人有做人的原则&#xff0c;编程也有编程的原则。这些编程的原则&#xff0c;就叫做编程思想。 2.2 面向过程和面向对象 二…...

第15篇:网络架构优化与综合案例分析

目录 引言 15.1 网络性能优化的方法与工具 15.1.1 带宽管理与流量控制 15.1.2 负载均衡 15.1.3 缓存优化 15.2 网络故障的排查与解决 15.2.1 常用的网络故障排查工具 15.2.2 网络故障排查案例 15.3 网络安全架构的综合设计案例 15.3.1 企业网络安全架构的要求 15.3.…...

UI自动化测试实战

补充&#xff1a;Selenium主要用于Web页面的自动化测试&#xff0c;它可以模拟用户的各种操作&#xff0c;如点击、输入、滚动等&#xff0c;来测试网页的功能。而Appium是一个开源的移动端自动化测试工具。 一、自动化测试实战章节 自动化测试流程测试用例编写项目自动化测试…...

东方智者颜廷利:以哲学思想促进世界和谐与无私奉献

【本社讯】在全球化的今天,东方智慧与哲学思想正逐渐成为促进世界和谐与理解的重要力量。近日,祖籍齐鲁大地山东济南的东方智者颜廷利以其深邃的哲学思想和对人类社会的深刻洞察,引起了国际社会的广泛关注。 颜廷利,一位致力于哲学研究与实践的智者,他的思想跨越古今,融合了东…...

基于 springboot vue停车场管理系统 设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

如何验证ssl私钥和证书是否匹配?

从证书&#xff08;CRT&#xff09;文件提取公钥 openssl x509 -in server.crt -pubkey -noout | openssl sha256从证书签名请求&#xff08;CSR&#xff09;文件提取公钥 openssl req -in server.csr -pubkey -noout | openssl sha256从私钥&#xff08;KEY&#xff09;文件…...

MongoDB的基本操作

&#x1f337;数据库准备 &#x1f388;Mongoshell 1.在指定目录下创建mongodb文件夹、其子文件log和data以及mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log 执行mongodb命令启动mongdb服务 mongod --dbpath /h…...

spring mvc后端实现过程

文章目录 一、Spring mvc1、controller1.1、LoginController011.2、LoginController 2、service2.1、LoginService2.1、LoginInimplements 3、dao3.1、LoginMapper3.1、LoginMapper.xml 4、实体类 一、Spring mvc 1、controller 控制器层、处理用户的请求和响应&#xff0c; …...

102005

import os os.environ["CUDA_VISIBLE_DEVICES"] "0" # 设定使用的 GPUimport tensorflow as tf from dataset import generate_data import numpy as np from model import enhancednet# 检查 TensorFlow 是否可以识别 GPU gpus tf.config.list_physica…...

Cisco ACI环境给Leaf配置OOB带外管理IP方法

可以通过GUI 或CLI进行配置 通过CLI更简单&#xff0c;和配置传统交换机差不多&#xff0c; ACI中共有3大组件 APIC 控制器 SPINE 核心 LEAF 接入 下面我们将3种角色的带外IP配置方法都列出来 1 APIC配置带外IP This example shows how to configure out-of-band managemen…...

免费送源码:Java+B/S+MySQL springboot电影推荐系统 计算机毕业设计原创定制

摘 要 随着互联网与移动互联网迅速普及&#xff0c;网络上的电影娱乐信息数量相当庞大&#xff0c;人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成为一个热门。然而电影信息的表示相当复杂&#xff0c;己有的相似度计算方法与推荐算法都各有优势&#…...

深入剖析watchdog机制:从soft lockup到Hard LOCKUP的检测与应对

1. 什么是watchdog机制&#xff1f; 想象一下你养了一只忠诚的狗狗&#xff0c;它的任务就是定时检查你是否还活着。如果你长时间不动&#xff0c;它就会叫醒你或者采取其他措施。Linux内核中的watchdog机制就是这样一个"看门狗"&#xff0c;它的职责是监控系统是否正…...

Redis RDB Tools错误排查终极指南:10个常见问题与解决方案清单

Redis RDB Tools错误排查终极指南&#xff1a;10个常见问题与解决方案清单 【免费下载链接】redis-rdb-tools Parse Redis dump.rdb files, Analyze Memory, and Export Data to JSON 项目地址: https://gitcode.com/gh_mirrors/re/redis-rdb-tools Redis RDB Tools是解…...

从Hello-World到自定义镜像:在Ubuntu 20.04上玩转Docker镜像的完整工作流

从Hello-World到自定义镜像&#xff1a;在Ubuntu 20.04上玩转Docker镜像的完整工作流 当开发者第一次接触Docker时&#xff0c;往往会被其"一次构建&#xff0c;到处运行"的理念所吸引。但真正深入使用后才会发现&#xff0c;Docker的魅力远不止于此——它更像是一个…...

8 个值得收藏的综合类在线工具网站

8 个值得收藏的综合类在线工具网站1. tool.lu&#xff1a;老牌开发者工具箱&#xff0c;胜在稳定tool.lu 是很多开发者都用过的老站。它的优势不在“花哨”&#xff0c;而在于工具体系比较成熟&#xff0c;像代码格式化、压缩、加密解密、时间处理、图片与图标处理这类高频需求…...

从PTA题目到项目实战:用Python和C语言两种思路重构‘插入排序’

从PTA题目到项目实战&#xff1a;用Python和C语言两种思路重构‘插入排序’ 算法学习常常陷入"纸上谈兵"的困境——我们能在OJ平台上AC题目&#xff0c;却难以将算法思想迁移到真实项目中。以插入排序为例&#xff0c;这道PTA基础题背后隐藏着数据处理、性能优化和语…...

李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本:从数学公式到可执行代码

李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本&#xff1a;从数学公式到可执行代码 最近在帮一个做信号处理的朋友调试代码&#xff0c;他给我看了一页论文里的公式&#xff0c;问我怎么在Matlab里实现。我盯着那一堆希腊字母和矩阵运算&#xff0c;突然想到&#xff0c;要是能…...

【深度学习新浪潮】OpenClaw架构与技术关键点全解析:为什么它能成功,而前代框架纷纷折戟?

引言 在AI Agent从概念走向落地的过程中&#xff0c;AutoGPT、LangChain早期版本、BabyAGI等框架一度掀起热潮&#xff0c;但始终难以实现规模化、稳定化的实际生产落地。OpenClaw作为MIT主导开源的本地优先AI执行网关&#xff0c;上线后迅速成为现象级开源项目&#xff0c;其核…...

手把手教你用GPT-4搭建电商智能客服(附避坑指南)

电商智能客服实战&#xff1a;从GPT-4选型到高并发优化的全链路指南 当一位顾客深夜询问"刚买的羽绒服钻绒怎么办"时&#xff0c;传统客服机器人可能只会回复"请联系售后邮箱"。而搭载GPT-4的智能客服不仅能识别商品问题&#xff0c;还能同步提供退换货指引…...

实战演练:基于快马平台快速构建kafka电商用户行为分析系统

实战演练&#xff1a;基于快马平台快速构建Kafka电商用户行为分析系统 最近在做一个电商数据分析项目&#xff0c;需要实时追踪用户的点击和浏览行为。经过调研发现&#xff0c;Kafka作为分布式消息队列非常适合这种高吞吐量的场景。下面分享我是如何用InsCode(快马)平台快速搭…...

局域网聊天室终极解决方案:无需互联网的即时通讯工具

局域网聊天室终极解决方案&#xff1a;无需互联网的即时通讯工具 【免费下载链接】LAN-Chat-Room &#x1f609;基于QT开发的局域网聊天室 项目地址: https://gitcode.com/gh_mirrors/la/LAN-Chat-Room 在办公室、学校或家庭网络中&#xff0c;你是否曾遇到过需要快速分…...