MySQL快速入门篇---联合查询

一、什么是联合查询

1.1、概念

联合查询是SQL中用于合并多个SELECT语句结果集的操作。条件是被合并的结果集列数相同并且数据类型兼容。也可以说一次查询涉及两张或两张以上的表,就称为联合查询。

1.2、为什么要使用联合查询

如果数据被拆分到多个表中,我们需要查看一条数据的完整信息,这时就需要用到联合查询。

1.3、语法

SELECT * FORM 表名,表名......;

注意:多个表进行联合查询,取笛卡尔积

1.4、示例

创建一个班级表,一个学生表

# 创建班级表
drop table if exists class;
create table class(c_id bigint auto_increment primary key,c_name varchar(10)
);
# 创建学生表
drop table if exists students;
create table students(id bigint auto_increment primary key,name varchar(10),class_id bigint
);
# 插入数据
insert into class(c_id,c_name) values (1,'数学1班'),(2,'物理1班'),(3,'化学1班');
insert into students(id,name,class_id) values (1,'张三',1),(2,'李四',1),(3,'王五',2),(4,'赵六',3);
# 进行联合查询
select * from students,class;

其运行结果如下:
在这里插入图片描述
通过观察,我们发现两张表联合查询的结果集中,有些是无效数据。那么问题来了,如何过滤掉这些无效数据呢?

通过表与表之间的连接条件过滤掉无效数据

select * from students,class where students.class_id=class.c_id;

其运行结果如下:
在这里插入图片描述
注意:class_id和c_id的前面要加上各自对应的"表名.",这样数据库才能精确地知道到底该使用哪张表里的id列

通过指定列查询,精减查询结果

select students.id,students.name,students.class_id,class.c_name from students,class where students.class_id=class.c_id;

其运行结果如下:
在这里插入图片描述

通过给表起别名来简化查询语句

select s.id,s.name,s.class_id,c.c_name from students s,class c where s.class_id=c.c_id;

其运行结果如下:
在这里插入图片描述

二、内连接

2.1、概念

内连接是根据两个表中的共同字段,将符合条件的数据进行关联查询,具体来说,当两个表中的连接条件都满足时,才会返回相关联的数据。

2.2、语法

//写法一
select 字段 from 表1 别名,2 别名 where 连接条件 and  其它条件;
//写法2
select 字段 from 表1 别名 [inner] join 表2 别名 on 连接条件 where 其它条件;

简记:join两边是表名,on的后边是条件。

2.3、示例

查询学生id为4的同学的班级和姓名

select c.c_name,s.name from students s join class c on s.class_id=c.c_id where s.id=4;

其运行结果如下:
在这里插入图片描述

三、外连接

3.1、概念

外连接是关系数据库中的一种操作。它用于合并两个或多个表中的数据,和内连接不同的是,外连接会返回至少一个表中的所有行。

3.2、分类

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

左外连接

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

1、语法
select 字段名 from 表名1 left join 表名2 on 连接条件; 

left join 左边的表为基准表

2、示例

插入在班级表中没有编号的学生的信息

insert into students values(5,'钱七',4);

使用左外连接

select s.id,s.name,c.c_name from students s left join class c on s.class_id=c.c_id;

其结果运行如下:
在这里插入图片描述
由上图,我们可以看出学生表的数据完全显示,班级表没有的数据为Null。

右外连接

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

1、语法
select 字段 from 表名1 right join 表名2 on 连接条件;
2、示例

插入在学生表中没有编号的班级信息

insert into class values(5,'地理1班');

使用右外连接

select s.id,s.name,c.c_name from students s right join class c on s.class_id=c.c_id;

其运行结果如下:
在这里插入图片描述

全外连接

结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显示为NULL。
由于MySQL不支持,这里我就不多赘述。

四、自连接

4.1、概念

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

4.2、示例

创建成绩表

create table score(id bigint,数学 int,物理 int,化学 int
);
# 插入数据
insert into score values(1,70,80,90),(2,88,66,90),(3,75,82,86);
# 查询表结果
select * from score;

其结果运行如下:
在这里插入图片描述

使用自连接

select * from score sco1,score sco2;

其运行结果如下:
在这里插入图片描述

查询数学成绩大于物理成绩的信息

