15天学习MySQL计划-多表联查(基础篇)第四天

news2024/11/23 19:19:46

15天学习MySQL计划(多表联查)第四天

1.多表查询

1.1概述

​ 指从多张表中查询数据

​ 在项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一):在多的一方设置外键,关联一的一方的主键
  • 多对多:建立中间表,中间表包含两个外键,关联两张表的主键
  • 一对一:用于表结构拆分,在其中任何一方设置外键(unique),关联另一方的主键

笛卡尔积:笛卡尔积乘积是指在数学中,两个集合A集合金和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)

1.2多表查询分类

  • 连接查询
    • 内连接:相当于查询A,B交集部分数据
    • 外连接:
      • 左外连接:查询左表所有数据,以及两张表交集部分数据
      • 右外连接:查询右表所有数据,以及两张表交集部分数据
    • 自连接:当前表与自身的连接查询,自连接必须使用表别名
  • 子查询

在这里插入图片描述

1.3内连接

  • 隐式内连接
select 字段列表 from1,表2 where 条件;
  • 显式内连接
select 字段列表 from1 [inner] join2 on 连接条件;

1.4连接查询-外连接

  • 左外连接
select 字段列表 from1 left [outer] join2 on 条件;

相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据

  • 右外连接
select 字段列表 from1 right [outer] jion 表2 on 条件;

相当于查询表1(右表)的所有数据包含表1和表2交集部分的数据

1.5自连接

自连接查询语法:

select 字段列表 from 表A 表名A join 表A 别名B on 条件...;

自连接查询,可以是内连接查询,也可以是外连接查询

对一张表起不同的别名,当作两张表处理即可

1.6联合查询

对于union查询,就是把多次查询的结构合并起来,形成一个新的查询结构集

select 字段列表 from 表A
union [all]
select 字段列表 from 表B;

注意

  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all会将全部的数据之间合并在一起,union会对合并之后的数据去重。

1.7子查询

  • 概念:sql语句中嵌套select语句,称为嵌套查询,又称为子查询。
select * from 表名 where 字段 = (select 表名 from 字段);
  • 子查询外部的语句可以是insert/update/delete/select的任何一个。
  • 根据子查询结构不同,分为:
    • 标量子查询(子查询结构为单个值)
    • 列子查询(子查询结构为一列)
    • 行子查询(子查询结果为一行)
    • 表子查询(子查询结果为多行多列)
  • 根据子查询位置,分为:where之后,from之后,select之后

1.标量子查询

子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式,这种子查询成为标量子查询

--获取张三的id号,通过id在第二章表中获取张三的年龄
select id from tb1 where name='zhangsan';
select age from tb2 where id = 4;

标量子查询
select age from tb2 where id = (select id from tb1 where name='zhangsan');

2.列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询

常用的操作符:in,not in,any,some,all

操作符描述
in在指定的集合范围内,多选一
not in不在指定的集合范围之内
any子查询返回列表中,有任意一个满足即可
some与any等同,使用some的地方都可以使用any
all子查询返回列表的所有值都是必须满足

例子:

--获取比研发部工资高的人员
1.获取研发部人员
select 名字 from tb1 where 部门='研发部';
2.获取人员的工资
select 工资 from tb2 where 名字=(select 名字 from tb1 where 部门='研发部');
3.获取比研发部工资高的员工
select 姓名,工资 from tb1 where 工资 > all (select 工资 from tb2 where 名字=(select 名字 from tb1 where 部门='研发部'));

--获取比研发部工资高的任意一个人员
1.获取研发部人员
select 名字 from tb1 where 部门='研发部';
2.获取人员的工资
select 工资 from tb2 where 名字=(select 名字 from tb1 where 部门='研发部');
3.获取比研发部工资高的员工
select 姓名,工资 from tb1 where 工资 > any (select 工资 from tb2 where 名字=(select 名字 from tb1 where 部门='研发部'));

3.行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:=,<>,in,not in

例子:

--查询与张三的薪资及直属领导相同的员工信息
1.查询张三的薪资及直属领导
select 薪资,领导 from tb1 where name='张三';
2.查询与张三的薪资及直属领导相同的员工信息
select * from 表名 where (工资,领导) = (select 薪资,领导 from tb1 where name='张三');

4.表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询

常用的操作符:in

例子:

--查询与张三和李四相同职位和薪资的员工信息
1.查询张三,李四的职位和薪资
select 职位,薪资 from tb1 where name='张三' or name='李四';
2.查询与张三和李四相同职位和薪资的员工信息
select * from tb2 where (职位,薪资) in (select 职位,薪资 from tb1 where name='张三' or name='李四');

张三,李四的职位和薪资
select 职位,薪资 from tb1 where name=‘张三’ or name=‘李四’;
2.查询与张三和李四相同职位和薪资的员工信息
select * from tb2 where (职位,薪资) in (select 职位,薪资 from tb1 where name=‘张三’ or name=‘李四’);


##  

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

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

相关文章

大数据实战 --- 美团外卖平台数据分析

目录 开发环境 数据描述 功能需求 数据准备 数据分析 RDD操作 Spark SQL操作 创建Hbase数据表 创建外部表 统计查询 开发环境 HadoopHiveSparkHBase 启动Hadoop&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup …

人工智能会影响测试工程师吗

并不是危言耸听 当下最火的是什么&#xff0c;那非ChatGPT莫属了&#xff0c;以ChatGPT为代表的各类AIGC工具&#xff0c;在不断颠覆我们的认知&#xff0c;不仅能完成律师&#xff0c;医学考试&#xff1b;还能画出一张精美的设计图&#xff0c;拿下艺术大赛一等奖。 以之对…

