Mysql数据库 9.SQL语言 查询语句 连接查询、子查询
连接查询
通过查询多张表,用连接查询进行多表联合查询
关键字:inner join 内连接
left join 左连接
right join 右连接
数据准备
创建新的数据库:create database 数据库名;
create database db_test2;
使用数据库:use 数据库名;
use db_test2;
创建班级信息表:
create table 表名(字段名1,字段名2,......);
代码实现
create table classes(class_id int primary key auto_increment,#主键自增class_name varchar(40) not null unique,class_remark varchar(200)
);
创建学生表:
create table 表名(字段名1,字段名2,......);
代码实现
create table students(stu_num char(8) primary key ,stu_name varchar(20) not null,stu_gender char(2) not null,stu_age int not null,cid int,constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)on update cascade ON DELETE CASCADE
);
添加班级信息
insert into 表名 (字段名)values(添加的数据);
代码实现
insert into classes (class_name,class_remark)values('Java2204','......');insert into classes (class_name,class_remark)values('Java2205','......');insert into classes (class_name,class_remark)values('Java2206','......');insert into classes (class_name,class_remark)values('Python','......');
运行结果
添加学生信息
以下三个信息,属于class_id=1 的班级 (Java2204)
代码实现
insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220101','张三','男',20,1);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220102','李四','女',20,1);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220103','王五','男',20,1);
以下两个学生信息,属于class_id=2 的班级 (Java2205)
代码实现
insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220104','赵婷','女',20,1);insert into students (stu_num,stu_name,stu_gender,stu_age,cid)
values('20220105','孙七','男',20,2);
小红和小明没有设置班级信息
代码实现
insert into students (stu_num,stu_name,stu_gender,stu_age)
values('20220106','小红','女',20);insert into students (stu_num,stu_name,stu_gender,stu_age)
values('20220107','小明','男',20);
运行结果
select * from 表名;查询表
代码实现
select * from students s ;
select * from classes c ;
运行结果
内连接
语法
select ...... from 表名1 inner join 表名2 on 匹配条件 [where 条件];
经过内连接(表连接)之后,将两张表的数据以笛卡尔积的效果进行连接
代码实现
select * from 表名1 inner join 表名2;
select * from students inner join classes;
运行结果
产生笛卡尔积,效果如下,将表1中的每个数据与第二个表中的每个数据都进行匹配
7 * 3 = 28,共有28个数据
消除笛卡尔积,在前缀后加上 on 匹配条件 [where 条件];
select ...... from 表名1 inner join 表名2 on 匹配条件 [where 条件];
内连接条件
两张表使用inner join连接查询之后生产的笛卡尔积数据中很多数据都是无意义的,我们如何消除无意义的数据呢?——添加两张进行连接查询时的匹配条件
使用 on 设置两张表连接查询时的匹配条件
两张表连接查询+条件
代码实现
使用where进行两个表之间的连接
select * from students inner join classes where students.cid=classes.class_id ;
运行结果
代码实现
使用on进行两个表之间的连接
select * from students inner join classes on students.cid=classes.class_id ;
运行结果
on连接查询和where连接查询的区别
where筛选:先生成笛卡尔积后进行判断连接条件是否成立
on筛选:先进行判断连接条件是否成立,如果成立后,再会进行组合,就不会有笛卡尔积的结果
左连接 LEFT JOIN
左连接定义
左连接显示左表中的所有数据,如果在右表中存在与左表记录满足匹配条件的数据,则进行匹配,如果右表中不存在匹配数据,则显示为NULL;
语法
select * from 左表名 left join 右表名 on 匹配条件 [where 条件];
作用
左连接:显示左表中的所有记录
例
需求
请查询出所有学生信息,如果有学生有对应的班级信息,则将对应的班级信息也查询出来
代码实现
select * from students left join classes on students.cid=classes.class_id ;
运行结果
右连接 RIGHT JOIN
右连接定义
右连接显示右表中的所有数据,如果在左表中存在与右表记录满足匹配条件的数据,则进行匹配,如果左表中不存在匹配数据,则显示为NULL;
语法
select * from 表名1 RIGHT JOIN 表名2 ON 表名1与表名2的关联字符;
作用
右连接:显示右表中的所有记录
例
需求
将右表中的所有数据显示出来
代码实现
select * from students right join classes on students.cid=classes.class_id ;
运行结果
左连接、右连接与内连接的区别
内连接:只会显示出两表中有关联的数据
左连接:显示出左表中的所有数据,右表中只写有关联的数据
右连接:显示出右表中的所有数据,左表中只写有关联的数据
数据表别名
语法
alter table 表名 rename column 列名 to 新列名;
案例
代码实现
修改列名
alter table students rename column stu_name to name;
alter table classes rename column class_name to name;
运行结果
当两个表的字段名称相同时,如何进行查询字段
代码实现
select students.name,classes.name from students inner join classes on students.cid = classes.class_id ;
运行结果
使用别名查询字段
代码实现
select s.name,c.name from students s inner join classes c on s.cid=c.class_id ;
运行结果
子查询/嵌套查询
定义
子查询——先进行一次查询,第一次查询的结果作为第二次查询的源/条件(第二次查询是基于第一次的查询结果来进行的)
子查询返回单个值——单行单列
案例
查询班级表中字段名为Java2204的数据, 查询所有Java2204班级中选课副码为1的学生信息
代码实现
查询班级表中字段名为Java2204的数据
select class_id from classes c where name ='Java2204';
查询所有Java2204班级中选课副码为1的学生信息
select * from students s where cid=1;
运行结果
查询所有Java班级中的学生信息 单列多行查询
代码实现
select class_id from classes c where name like 'Java%' ;
运行结果
显示三条查询语句 union连接关键字
代码实现
#显示三条查询语句 union连接关键字
select * from students s where cid=1
union
select * from students s where cid=2
union
select * from students s where cid=3;
运行结果
子查询,in关键字 单列多行查询
如果查询结果是单列多行,要有关键字in
in代表的是包含,not in代表不包含
代码实现
select * from students s where cid in(select class_id from classes c where name like 'Java%');
运行结果
查询cid=1的班级中性别为男的学生信息
语法
select * from (select * from 表名 where 限制) 别名 where 别名.列名 = 限制;
将第一步查询语句当作一个虚拟表(限制信息)查询第二个表
代码实现
select * from (select * from students where cid = 1) t where t.stu_gender='男';
运行结果
相关文章:

