sql多表连接查询与子查询

DB(五):关联查询、子查询、关联子查询、分页查询 包括关联查询内链接、外链接、自查询;子查询在SELECT、WHERE、FROM语句中使用,子查询的执行过程及注意事项;关联子查询EXISTS、NOT EXISTS的执行过程,IN和EXISTS的区别;分页查询。 阅读详情
AI摘要

本文详细介绍了SQL连接查询的各种类型,包括无连接、等值连接、内外连接、自连接、交叉连接以及UNION、EXCEPT和INTERSECT等组合查询方法。此外,还涵盖了子查询的使用及其与聚合函数、ALL谓词的结合实例。

1. 连接查询

1.1 无连接规则

SELECT语句中不设置连接条件,FROM语句中填入多张表名
第一张表中每一行会和第二张表格中的所有行连接,
两张表以此可以得到笛卡尔积

1.2 WHERE 引导的有规则连接

FROM 表一,表二
WHERE 表一.表一字段=表二.表二字段

如果字段为表格独有,则可以不加表名

1.3 表名简化语句

FROM Ord AS a, Product AS b, Customer AS c
WHERE a.Pno=b.Pno, b.Cno=c.Cno

关键字 AS 可以省略

1.4 使用 INNER JOIN 语句查询

SELECT *(或字段列表)
FROM 表一 INNER JOIN 表名二 ON 连接规则1
INNER JOIN 表名三 ON 连接规则3
......
INNER JOIN 表名n ON 连接规则n

使用 INNER JOIN...ON 连接,可以使WHERE子句变简单,
该方式被称为内连接查询

实操上把每张表中相同的字段连一连就行了

2. 高级连接查询

2.1 自连接查询

Q: 查询张三所在院系中所有学生的信息
通常此问题需要两步:

  1. 查询张三所在什么院系
  2. 查询该院系的所有学生
    自连接查询可在一段语句中完成示例
    image.png

SELECT 语句中如果仅用一个*,那么得到表会出现重复

2.2 内连接查询

  1. 等值连接
    • 连接规则用=表示
    • SELLECT 语句中使用 * 号
  2. 自然连接
    相比等值连接,自然连接 SELECT 语句仅列出需要的字段
  3. 不等值连接
    ON 之后的连接规则涉及等号以外的运算符,比如 BETWEEN

2.3 外连接查询

2.3.1 左外连接

FROM t1 LEFT OUTER JOIN t2

关键字: LEFT OUTER JOIN
t1中的所有结果都会被包含进新表,而t2仅匹配记录会被包含

2.3.2 右外连接

与左外连接查询反之

2.3.3 全外连接

关键字: FULL OUTER JOIN
所有记录无论是否匹配都会被包含
几种查询的图示

2.4 交叉连接查询

