连接查询(学习笔记)

通过对DQL的学习,我们可以很轻松的从一张数据表中查询出需要的数据;在企业的应用开发中,我们经常需要从多张表中查询数据(例如:我们查询学生信息的时候需要同时查询学生的班级信息),可以通过连接查询从多张数据表提取数据:

在MySQL中可以使用join实现多表的联合查询——连接查询,join按照其功能不同分为三个操作:

● inner join 内连接

● left join 左连接

● right join 右连接

数据准备

创建新的数据库db_test2

create database db_test2;
use db_test2;

创建班级信息表和学生信息表

create table classes(
    class_id int primary key auto_increment,
    class_name varchar(40) not null unique,
    class_remark varchar(200)
);
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
);

添加数据

添加班级信息

# Java2204 包含三个学生信息
insert into classes(class_name,class_remark) values('Java2204','...');

# Java2205 包含两个学生信息
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('Python2205','...');

添加学生信息

# 以下三个学生信息 属于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,2);
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);

内连接 INNER JOIN

语法

select ... from tableName1 inner join tableName2 ON 匹配条件 [where 条件];

笛卡尔积

● 笛卡尔积(A集合&B集合):使用A中的每个记录依次关联B中每个记录,笛卡尔积的总数=A总数*B总数

● 如果直接执行select ... from tableName1 inner join tableName2;会获取两种数据表中的数据集合的笛卡尔积(依次使用tableName1表中的每一条记录去匹配tableName2的每条数据)

内连接条件

两张表使用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;

● 结果:只获取两张表中匹配条件成立的数据,任何一张表在另一种表如果没有找到对应匹配则不会出现在查询结果中(例如:小红和小明没有对应的班级信息,Java2206和Python2206没有对应的学生)。

左连接 LEFT JOIN

需求:请查询出所有的学生信息,如果学生有对应的班级信息,则将对应的班级信息也查询出来

左连接:显示左表中的所有数据,如果在有右表中存在与左表记录满足匹配条件的数据,则进行匹配;如果右表中不存在匹配数据,则显示为Null

# 语法
select * from leftTable LEFT JOIN rightTable ON 匹配条件 [where条件];

-- 左连接:显示左表中的所有记录
select * from students LEFT JOIN classes ON students.cid = classes.class_id;

右连接 RIGHT JOIN

-- 右连接:显示右表中的所有记录
select * from students RIGHT JOIN classes ON students.cid = classes.class_id;

数据表别名

首先我们可以先将两张表stu_name和class_name字段名称都改为name

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;

如果表名太长则不便于SQL语句的编写,我们可以使用数据表别名

使用示例:

select s.name,c.name
from students s
INNER JOIN classes c
ON s.cid = c.class_id;

子查询/嵌套查询

子查询—先进行一次查询,第一次查询的结果作为第二次查询的源/条件(第二次查询是基于第一次的查询结果来进行的)

子查询返回单个值-单行单列

案例1:查询班级名称为'Java2204'班级中的学生信息(只知道班级名称,而不知道班级ID)

● 传统的方式:

-- a.查询Java2204班的班级编号
select class_id from classes where class_name = 'Java2204';

-- b.查询此班级编号下的学生信息
select * from students where cid = 1;

● 子查询:

-- 如果子查询返回的结果是一个值(单列单行),条件可以直接使用关系运算符(= != ....)
select * from students where cid = (select class_id from classes where class_name='Java2205');

子查询返回多个值-多行单列

案例2:查询所有Java班级中的学生信息

● 传统的方式:

-- a.查询所有Java班的班级编号
select class_id from classes where class_name LIKE 'Java%';
+--------------+
|  class_id    |
+--------------+
|        1     |
|        2     |
|        3     |
+--------------+

-- b.查询这些班级编号中的学生信息(union将多个查询语句的结果整合在一起)
select * from students where cid = 1
UNION
select * from students where cid = 2
UNION
select * from students where cid = 3;

● 子查询

-- 如果子查询返回的结果是多个值(单行多列),条件使用IN / NOT IN
select * from students where cid IN (select class_id from classes where
class_name LIKE 'Java%');

子查询返回多个值-多行多列

案例3:查询cid=1的班级中性别为男的学生信息

-- 多条件查询:
select * from students where cid = 1 and stu_gender = '男';
-- 子查询:先查询cid=1班级中的所有学生信息,将这些信息作为一个整体虚拟表(多行多列)
-- 在基于这个虚拟表查询性别为男的学生信息(‘虚拟表’需要别名)
select * from (select * from students where cid = 1) t where t.stu_gender='男';

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伦茨lenze触摸屏维修p500系列P50GAP60300M5H0XXX-02S14315000

Lenze伦茨显示屏维修系列有:EL5800;EL2800;EL9800;EL2500;EL600;P300;P500. 伦茨触摸屏不能触摸维修:触摸屏幕时鼠标箭头无动作,没有发生位置改变。 原因:造…

多维时序 | Matlab实现LSTM-Mutilhead-Attention长短期记忆神经网络融合多头注意力机制多变量时间序列预测模型

多维时序 | Matlab实现LSTM-Mutilhead-Attention长短期记忆神经网络融合多头注意力机制多变量时间序列预测模型 目录 多维时序 | Matlab实现LSTM-Mutilhead-Attention长短期记忆神经网络融合多头注意力机制多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基…

ONLYOFFICE 桌面应用程序 v8.0 发布:全新 RTL 界面、本地主题、Moodle 集成等你期待的功能来了!