Mysql数据库 9.SQL语言 查询语句 连接查询、子查询
连接查询 通过查询多张表,用连接查询进行多表联合查询 关键字:inner join 内连接 left join 左连接 right join 右连接 数据准备 创建新的数据库:create database 数据库名; create database db_test2; 使用数据库:use 数据…...

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否是完全二叉树的算法
完全二叉树:就是每层横着划过去是连起来的,中间不会断开 比如下面的左图就是完全二叉树 再比如下面的右图就是非完全二叉树 那我们可以采用层序遍历的方法,借助一个辅助队列 当辅助队列不空的时候,出队头元素,入队头…...

Android自定义控件
目录 Android自定义控件一、对现有控件进行扩展二、创建复合控件1 定义属性2 组合控件3 引用UI模板 三、重写View来实现全新控件1 弧线展示图1.1 具体步骤: 2 音频条形图2.1 具体步骤 四、补充:自定义ViewGroup Android自定义控件 ref: Android自定义控件…...
Java 中的 Cloneable 接口和深拷贝
引言: 在 Java 中,深拷贝是一种常见的需求,它可以创建一个对象的完全独立副本。Cloneable 接口提供了一种标记机制,用于指示一个类实例可以被复制。本文将详细介绍 Java 中的 Cloneable 接口和深拷贝的相关知识࿰…...

项目实战:通过axios加载水果库存系统的首页数据
1、创建静态页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"script/axios.mi…...

RK3568平台 内存的基本概念
一.Linux的Page Cache page cache,又称pcache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访…...

mysql联合索引和最左匹配问题。
1引言: 如果频繁地使⽤相同的⼏个字段查询,就可以考虑建⽴这⼏个字段的联合索引来提⾼查询效率。⽐如对 于联合索引 test_col1_col2_col3,实际建⽴了 (col1)、(col1, col2)、(col, col2, col3) 三个索引。联合 索引的主要优势是减少结果集数量…...

