MySQL中如何进行多表查询

目录

一、子查询

1.什么是子查询

2.注意事项

二、联结查询

1.什么是联结

2.内部联结(等值联结)

①WHERE语句

②ON语句

3.自联结

4.自然联结

5.外部联结

三、组合查询

1.什么是组合查询

2.UNION规则


*本节涉及概念来源于图灵程序设计丛书,数据库系列——《MySQL必知必会》

MySQL中SELECT字句的顺序以及具体使用 这篇文章主要讲了SELECT语句简单查询的字句顺序,即如何从单个表中检索数据。下面介绍如何从多个表中获取(查询)到所需信息。

先给出两个表,vendors(供应商信息)、products(产品信息,一个供应商可能提供多种产品)

同一供货商的信息都是相同的,每个产品重复存储此信息是多余的;如果供货商信息改变,只需要在vendors表中改变一次即可。vendors中的主键(vend_id)又叫products中的外键。

主键: 一列的值能够唯一区分表中的每个行。

外键: 某个表中的一列,包含另一个表中的主键值。


一、子查询

1.什么是子查询

子查询是嵌套在其他查询中的查询。这样说有点抽象,举个例子——列出所有来自USA供货商提供的产品名称?

通常情况下分为两步:vendors表中获取USA供货商的id  products表中由①的id获取产品名称

使用子查询只需要一条语句:将①放到括号内,与IN操作符结合,子查询总是从内向外处理的。

*虽然子查询一般与IN结合使用,但也可以用于测试等于=、不等于<>等

2.注意事项

①子查询中涉及具有二义性的列名,应该使用完全限定列名(vendors.vend_id),即同时使用表名和列名。这不难理解,一共两个表,不指明是哪个表中的列名,会有歧义的。(示例见下面内部联结)

②使用子查询的时候,应该先测试最内层的查询,确定无错之后,用硬编码数据建立和测试外层查询,确定正确之后再嵌入子查询。


二、联结查询

1.什么是联结

联结用来在一条查询语句中关联表。联结在查询的执行中建立,可以联结多个表返回一组输出。

创建联结,规定要联结的表以及它们如何关联即可。

2.内部联结(等值联结)

例子——输出供应商名字与其提供的产品名字?(分别位于vendors与products表中)

①WHERE语句

其中FROM语句后面跟两个表的名字,WHERE语句使用完全限定表名给出联结条件。(没有联结条件的话会返回笛卡尔积)

一条语句中可以联结的表的数目没有限制,可以通过WHERE...AND...语句联结多个表以及其他过滤条件。

②ON语句

其中FROM语句后面使用INNER JOIN指定两个表的关系,用ON子句给出联结条件。

3.自联结

自联结通常用来替代从相同表中检索数据时使用的子查询语句,有时比处理子查询快得多。也就是这个表自己联结自己。

例子——发现产品id为DTNTR的物品存在问题,想知道生产DTNTR的供货商生产的其他物品是否也存在问题?(均位于表products中,相当于需要查询两次该表)

方法一:使用子查询:①找到生产id为DTNTR的供货商 ②找出该供货商生产的其他产品

方法二:使用自联结

将第一次出现的products命名为表别名p1,第二次命名为p2。通过WHERE语句联结两个表,然后按p2中的prod_id过滤数据。

4.自然联结

书上说:“迄今为止我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结”

那等用到了再写吧哈哈哈~

5.外部联结

外部联结:联结包含了那些在相关表中没有关联行的行。

举例——输出所有供货商id以及对应的产品名称?

通过观察表可以注意到,供货商1004、1006并没有提供产品,使用内部联结,输出结果如下:

如果想要输出那些没有产品的供货商,则用外部联结,使用 OUTER JOIN来指定联结类型,用ON子句给出联结条件,在使用的时候要用left(表vendors位于outer join语句的左边)或者right(表products位于outer join语句的右边)来指定包括所有行的表。

(在本例中使用LEFT,即输出表vendors中的所有行)

可以看出,尽管1004、1006并没有提供产品,但外部联结指定输出表vendors中所有的行,即便没有产品的供货商也会检索出来。


三、组合查询

1.什么是组合查询

之前都是单条SELECT语句,MySQL也支持多条查询语句,并将结果作为单个查询结果集返回。