目录 📘 前言 📟 一、什么是 ONLYOFFICE 桌面编辑器? 📟 二、ONLYOFFICE 8.0版本新增了那些特别的实用模块? 2.1. 可填写的 PDF 表单 2.2. 双向文本 2.3. 电子表格中的新增功能 单变量求解:…

VantUI组件的安装和使用

Vant UI 是一款轻量、可靠的移动端 Vue 组件库,适用于构建高性能的移动端页面。它提供了丰富的组件,如按钮、输入框、弹窗、轮播等,并且具有灵活的配置和扩展性。Vant UI 的设计风格简洁,易于上手,能够满足大部分移动端…

【C++私房菜】面向对象中的简单继承

文章目录 一、 继承基本概念二、派生类对象及派生类向基类的类型转换三、继承中的公有、私有和受保护的访问控制规则四、派生类的作用域五、继承中的静态成员 一、 继承基本概念 通过继承(inheritance)联系在一起的类构成一种层次关系。通常在层次关系的…

MaxScale实现mysql8读写分离

MaxScale 实验环境 中间件192.168.150.24MaxScale 22.08.4主服务器192.168.150.21mysql 8.0.30从服务器192.168.150.22mysql 8.0.30从服务器192.168.150.23mysql 8.0.30 读写分离基于主从同步 1.先实现数据库主从同步 基于gtid的主从同步配置 主库配置 # tail -3 /etc/my.…

杰发科技AC7801——SRAM 错误检测纠正

0.概述 7801暂时无错误注入,无法直接进中断看错误情况,具体效果后续看7840的带错误注入的测试情况。 1.简介 2.特性 3.功能 4.调试 可以看到在库文件里面有ecc_sram的库。 在官方GPIO代码里面写了点测试代码 成功打开2bit中断 因为没有错误注入&#x…

九州金榜|家庭教育小技巧,孩子好习惯养成记

家庭教育对于孩子的发展至关重要,家长一定要重视孩子在家里的举动,要及时纠正孩子的不足,发展孩子的优良品德和教孩子养成勤俭朴素的的好习惯。九州金榜家庭教育将从以下方面说一下家庭教育中的方法技巧。 一、家长以身作则 家长教育孩子&a…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型,画风色彩鲜明,擅长绘制漂亮的小姐姐。 条目内容类型大模型…

XG5032HAN (SAW)振荡器)(piezoman压电侠)

XG5032HAN晶体振荡器通过其卓越的低抖动特性,为需要高频率精度和稳定性的电子设备提供了理想的解决方案。无论是在高性能的数据通信、精密测量XG5032HAN都能提供高质量、可靠的性能。同时,宽广的频率范围其25 MHz到250 MHz,小巧的封装5.0 3.…

IntelliJ IDEA 创建Spring Boot 项目整合jdbc详细步骤

IntelliJ IDEA 创建Spring Boot 项目&整合jdbc详细步骤 1、打开 IntelliJ IDEA 软件2、使用 "Spring Initializr" 作为项目类型,新建项目工程3、选择对应的SpringBoot版本和依赖4、Spring Boot 项目的结构5、创建一个TestController,并运行…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,&quo…

开发技术-Java 获取集合中元素下标并移动至指定位置

1. 说明 某些业务需要特定的元素在列表的最后或者指定位置展示。 2. 代码 import lombok.AllArgsConstructor; import lombok.Data;import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;Data AllArgsConstructor class Student {St…

智能图书馆开源项目

结尾有项目链接 技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库,绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强,浏览器适配3.8.3swiper轮播图插件&…

【漏洞复现】大华智能物联ICC综合管理平台文件读取漏洞

Nx01 产品简介 大华智能物联ICC综合管理平台是一个集成了多种智能物联应用服务能力的平台。该平台提供了一系列的基础能力,如中台基础能力、各智能物联应用服务能力以及周边生态支持。 Nx02 漏洞描述 大华智能物联ICC综合管理平台存在文件读取漏洞,攻击…

六、回归与聚类算法 - 欠拟合和过拟合

目录 1、定义 2、原因及解决方法 2.1 正则化 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法:逻辑回归模型保存与加载无监督学习:K-means算法 1、定义 2、原因及解决方法 2.1 正则化

【Unity3D】ASE制作天空盒

找到官方shader并分析 下载对应资源包找到\DefaultResourcesExtra\Skybox-Cubed.shader找到\CGIncludes\UnityCG.cginc观察变量, 观察tag, 观察代码 需要注意的内容 ASE要处理的内容 核心修改 添加一个Custom Expression节点 code内容为: return DecodeHDR(In0, In1);outp…

Flashbit空投

空投要点 明牌空投交互简单,仅需3步,零gas费要求加密钱包在eth链有过交易需要有x和discord账号 空投简介 是一个社区驱动的项目,专门针对Blast生态,项目方提出了空投计划,参与过该生态其他项目空投的都清楚&#xf…

探索什么是模糊测试 Fuzzing Test

什么是 "模糊测试"? Fuzzing 是一种发现软件缺陷的方法,它通过向程序提供随机输入来寻找导致程序崩溃的测试场景(原理有点类似Monkey Test)。可以帮助你快速了解程序整体的健壮性,并帮助你发现和修复关键的缺…

【Python常用包】pathlib

目录 简介Pathlib 库实现Path 创建路径对象检查路径类型创建和删除路径(目录与文件)读写文件路径匹配路径拼接和解析路径属性路径迭代和列出目录内容 小结 简介 Pathlib 是一个用于处理文件路径的 Python 库,提供了许多实用的函数和方法来处…