连接查询(学习笔记)

news2024/11/24 9:31:50

通过对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='男';

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

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

相关文章

【Spring】IoC容器 控制反转 与 DI依赖注入 概念 第一期

文章目录 Spring 和 SpringFramework概念一、Spring IoC容器 核心概念1.1 组件和组件管理概念1.2 Spring IoC容器和容器实现1.2.1 普通和复杂容器1.2.2 SpringIoC容器介绍1.2.3 SpringIoC容器具体接口和实现类1.2.4 SpringIoC容器管理配置方式 1.3 Spring IoC / DI概念总结二、…

Electron实战之环境搭建

工欲善其事必先利其器,在进行实战开发的时候,我们最终的步骤是搞好一个舒服的开发环境,目前支持 Vue 的 Electron 工程化工具主要有 electron-vue、Vue CLI Plugin Electron Builder、electron-vite。 接下来我们将分别介绍基于 Vue CLI Plu…

DataDreamer:让创建自定义数据集轻松无比!还自带标注!

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是Ash…

数字信号处理:傅里叶分析

本文主要参考视频如下: 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示: 注意,计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换; 前四种都是理论上的变换方式&…

Graphpad Prism10.2.0(329) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织结合在一起,除了最基本的数据统计分析外,还能自动生成统…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息,通过留言区互动更方便。本系统采用了B/S体系的结构,使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分,系统管理员主要功能包括首…

vue-router 三级路由,路由跳转页面异常白屏或404,或刷新三级路由页面后一级和二级路由菜单丢失

问题描述 情况1. vue-router 定义三级路由,路由跳转了,页面404或者白屏情况2. 点击菜单三级路由后,刷新页面后一级和二级路由菜单丢失 解决方案: 某些时候是因为二级和三级的路由共用router-view,可以使用router-vi…

【MySQL系列 04】深入浅出索引

一、索引介绍 提到数据库索引,相信大家都不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。 但到底什么是索引,索引又是如何工作的…

Vue | (四)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 📚初始化脚手架🐇创建初体验🐇分析脚手架结构🐇关于render🐇查看默认配置 📚ref与props🐇ref属性🐇props配置项 📚混入📚插件📚scoped样…

抖音爬虫批量视频提取功能介绍|抖音评论提取工具

抖音爬虫是指通过编程技术从抖音平台上获取视频数据的程序。在进行抖音爬虫时,需要注意遵守相关法律法规和平台规定,以确保数据的合法获取和使用。 一般来说,抖音爬虫可以实现以下功能之一:批量视频提取。这个功能可以用于自动化地…

Lua速成(2)

一、流程控制 Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。 …

模拟、排序(归并排序)算法

模拟、排序算法 一、模拟例题1、错误票据题目信息思路题解 2、回文日期题目信息思路方法一:暴力做法方法二:优化解法 题解方法一:暴力求解方法二:优化解法 二、排序例题1、归并排序题目信息思路题解 一、模拟 例题 1、错误票据 …

AI副业项目分享

在上一篇文章《这才是大学生该做的副业,别再痴迷于游戏了!》中,我分享了一些副业的想法,接着有不少同学问我:具体如何做?这是真把我给整蒙了,这里分享下我可以提供的产品和服务吧,并…

实用区块链应用:去中心化投票系统的部署与实施

一、需求分析背景 随着技术的发展,传统的投票系统面临着越来越多的挑战,如中心化控制、透明度不足和易受攻击等问题。为了解决这些问题,我们可以利用区块链技术去中心化、透明性和安全性来构建一个去中心化投票系统。这样的系统能够确保投票过…

【某机构vip教程】python(6):python读取ini的配置文件

python读取ini的配置文件 configparser模块简介: configparser模块是用来解析ini配置文件的解析器。 ini配置文件的结构如x下图 ini文件结构需要注意以下几点: 键值对可用或者:进行分隔 section的名字是区分大小写的,而key的名字是不区分大小写的 …

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV(Unique Visitor)独立访客PV(Page View)页面浏览量DAU(Daily Active User)日活跃用户量MAU(Monthly Activ…

【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

元素定位方法介绍及应用: Appium方法定位原生app元素: 通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定…

学习Redis基础篇

1.初识Redis 1.认识NoSQL 2.认识Redis 3.连接redis命令 4.数据结构的介绍 5.通用命令 2.数据类型 1.String类型 常见命令:例子:set key value

【Linux 内核源码分析】内存管理——伙伴分配器

在Linux操作系统中,内存分配通常由内核中的内存管理模块完成。以下是三个主要的内存分配器: 伙伴系统 (Buddy System):这是内核中最基本的分配器,用于分配物理内存。伙伴系统将内存块组织成不同大小的伙伴,以便有效地分…

电脑c盘太满了怎么办?5个必备的好方法~

随着我们在电脑上存储和安装越来越多的文件和程序,C盘的空间可能会迅速减少,甚至变得过于拥挤。当C盘空间不足时,会影响电脑的运行速度和性能,甚至导致系统崩溃。本文将介绍一些解决C盘空间不足问题的方法,帮助你更好地…