select sco1.id,sco1.`数学`,sco1.`物理` from score sco1,score sco2 where sco1.id=sco2.id and sco1.数学>sco2.物理;

其运行结果如下:
在这里插入图片描述

五、子查询

5.1、概念

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

5.2、语法

select * from 表1 where 列1 {= | IN} (select 列1 from 表2 where 列2 {= | IN} [(select ...)] ...
)

5.3、分类

1、单行子查询

嵌套的查询中只返回一行数据

语法
select * from 表名 where 列1 =(select 列1 from 表名 where 条件);
示例

查询数学成绩为70的同学的所有信息

select * from score where id =(select id from score where 数学=70); 

其运行结果如下:
在这里插入图片描述

2、多行子查询

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

语法
select * from 表名 where 列1 [not] in(select 列1 from 表名 where 条件);
示例

查询化学成绩为90的所有同学的信息

select * from score where id in(select id from score where 化学=90);

其运行结果如下:
在这里插入图片描述

查询物理成绩不为80的所有同学的信息

select * from score where id not in(select id from score where 物理=80);

其运行结果如下:
在这里插入图片描述

其与单行子查询的书写差别是把=改成in

3、多列子查询

单行子查询和多行子查询都只返回一列数据,多列子查询中可以返回多个列的数据,外层查询与嵌套的内层查询的列要匹配

示例

新增重复的分数

insert into score (id,数学,物理,化学) values(4,70,80,90),(5,88,66,90);

查询重复录入的分数

select * from score where (数学,物理,化学) in(select 数学,物理,化学 from score group by 数学,物理,化学 having count(0)>1);

其运行结果如下:
在这里插入图片描述

六、合并查询

合并多个select操作返回的结果,可以使⽤集合操作符union,union all

6.1、Union

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

示例

查询id为2和数学成绩为70的同学信息

select * from score where id=3 union select * from score where 数学=70;

在这里插入图片描述

查询id为1和数学成绩为70的同学信息

select * from score where id=1 union select * from score where 数学=70;

在这里插入图片描述
这里只有两条数据,是因为union有去重功能

6.2、Union all

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

示例

查询id为1和数学成绩为70的同学信息

select * from score where id=1 union all select * from score where 数学=70;

在这里插入图片描述
这里使用union all并没有去重

七、复制表结构

语法

create table 新表名 like 原表名;

示例

新构建一个班级表

create table new_class like class;

查看原表结构
在这里插入图片描述
查看新表结构
在这里插入图片描述

八、复制表信息

语法

insert into 新表名 select * from 原表名;

示例

insert into new_class select * from class;

在这里插入图片描述
通过查询我们可以发现,新表的数据与原表相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot AI 之 Chat Client API 使用大全

ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。 流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。 AI模型主要处理两类消息: …

基于点标注的弱监督目标检测方法研究

摘要 在计算机视觉领域,目标检测需要大量精准标注数据,但人工标注成本高昂。弱监督目标检测通过低成本标注训练模型,成为近年研究热点。本文提出一种基于点标注的弱监督目标检测算法,仅需在图像中物体中心点标注,即可高…

外网如何连接内网中的mysql数据库服务器?简单网络工具方案

当内网服务器部署好mysql数据库后,在局域网外需要用程序进行mysql 远程访问,而mysql因为安全的因素,默认的时候用户设置的是不能远程连接,只能本地连接,这个时候就需要自己去修改其中的设置。下面就介绍一下相关mysql的…

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容

Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】:目的是为了将有噪声的传感器收集起来,用于实时的建图。 Occupancy Grid Map: 概率栅格: 【注意】:由于传感器带有噪声,在实际中基于…

Rocky Linux 8.9 升级至 8.10 测试可通过以下步骤完成

一、执行升级‌ sudo dnf -y update --disablerepoappstream 二、重启系统‌ reboot ‌三、验证升级结果‌ ‌检查系统版本‌ 执行命令确认版本已更新 cat /etc/redhat-release 输出应包含 Rocky Linux release 8.10

固定翼无人机抛投技术分析!

一、技术要点 1. 结构设计优化 传动组件创新:采用齿轮-齿条传动(替代传统丝杆结构),简化机械设计,降低成本并提高可靠性。例如,通过电机驱动齿轮带动齿条移动,实现柱销与抛投物插孔的精准分…