这些组合查询称为并(union)或复合查询,可使用UNION操作符来组合多条SQL查询。使用UNION可以简化复杂的WHERE子句,也会简化从多个表中检索数据的工作。

举例——①输出价格小于等于5的所有产品,②同时也供货商1001、1002提供的所有产品。

例子中组合查询是用相同的表,但UNION是可以应用不同的表的。此例子也可以用多条WHERE子句查询,会更简洁。

当然,如果是更复杂的条件、多个表查询的情况,使用组合查询也许会更简单。

2.UNION规则

①多条语句之间由关键字UNION分隔。

②UNION中的每个查询必须包含相同的列、表达式或聚集函数。

③列数据类型必须兼容:类型不必完全相同,但必须可以隐含转换。

④UNION自动去除重复的行,如果想返回所有匹配行,可以用UNION ALL

⑤在使用UNION组合查询时,只能使用一条ORDER BY语句,必须出现在最后一条SELECT语句之后,用来排序所有SELECT语句返回的所有结果。这也不难理解,只有一个结果集,所以只有一种排序方法,不可能分开部分排序。

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

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

相关文章

GUN C/C++ (GCC/CLANG) 对于 __int128_t (128位有符号大整数的扩展支持平台限制)

鉴于我们对于GCC&#xff0c;在多个CPU目标平台上适用 __int128&#xff08;GCC扩展&#xff09;兼容的情况&#xff0c;目前 __int128 仅限在编译64位可执行程序平台被支持。 本文将列出目标CPU平台的支援情况&#xff1a; X86 不支持&#xff08;i386、i686&#…

笔记: 数据结构与算法--时间复杂度二分查找数组

算法复杂度 不依赖于环境因素事前分析法 计算最坏情况的时间复杂度每一条语句的执行时间都按照t来计算 时间复杂度 大O表示法 n 数据量 ; f(n) 实际的执行条数当存在一个n0 , 使得 n > n0,并且 c * g(n) 恒> f(n) : 渐进上界(算法最坏的情况)那么f(n)的时间复杂度 …

【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期中在什么时期给接口发请求、【找出数组最大公约数】

一、vue2和vue3的区别 1.性能优化&#xff1a; Vue 3在性能方面有很大的提升&#xff0c;主要是通过虚拟DOM的优化和响应式系统的改进实现的。 虚拟 DOM 重构&#xff1a;Vue 3 中对虚拟 DOM 进行了重构&#xff0c;使得更新算法更加高效&#xff0c;减少了更新时的开销&#x…

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

gtsam::Pose3的compose()函数作用

#include <gtsam/geometry/Pose3.h> #include <iostream> int main(int argc, char** argv) {// B 的旋转量为绕 x 轴旋转 180 度gtsam::Pose3 B gtsam::Pose3(gtsam::Rot3(0, 1, 0, 0), gtsam::Point3(1, 2, 0));// A 的旋转量为绕 z 轴旋转 180 度gtsam::Pose3 A…

Linux零基础入门之华为欧拉系统安装

一、名词解释 Linux&#xff1f; Linux是一个开源的免费的操作系统&#xff0c;功能与windows一样。具有处理器管理&#xff0c;存储管理&#xff0c;设备管理&#xff0c;文件管理&#xff0c;作业管理等功能。 可以俗称为Linux操作系统&#xff0c;组织或个人&#xff0c;…

【FIFO】Standard / FWFT FIFO设计实现(一)——同步时钟

标准FIFO 本文使用位扩展的方式实现标准FIFO&#xff0c;原理可参考【AXIS】AXI-Stream FIFO设计实现&#xff08;一&#xff09;——基本模式&#xff0c;核心代码如下&#xff1a; logic [FIFO_DEPTH_WIDTH : 0] rd_ptr_r d0, wr_ptr_r d0;always_ff (posedge clk) beginif…

软考108-上午题-【结构化开发】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 数据流图到软件体系结构的映射 根据数据流的特点&#xff0c;可以将数据流图分为&#xff1a; 变换型数据流图事务型数据流图 其对应的映射分别为&#xff1a; 变换分析事物分析 一个…

网安学习笔记-day11,FTP服务器