C#基础学习--反射和特性

元数据和反射 要使用反射&#xff0c;必须使用System.Reflection 命名空间 Type类 Type是一个抽象类&#xff0c;用来包含类型的特性&#xff0c;使用这个类的对象可以让我们获取程序使用的类型的信息 我们可以从Type对象中获取需要了解的有关类型的几乎所有信息 获取Type对象…

Node.js下载安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序 &…

在 VSCode 中让 TypeScript 错误更漂亮且易于阅读

简介 TypeScript 是一种流行的编程语言&#xff0c;为 JavaScript 提供了静态类型和改进的错误检测。然而&#xff0c;随着类型的复杂性增加&#xff0c;错误的复杂性也增加了。这就是 Pretty TypeScript Errors VSCode 插件的用途&#xff0c;它可以在 Visual Studio Code 中…

8.线性搜索算法和二进制搜索算法

算法&#xff1a;线性搜索算法 线性搜索是一种非常简单的搜索算法。在这种类型的搜索中&#xff0c;逐个对所有项目进行顺序搜索。检查每个项目&#xff0c;如果找到匹配项&#xff0c;则返回该特定项目&#xff0c;否则搜索将继续&#xff0c;直到数据收集结束。 算法 Linea…

【数据结构】- 链表之单链表(下)

文章目录 前言一、单链表(下)1.1 查找修改1.2 在任意位置插入1.2.1 在pos位置插入(也就是pos位置之前)1.2.2 在pos位置之后插入 1.3 在任意位置删除1.3.1 删除pos位置得值1.3.2 删除pos位置后面的值 二、完整代码总结 前言 未来藏在迷雾中 叫人看来胆怯 带你踏足其中 就会云开…

【C++类和对象】类和对象(中):拷贝构造函数 {拷贝构造函数的概念及特征,拷贝构造函数不能使用传值传参,编译器自动生成的拷贝构造函数}

四、拷贝构造函数 4.1 概念 在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器…

MySQL高级(二)

一、SQL优化 &#xff08;一&#xff09;插入数据 批量插入 多次插入每一次insert都要与数据库建立连接。 INSERT INTO 表名 VALUES (),(),(); 一次插入数据不宜过多&#xff0c;不要超过1000条。 手动提交事务 START TRANSACTION; INSERT INTO 表名 VALUES (),(),(); I…

车载以太网 - SomeIP - 协议用例 - Format_01

目录 1、验证Client ID字段静态设置为0x0000 2、验证Session ID字段静态设置为0x0001 3、验证Protocol Version字段静态设置为0x01

SpringCloud:ElasticSearch之自动补全

当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项&#xff0c;如图&#xff1a; 这种根据用户输入的字母&#xff0c;提示完整词条的功能&#xff0c;就是自动补全了。 因为需要根据拼音字母来推断&#xff0c;因此要用到拼音分词功能。 1.拼音分词器…

【移动端网页布局】移动端网页布局基础概念 ④ ( 物理像素 | 物理像素比 | 代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 )

文章目录 一、物理像素 / 物理像素比二、代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 一、物理像素 / 物理像素比 移动端 网页开发 与 PC 端开发有很多不同之处 , 在图片处理方向需要采用 二倍图 / 三倍图 / 多倍图 方式进行图片处理 ; 图片处理的方式与如下的 物…

项目支付接入支付宝【沙箱环境】

前言 订单支付接入支付宝&#xff0c;使用支付宝提供的沙箱机制模拟为订单付款。我这里主要记录一下沙箱环境如何接入到系统中&#xff0c;具体细节的实现。按照官方文档来就可以了。 1、使用步骤 这里有几个重要数据要拿到&#xff0c;一个是支付宝的公钥和私钥&#xff0c…

ClickHouse监控系统Prometheus+Grafana

目录 1 PrometheusGrafana概述2 安装Prometheus Grafana3 配置ClickHouse4 配置Grafana 1 PrometheusGrafana概述 ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中( system.*)。所以我们对于 CH 自身的一些运行指标的监控数据&#xff0c;也主要来自这些系统表。…

docoker笔记

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

RabbitMQ【#1】是什么,有什么用

RabbiMQ是什么&#xff1f; RabbitMQ是一种开源的消息队列软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;并支持多种编程语言。它可以用于将消息从一个应用程序传递到另一个应用程序或进程&#xff0c;并支持分布式系统中的异步消息通信。RabbitMQ的主…

【Linux】System V 共享内存、消息队列、信号量

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 system V共享内存介绍 System V 共享内存是一种进程间通信的机制&#xff0c;它允许多个进程共享一块物理内存区域&#xff08;称为“段”&#xff09;。System V 共享内存的优点是效率高&…

AD21 PCB----过滤、捕获、板子边框绘制、精准移动

目录 过滤器和捕获 板子边框绘制 精准移动 过滤器和捕获 板子边框绘制 两种方式均在Mechanical 1 方式一&#xff1a; 第一步&#xff1a;利用PCB的基础图形进行绘制边框 第二步&#xff1a;选中绘制的图形 第三步&#xff1a; 方式二&#xff1a;外部导入 第一步&#x…

SpringCloud 微服务系列——【服务间的通信方式、OpenFeign、Hystrix组件使用】

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【UE 粒子系统】电火花粒子效果

效果 步骤 1. 新建一个粒子系统&#xff0c;命名为“SparkParticles” 再新建一个材质&#xff0c;命名为“SparkParticleMaterial” 2. 打开“SparkParticleMaterial”&#xff0c;将混合模式改为半透明&#xff0c;着色模型为无光照 然后添加如下节点 3. 打开“SparkParticl…