Oracle中的[行转列]与[列转行]

目录 一、原始数据 二、行转列的多种实现方式 1.CASE WHEN 2.DECODE 3.PIVOT(Oracle独有) 4.使用LEAD开窗函数 三、列转行的多种实现方式 1.UNPIVOT(Oracle独有) 2.UNION ALL合并结果集 四、行转列练习:CASE WHEN/DECODE/PIVOT/lag/LEAD 1.CASE WHEN 2…

【Excel VBA 】窗体控件分类

一、Excel 窗体控件分类 Excel 中的窗体控件分为两大类型,适用于不同的开发需求: 类型所在选项卡特点表单控件开发工具 → 插入 → 表单控件简单易用,直接绑定宏,兼容性好,适合基础自动化操作。ActiveX 控件开发工具…

[ 计算机网络 ] 深入理解OSI七层模型

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…

线性代数之张量计算,支撑AI算法的数学原理

目录 一、张量计算的数学本质 1、线性代数:张量的几何与代数性质 2、微积分:梯度与自动微分 3、优化理论:张量分解与正则化 4、张量计算的核心操作 二、张量计算在AI算法中的作用 1、数据表示与处理 2、神经网络的参数表示 3、梯度计算与优化 三、张量计算在AI中的…

打造一个支持MySQL查询的MCP同步插件:Java实现

打造一个支持MySQL查询的MCP同步插件:Java实现 用Java实现一个MCP本地插件,直接通过JDBC操作本地MySQL,并通过STDIO与上层MCP客户端(例如Cursor)通信。插件注册一个名为mysql 的同步工具,接收连接参数及SQL…

【数据架构01】数据技术架构篇

✅ 9张高质量数据架构图:大数据平台功能架构、数据全生命周期管理图、AI技术融合架构等; 🚀无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、…

java三种常见设计模式,工厂、策略、责任链

设计模式实战解析 一、工厂模式(点外卖模式) 1. 核心思想 代替直接new对象像点外卖一样获取对象 2. 实际应用 Spring框架:BeanFactoryJDBC:DriverManager.getConnection() 3. 三种变体对比 类型特点示例场景简单工厂一个工…

jenkins使用Send build artifacts over SSH发布jar包目录配置

本测试用ruoyi-plus的代码。 1 [GitLab 自动触发 Jenkins 构建_jenkins构建触发器没有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

vscode打开vue + element项目

好嘞,我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤,让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装:https://code…

黑马程序员C++2024新版笔记 第4章 函数和结构体

目录 1.结构体的基本应用 2.结构体成员的默认值 3.结构体数组 4.结构体指针 ->操作符 5.结构体指针数组 1.引入已存在的结构体数组地址 2.通过new操作符申请指针数组空间 6.函数的概念 7.函数的基础语法 8.无返回值函数和void类型 9.空参函数 10.函数的嵌套调用…

高级前端工程师必备的 JS 设计模式入门教程,常用设计模式案例分享

目录 高级前端工程师必备的 JS 设计模式入门教程,常用设计模式案例分享 一、什么是设计模式?为什么前端也要学? 1、设计模式是什么 2、设计模式的产出 二、设计模式在 JS 里的分类 三、常用设计模式实战讲解 1、单例模式(S…

Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 前言 本文将详细介绍一种创新性的云开发架构:基于Ubuntu系统构建Android仿真容器环境,并集成安全隧道技…

Linux Kernel调试:强大的printk(一)

引言 想了好久,还是觉得这个标题才配得上printk!^_^ 我相信,不管做什么开发,使用最多的调试手段应该就是打印了,从我们学习编程语言第一课开始,写的第一段代码,就是打印"Hello, world&qu…

基于NLP技术的客户投诉与需求文本分类方法研究

目录 摘要 1. 引言 2. 文本分类基础 2.1 文本分类的定义与类型 2.2 文本分类的评价指标 3. 传统文本分类方法 3.1 基于TF-IDF和SVM的方法 3.2 基于主题模型和词向量的改进方法 4. 深度学习文本分类方法 4.1 TextCNN模型 4.2 BiLSTM模型 4.3 注意力机制与Transformer…