FTP服务器 FTP介绍 FTP(File Transfer Protocol)文件传输协议 端口号&#xff1a;TCP 20/21 工作方式&#xff1a; 主动模式被动模式 服务器部署 准备阶段 配置IP windowsXP 192.168.1.21&#xff08;也可DHCP自动获取&#xff09; Windows2003 192.168.1.1 安装万维网…

ssm停车场管理系统

点赞收藏关注 → 私信领取本源代码、数据库 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于停车场管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了停…

146. 序列

题意&#xff1a; 有t个测试用例。 每个测试用例&#xff0c;包含m个数组&#xff0c;每个数组包含n个数字。你可以从每个数组里面选择一个数字&#xff0c;然后将m个数字加和得到一个数字。用这样的方式一共可以获得n的m次幂个数字。问&#xff0c;在这么多个数字中选出最小…

[leetcode]28. 找出字符串中第一个匹配项的下标

前言&#xff1a;力扣刷题 问题&#xff1a; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例&…

全面对比API和SDK

目录 全面对比API和SDK1. 介绍2. API和SDK的基本概念3. API与SDK的区别4. API与SDK的优缺点对比5. API与SDK的使用场景6. API与SDK的开发和维护成本7. API与SDK的集成和实现方式8. API与SDK的安全性9. API与SDK的性能比较10. API与SDK的选择建议11. 总结 全面对比API和SDK 1. …

【Linux】进程管理:进程及概念精讲

前言&#xff1a;本节内容包含进程管理操作的各种基础概念精讲&#xff0c;同时部分板块包含Linux操作系统与一般操作系统的概念对比。不仅包含“书面概念”&#xff0c;还包含详细操作以及通俗讲解。 目录 一、进程概念引入 二、进程的描述与组织&#xff1a;进程控制块&…

nodejs的express编写http服务器配置跨域

配置跨域可引入cors包&#xff0c;插入到express的中间件中 1.引入cors包 npm install cors2. 使用cors 插入到中间件中 const app express()const corsOptions {origin: http://localhost:5173, // 允许访问的来源&#xff0c;可以是单个字符串或一个数组methods: [PUT],…

【python】《流畅的python》读书笔记之第1-2章

序 《流畅的python》是还在上学时就被安利的一本奇书&#xff0c;马克了很久一直没机会系统拜读。最近碰巧偶得第二版的pdf。经济周期的下行阶段正是用来学习充电的&#xff0c;于是乎打算捡起荒废许久的blog&#xff0c;读读书&#xff0c;写写字&#xff0c;蓄势待东风。 第…

xftp突然无法连接虚拟机

问题描述 使用xftp连接虚拟机的时候一直显示 连接xxx.xxx.xx.xx失败 问题原因查找 首先打开本地cmd命令提示符 ping 你的虚拟机ip地址 我的是 ping 192.168.xx.xx 显示请求超时 解决方案&#xff1a; 点击打开更改适配器选项 右键vmnet 8——属性 如图前四个选项必选 单…

《操作系统导论》第16章读书笔记:分段

《操作系统导论》第16章读书笔记&#xff1a;分段 —— 杭州 2024-03-31 夜 文章目录 《操作系统导论》第16章读书笔记&#xff1a;分段0.前言1.分段&#xff1a;泛化的基址/界限2.我们引用哪个段&#xff1f;3.栈怎么办4.支持共享5.细粒度与粗粒度的分段、操作系统支持6.小结7…

Unix中的进程和线程-1

目录 1.如何创建一个进程 2.如何终止进程 2.2遗言函数 3.进程资源的回收 4.孤儿进程和僵尸进程 孤儿进程 (Orphan Process)&#xff1a; 僵尸进程 (Zombie Process)&#xff1a; 代码示例&#xff1a; 5. 进程映像的更新 在Linux中&#xff0c;进程和线程是操作系统进行工作调…

CAS 的 ABA 问题

一、什么是 ABA 问题 ABA 的问题: 假设存在两个线程 t1 和 t2. 有⼀个共享变量 num, 初始值为 A. 接下来, 线程 t1 想使⽤ CAS 把 num 值改成 Z, 那么就需要 先读取 num 的值, 记录到 oldNum 变量中. 使⽤ CAS 判定当前 num 的值是否为 A, 如果为 A, 就修改成 Z. 但是, 在…