全球发布|首个AI视角下的生态系统架构解读—《生态系统架构--人工智能时代从业者的新思维》重磅亮相!
点击可免费注册下载 👇 人工智能时代的企业架构师必读系列 《生态系统架构--人工智能时代从业者的新思维》 Philip Tetlow、Neal Fishman、Paul Homan、Rahul著 The Open Group Press 2023年11月出版 这本书可以很好地帮助全球架构师使用人工智能来构建、开发和…...
解决torch.hub.load加载网络模型异常
1 torch.hub.load 加载网络模型错误 通过网络使用torch.hub.load加载模型代码如下: self.model torch.hub.load("facebookresearch/dinov2", dinov2_vits14, sourcegithub).to(self.device) 运行网上的项目,经常会卡住或者超时,…...

如何获取HuggingFace的Access Token;如何获取HuggingFace的API Key
Access Token通过编程方式向 HuggingFace 验证您的身份,允许应用程序执行由授予的权限范围(读取、写入或管理)指定的特定操作。您可以通过以下步骤获取: 1.首先,你需要注册一个 Hugging Face 账号。如果你已经有了账号…...
How to resolve jre-openjdk and jre-openjdk-headless conflicts?
2023-11-05 Archlinux 执行 pacman -Syu 显示 failed to prepare transaction;jre-openjdk and jre-openjdk-headless conflicts 解决 archlinux sudo pacman -Sy jdk-openjdk...

setTimeout和setImmediate以及process.nextTick的区别?
目录 前言 setTimeout 特性和用法 setImmediate 特性和用法 process.nextTick 特性和用法 区别和示例 总结 在Node.js中,setTimeout、setImmediate和process.nextTick是用于调度异步操作的三种不同机制。它们之间的区别在于事件循环中的执行顺序和优先级。…...
read 方法为什么返回 int 类型
在Java的输入流(InputStream)中,read方法返回int类型的值的原因是为了提供更多的信息和灵活性。虽然这可能看起来有些不直观,但有一些合理的考虑和用途,主要包括以下几点: EOF标志:read方法返回…...

在二维矩阵/数组中查找元素 Leetcode74, Leetcode240
这一类题型中二维数组的元素取值有序变化,因此可以用二分查找法。我们一起来看一下。 一、Leetcode 74 Leetcode 74. 搜索二维矩阵 这道题要在一个二维矩阵中查找元素。该二维矩阵有如下特点: 每行元素 从左到右 按非递减顺序排列。每行的第一个元素 …...

MS35657步进电机驱动器可兼容DRV8824
MS35657 是一款双通道 DMOS 全桥驱动器,可以驱动一个步进电机或者两个直流电机。可兼容DRV8824(功能基本一致,管脚不兼容)。每个全桥的驱动电流在 24V 电源下可以工作到 1.4A。MS35657 集成了固定关断时间的 PWM 电流校正器&#…...
SQL语句性能优化
1、查询 SQL 尽量不要使用 select *,而是 select 具体字段 反例子: select * from sys_user; 正例子: select id,name from sys_user; 理由如下: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。…...

线性代数之 伪逆矩阵
目录 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD ◼ 用Python代码计算A的伪逆矩阵 ◼ 笔算A的伪逆矩阵 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD 逆矩阵并不总是存在,即使是方阵。然而,对于非正方形矩阵,存在一个伪逆矩阵,也叫摩尔-彭罗斯…...

【3D图像分割】基于Pytorch的VNet 3D 图像分割5(改写数据流篇)
在这篇文章:【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇) 的最后,我们提到了: 在采用vent模型进行3d数据的分割训练任务中,输入大小是16*96*96,这个的裁剪是放到Dataset类…...

【漏洞复现】Apache_Shiro_1.2.4_反序列化漏洞(CVE-2016-4437)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞分析3、漏洞验证 说明内容漏洞编号CVE-2016-4437漏洞名称Apache_Shiro_1.2.4_反序列化漏洞漏洞评级…...

Mac连接linux的办法(自带终端和iterm2)
1. 使用Mac自带终端Terminal 1.1 点击右上角的聚焦搜索,再输入终端 1.2 查找linux系统的ip地址 在虚拟机里输入如下命令,找到蓝色区域的就是ip地址 ip addr 如果没有显示ip地址,可以重新安装一下虚拟机,之后确保以太网的连接是打…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...