其实就指[[#1.1 无连接规则|无连接规则]],但是形式有两种

  1. 逗号隔开表名
  2. CROSS JOIN 隔开表名
    一种可能的用法:
    表一中存星期一到星期天,表二中存第一节课到第八节课
    交叉连接后可以得到一张一天八节课的课表

2.5连接查询中使用聚合函数

聚合函数也能用于多表连接查询:
多表连接后会产生NULL值,书中的例子通过 COUNT 筛选过的所有NULL值来计算没参加考试的同学

3. UNION 组合查询

组合查询与连接查询比较
image.png

3.1 语法格式

image.png

3.2 与 OR 语句区别

UNION 会将结果集中相同的记录自动去掉,而 OR 会保留重复相同的记录

若在使用 UNION 时,不想删除重复值,可以使用 UNION ALL 替代即可

3.3 使用 UNION 规则

3.3.1 每个查询语句应有相同数量的字段

字段数不同时,可以用常量或者NULL补位。
上述性质对于 INTERSECT 或者 EXCEPT 语句也适用

3.3.2 每个查询语句相应的字段的类型必须相互兼容

相应位置字段类型不同时,可以用类型转换函数强制转换字符类型

3.4 排序组合查询的结果

  • OREDER BY 语句只能出现一次,对最后的结果排序
  • 如果没有 ORDER BY 语句时,结果会根据第一个 SELECT 子句中字段名列表升序排序

3.5 查询实例

Q:image.png
A:image.png
较为复杂的例子:
image.png

image.png

3.6 集合的并,差,交

3.6.1 并集UNION

并集操作用于合并两个集合中的元素,结果集中包含两个集合中的所有==不重复==元素。
[[并集示例]]
假设有两个表 employees 和 contractors,它们包含相同的列 name 和 department。我们想获取所有员工和合同工的名单,但不包括重复的记录

SELECT name, department
FROM employees
UNION
SELECT name, department
FROM contractors;

3.6.2 差集EXCEPT 或 MINUS

差集操作用于从==一个集合中减去另一个集合中存在的元素==,返回不在第二个集合中的元素。
[[差集示例]]
假设我们想找出所有只是员工而不是合同工的人员名单。
(这说明部分人既是员工又是合同工)

SELECT name, department
FROM employees
EXCEPT
SELECT name, department
FROM contractors;

3.6.3 交集INTERSECT

交集操作用于获取两个集合中都存在的元素。
[[交集示例]]
假设我们想找出既是员工又是合同工的人员名单。

SELECT name, department
FROM employees
INTERSECT
SELECT name, department
FROM contractors;

4. 子查询

4.1 使用返回单值的子查询

在 WHERE 语句中,使用诸如等于 = 或者不等于 <> 这样的关系运算符把子查询与主查询连接起来

4.2 子查询与聚合函数配合使用

这是使用子查询场景最多的情况。早期的版本中子查询效率优于内连接查询,而外连接查询还没出现。
下面给出一个实例:image.png

4.5 子查询与 ALL 谓词

主查询中的某字段与子查询中最大的或者最小的比较
一个实例:[[查找工资大于部门ID为2的员工最高工资的所有员工]]

条件描述
c > ALL(…)c列中的值必须大于要评估为true的集合中的最大值。
c >= ALL(…)c列中的值必须大于或等于要评估为true的集合中的最大值。
c = ALL(…)c列中的值必须等于要评估为true的集合中的任何值。
……

这个也可以用集聚函数 MIN() MAX() 等实现

4.4 一些子查询的实例

[[用IN子查询实现]]

查询在2022年8月9日销售的产品信息

USE ShopDB
SELECT *
FROM dbo.product
WHERE Pno IN (SELECT Pno FROM dbo.Ord 
			  WHERE Odate='08/09/2022')

[[用EXISTS子查询实现]]

查询在2022年8月9日销售的产品信息

USE ShopDB
SELECT *
FROM dbo.product AS pro
WHERE EXISTS 
(SELECT 1 
FROM dbo.Ord AS ord 
WHERE Odate='08/09/2022' 
	AND ord.Pno=pro.Pno)

  • 使用 EXISTS 时,一般在括号内的子查询里设置与主查询连接条件
  • 事实证明语句会返回所有符合条件的存在项,所以子查询里可以设置为 SELECT 1 提高查询效率

[[用连接查询实现]]

查询在2022年8月9日销售的产品信息

USE ShopDB
SELECT pro.*
FROM dbo.product AS pro INNER JOIN dbo.Ord AS ord
ON pro.Pno=ord.Pno
WHERE ord.Odate='08/09/2022'

上述三种方式得到的结果都是一样的

SQL复合查询进阶:多表连接、自连接与子查询实战解析 SQL查询是后端开发的基本功,但当业务需要从多张表取数、比较同一张表内不同行、或按分组结果二次过滤时,单表查询就难以应对。复合查询由多表连接、自连接、子查询组合而成:JOIN负责横向拼接表数据,自连接通过别名让一张表与自身关联,子查询则把一条SQL的查询结果作为另一条SQL的输入。理解这三者的适用场景与执行逻辑,能有效避免笛卡尔积、结果行数膨胀、索引失效等常见问题。在报表统计、部门平均工资对比、层级关系查询等真实工程场景中,复合查询都是不可或缺的实践技能。掌握它,才能真正写出满足复杂业务需求的高效SQL。 阅读详情

相关推荐

SQL语法基础-多表查询(+索引简介)

SQL语法基础-多表查询+索引简介

goubi4056的博客 3643

mysql( 连表查询 子查询 联合查询)

1 .连表查询 为什么需要连表查询? 1.如果查询得结果在一张表中无法获取,需要关联多张表,那么这时就需要连表查询。 2.连表查询大多数都作用在外键得基础上。--- 表与表之间有关联。 1.1 表与表之间存在得关系 一对多: 在多得一方添加外键列 多对多: 需要在创建一个中间表,该表中至少有两个外键列。 1.3 内连接: 连接演示---结果都是一样,只是语法不同。看个人习惯用哪个? 1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现) 2.查询每一个员工

qq_55682798的博客 1947

SQL 中如何实现多表关联查询?

4. **FULL JOIN(或FULL OUTER JOIN)**:返回两个表中所有的行。3. **RIGHT JOIN(或RIGHT OUTER JOIN)**:与LEFT JOIN相反,返回右表的所有行,即使左表中没有匹配。5. **CROSS JOIN**:返回两个表的笛卡尔积,即每个表中的每行与另一个表中的每行组合。在执行多表关联查询时,你还可以使用`WHERE`子句来添加额外的过滤条件,以及使用`GROUP BY`、`HAVING`和`ORDER BY`子句来对结果进行分组、过滤和排序。

u013558123的博客 2212

SQL——多表连接查询

若一个查询同时涉及两个或两个以上的表, 则称之为连接查询(在FROM子句中体现)。参与连接的表可有多个,但连接操作在两个表之间进行,即两两连接。

小平凡的记录的博客 2万+

17、SQL中的多表连接与子查询详解

本文详细介绍了SQL中的多表连接类型,包括内连接、左外连接、右外连接、全外连接等,并结合mermaid流程图直观展示了内连接和左外连接的区别。随后,文章深入解析了SQL子查询的概念及其应用,涵盖单行子查询、多行子查询、相关子查询以及EXISTS和NOT EXISTS运算符的使用。最后,探讨了子查询与连接的结合使用方式及其性能优化策略,帮助开发者更高效地进行复杂查询与数据库分析。

css33的专栏 128

Kaggle大神Abhishek的机器学习框架实战:从红酒数据集看交叉检验的坑与解法

本文通过Kaggle竞赛Grandmaster Abhishek Thakur的实战经验,以红酒数据集为例,深入探讨了机器学习中交叉检验的五大陷阱与优化策略。文章详细解析了决策树max_depth调优过程中的过拟合现象,对比了五种主流交叉检验方法的适用场景,并提供了回归问题中的分层技巧和特征工程陷阱的解决方案。最后,总结了交叉检验方案选型决策树,帮助数据科学家在实际项目中提升模型泛化能力。

h6j7k8l9p0的博客 964

SQL 多表联查

内联接(INNER JOIN):返回两个表中匹配的记录。左外联接(LEFT JOIN):返回左表的所有记录和右表中匹配的记录(右表可能为NULL右外联接(RIGHT JOIN):返回右表的所有记录和左表中匹配的记录(左表可能为NULL全外联接(FULL JOIN):返回两个表的所有记录(MySQL 通过UNION模拟)。交叉联接(CROSS JOIN):返回两个表的笛卡尔积。自联接(SELF JOIN):表与自身的联接,通常用于记录间的比较。

Lzcsfg的博客 1万+

广东电信兆能Z82盒子救砖记:手把手教你用U盘强刷HI3798MV100固件(附短接图)

本文详细介绍了广东电信兆能Z82盒子变砖后的救砖方法,重点讲解了使用U盘强刷HI3798MV100固件的全流程,包括诊断、准备工作、短接操作及刷机后的优化设置。特别针对m8233主板和8188无线方案的机型,提供了实用的短接图和操作技巧,帮助用户成功恢复设备。

weixin_30325487的博客 403

深入理解 SQL 查询:使用子查询与多表连接查找实现相同功能

特别是在处理具有多对多关系的表时,如何高效地查询并关联数据是一个常见且重要的任务。本篇文章将通过一个实际的案例,展示如何使用 SQL 查询语言通过子查询和多表连接来获取特定产品的客户信息。选择哪种查询方式取决于具体的业务需求和查询的复杂度。了解两者的优势和使用场景,可以帮助我们在实际应用中做出更合适的决策。通过本案例,我们不仅能够掌握如何在多表中查找相关数据,还能够更加深入地理解 SQL 查询语言的不同用法和最佳实践。则更适合处理复杂的表关系,特别是在需要关联多个表时,连接的效率往往更高。

欢迎来到我的博客。 1153

倾斜摄影与地面激光点云融合高精度建模研究

本文研究了倾斜摄影与地面激光点云融合精细化建模技术,并通过相应的源代码实现了建模过程。该方法将倾斜摄影和激光扫描相结合,能够获得高精度的三维建模结果,为相关领域的研究和应用提供了有力支持。近年来,倾斜摄影和激光扫描技术的快速发展为高精度三维建模提供了新的机遇和挑战。本文针对倾斜摄影与地面激光点云融合建模这一前沿领域展开研究,旨在通过相应的源代码实现精细化的建模过程。同时,使用激光扫描仪进行地面激光扫描,获取地面的点云数据。经过数据融合和精细化建模处理后,我们获得了高精度的三维建模结果。

LpmShell的博客 1246

Linux系统中u-boot启动流程分析(详解)

代码部分,具体如下;

嵌入式技术开发 1992

Oracle 高级 SQL 查询与函数详解:多表连接、子查询、聚合、分析函数

本文系统介绍了Oracle高级SQL查询技巧,包括多表连接(INNER JOIN、LEFT JOIN等)、子查询(标量、列、行、表子查询)、聚合函数与分组(GROUP BY、HAVING)等基础操作,以及字符处理、日期函数、条件表达式(CASE WHEN/DECODE)和分析函数(ROW_NUMBER、LAG/LEAD)等高级功能。通过大量实用示例代码,帮助初学者快速提升SQL能力,中级开发者查漏补缺。这些技巧是Oracle数据库开发的核心技能,适用于实际业务中的数据提取、计算和报表生成等场景。建议读者在本

BUG糕手的博客 1512

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

SQL Sserver 数据库【多表连接查询、子查询】

SQL Sserver 数据库【多表连接查询、子查询】

upward 2194

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

【异常】Cursor报错We‘re having trouble connecting to the model provider. This might be temporary

在使用Cursor编辑器进行AI交互操作时,界面弹出如下报错提示,导致无法正常调用模型服务,影响使用流程:We’re having trouble connecting to the model provider. This might be temporary - please try again in a moment. 该报错核心含义为Cursor编辑器无法正常连接至背后的AI模型服务提供商(如OpenAI、Anthropic等),属于连接类异常,并非编辑器本身运行故障。经排查,该报错不具备破坏性,仅

奶爸的编程之路,也就一周冷个三天 1691

SQL Lineage高级用法:处理CTE、子查询与多表连接的技巧

SQL Lineage是一款强大的SQL血缘分析工具,能够帮助数据工程师、分析师和开发人员追踪SQL查询中数据的来源与流向。本文将深入探讨如何利用SQL Lineage处理常见的复杂SQL场景,包括CTE(公用表表达式)、子查询和多表连接,让你轻松掌握这些高级用法的实用技巧。 ## 理解SQL Lineage的核心能力 SQL Lineage通过解析SQL语句,自动识别表与列之间的依赖关系,生

gitblog_00034的博客 747

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2466

SQL 多表查询完全指南:从关系模型到连接、子查询与联合查询

关系:一对一关系,用于单标拆分,将一张表的基础字段放到一张表中,其他详情字段放到另一张表中,一遍提高操作效率。注意:在多表查询过程中需要消除无效的笛卡尔积(在查询语句后加where条件消除无效数据)SELECT 字段列表 FROM 表1,表2 WHERE 条件…注意:右外连接可以改成左外连接,调换表1表2顺序后修改关键字即可。注意:对于查询的多张表的列数必须保持一致,字段类型也必须保持一致。(3)自连接:当前表与自身的连接查询,自连接必须使用表的别名。实现:在多的一方建立外建,指向一的一方的主键。

jiangxiaohanya的博客 293

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【SQL高手进阶指南】:解锁复杂查询、多表连接与子查询的终极写法

掌握高效编写SQL的秘诀,本文汇总sql语句大全,涵盖多表连接、子查询与复杂查询优化技巧,适用于数据分析、报表开发等场景。提升查询性能,结构清晰易学,值得收藏。

ProceGlow的博客 618

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【SQL】多表查询语句(嵌套子查询,多表连接)操作实例

SQL Server多表查询,包括连接操作和嵌套子查询 名称解释(不区分大小写) student:学生表,属性分别为sno学号、sname学生姓名、age年龄、sex性别、dno学院编号、birthday生日 sc选课信息表:sno学号、cno课程号、grade成绩 dept学院信息表:dno学院编号、dname学院名称、dean学院负责人 course课程信息表:cno课程号、cname课程名称、tname老师名称、credit学分、room教室 下面语句可以直接复制到SQL Server运行 方法不

Lee的博客 2万+

sql基础--多表连接及子查询

首先,多表连接肯定是多个表之间进行操作,这里先定义三个表:供应商表(t_supplier):(f_sid,f_sname,f_city)零件表(t_part):(f_pid,f_pname,f_price)销售表(t_sells):(f_id,f_date,f_sid,f_pid,f_count)一、多表连接查询    1、交叉连接查询(笛卡尔积连接):第一个表中的每条数据与第二个表中的每条数据记...

weixin_35092068的博客 1311

SQL复合查询实战:多表连接、自连接与子查询全解析

数据库查询是日常开发的核心操作,当业务需求涉及多张关联表时,单表查询往往无法满足。SQL复合查询由多表连接、自连接和子查询等技法组合而成,能够高效解决报表统计、层级关系、数据对比等复杂场景。理解连接与过滤的执行时机、子查询的嵌套逻辑,并通过索引与执行计划优化性能,是写出高质量SQL的关键。本文从原理到实战,系统梳理复合查询的三板斧及其在经典员工-部门模型中的应用与踩坑经验。

weixin_33508411的博客 261

【SQL 进阶】一文搞懂多表查询:内外连接、子查询与别名的艺术

【SQL 进阶】一文搞懂多表查询:内外连接、子查询与别名的艺术

2302_80412007的博客 205

多表连接查询与子查询

多表连接查询和子查询 一、连接查询 1.1使用无连接规则连接两表 所谓无连接规则连接,就是指两个表的SELECT语句中不设置任何连接条件,这样的到的链接结果是第一个表的每一行都会和第二个表的所有行进行连接,即得到一个笛卡尔积。 SELECT * FROM STU_INFO,SCORE       1.2 使用有连接规则连接两表            有连接规则连接,其实就是在无连

牟尼的专栏 1万+

SQL复合查询实战:多表连接、自连接与子查询性能优化

在关系型数据库开发中,SQL查询是数据操作的核心技能。当业务需求涉及多表关联、行内比较或集合判断时,简单的单表查询无法满足要求,复合查询便成为必经之路。通过JOIN将不同表横向拼合,利用自连接处理同一张表内的层级关系,借助子查询完成分步计算,这些技术共同构成了SQL高级查询的基石。合理运用这些语法能大幅提升数据检索效率,也能解决“部门工资最高员工”“未下单客户”等典型业务问题。同时,理解ON与WHERE区别、避免NOT IN的NULL陷阱、善用EXPLAIN分析执行计划,对保障大数据量下的查询性能至关重要。

weixin_34098209的博客 240
上一篇: sql函数与分组查询
下一篇: sql中视图的创建,查询,更新与删除
LeavesWebber
博客等级 码龄4年 92粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeavesWebber

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值