SQL Server多数据表之间的数据查询和分组查询

文章目录

  • 一、多数据表之间的数据查询
    • 1.1内连接查询(Inner join)
    • 1.2 左外连接 (LEFT JOIN):
    • 1.3右外连接 (RIGHT JOIN):
    • 1.4. 全外连接 (FULL OUTER JOIN):
    • 1.5 交叉连接 (CROSS JOIN):
    • 1.6 自连接 (SELF JOIN):
    • 1.7 子查询:
  • 二、分组查询
    • 2.1 分组查询
    • 2.2 查询重复数据

一、多数据表之间的数据查询

在SQL中,多数据表之间的查询主要用于以下方面:
在SQL Server中,多数据表之间的数据查询主要用于以下几个方面:

  1. 关联数据提取:现代数据库通常将数据分散在多个相关的表中以便于管理。例如,订单信息可能存储在一个表中,而客户信息可能存储在另一个表中。为了获取完整的订单详情,你可能需要从两个表中提取并合并信息。

  2. 数据整合:多表查询可用于整合来自不同数据源的信息,这对于报告和分析非常重要。比如,销售报告可能需要结合产品、销售和客户表中的数据。

  3. 性能优化:合理设计的数据库模型会将数据分散在多个表中,以减少冗余和提高性能。通过多表查询,可以有效地检索分散的数据而无需过多冗余。

  4. 数据完整性:数据库设计时通常会使用外键来维护不同数据表之间的关系,确保数据的一致性和完整性。多表查询可以利用这些关系来确保查询结果的准确性。

  5. 复杂的数据操作:多表查询允许执行复杂的数据操作,如连接(JOIN)、子查询(subquery)、并集(UNION)等,以执行复杂的业务逻辑和数据分析。

  6. 条件筛选:在多表查询中,可以通过在 WHERE 子句中设定条件来筛选跨多个表的数据,以满足特定的查询需求。

多表之间的数据查询主要有下面三种方式:
1.内连接查询
2.左外连接查询
3.右外连接查询

还有一些延伸的的方式,作简单介绍

1.1内连接查询(Inner join)

内连接用来查询两个或多个表中存在匹配关系的记录。仅返回在连接的表之间具有匹配值的行。既然是匹配关系,那也就是说内连接用于查找两个表中都有的记录,比如第一个表中有十行,那么响应的第二个表中也应该有十行与之对应。
语法格式:

select columns
from table1 
inner join table2 
on table1.column_name = table2.column_name;

最后一句解释:
ON table1.column_name = table2.column_name 是 SQL 查询中的一个语句片段,通常用在 JOIN 操作中,用来指定两个数据表之间的连接条件。这个语句的意思是,系统在连接 table1table2 这两张表时,会按照两张表中的指定列 column_name 的值是否相等来确定哪些行之间应该被连接。

我们看一个具体的例子:
我们有两张表,表一Students:
在这里插入图片描述
表二ScoreList:

在这里插入图片描述

用下列程序:

select ScoreList.StudentId,StudentName,Gender ,Csharp
from ScoreList 
inner join Students on Students.StudentId=ScoreList.StudentId
where CSharp>80

得到结果:
在这里插入图片描述
就是说我们可以以两个表上相同的列为桥梁将两个表中我们想要的数据合到一张表上,而且两张表无先后位置。

1.2 左外连接 (LEFT JOIN):

左外连接返回左表(FROM 子句中指定的表)的所有记录以及右表中匹配的记录。外连接(左、右、全)用于包含没有匹配的行的情景如果左表的行在右表中没有匹配,则结果集中这些行的右表部分为 NULL。语法:

select columns
from table1 
left join table2 
on table1.column_name = table2.column_name;

比如:table1(左表)是:
在这里插入图片描述
table2(右表)是:
在这里插入图片描述
我们看到右表比左表少了一行,所以自动补上了NULL
在这里插入图片描述

1.3右外连接 (RIGHT JOIN):

右外连接与左外连接对应,返回右表的所有记录以及左表中匹配的记录。如果右表的行在左表中没有匹配,则结果集中这些行的左表部分为 NULL。

select columns
from table1 
right join table2 
on table1.column_name = table2.column_name;

1.4. 全外连接 (FULL OUTER JOIN):

全外连接返回左表和右表中的所有记录。当左表中的行在右表中没有匹配时,或者右表中的行在左表中没有匹配时,结果集会用 NULL 补充。

select columns
from table1 
full outer join table2 
on table1.column_name = table2.column_name;

1.5 交叉连接 (CROSS JOIN):

交叉连接返回两个表中所有可能的行组合。如果第一个表有10行,第二个表有5行,交叉连接的结果将有50行。不常用

select columns
from table1 
cross join table2;

1.6 自连接 (SELF JOIN):

自连接是一种特殊形式的内连接或外连接,表与自身连接。不常用:

SQL Server 中的自连接(SELF JOIN)是一种特殊类型的连接,其中一个表会根据与自身的某些条件关联来进行连接。自连接通常用于处理那些在同一表内部就需要关联查询的情况,比如层级数据、树状结构或是任何需要比较同一个表内两个不同记录的场景。

在自连接中,实际上是把同一个表当作是两个独立的表进行连接操作。虽然物理上只有一个表,但是通过给表使用不同的别名,可以在查询中将其视为两个不同的表。

举个自连接的例子,假设我们有一个员工表 Employees,其中包含以下列:

  • EmployeeID (员工ID) - EmployeeName (员工姓名) - ManagerID (上级经理的员工ID)

在这种情况下,ManagerID 是这个员工的上级经理的 EmployeeID。我们想要列出所有员工及其对应的上级经理姓名。在这里,我们可以使用自连接来实现这个目标。

示例 SQL 查询如下:

selecte1.EmployeeName as EmployeeName,e2.EmployeeName as ManagerName
fromEmployees e1
left join Employees e2on e1.ManagerID = e2.EmployeeID;

在这个查询中,Employees 表以 e1e2 两个不同的别名存在。我们在查询中使用 left join 自连接这个表,通过 e1.ManagerID = e2.EmployeeID 条件来找到员工的上级经理。e1 代表的是员工,而 e2 代表的是经理。left join 确保了即使某些员工没有上级经理(ManagerIDNULL),他们的信息也会被列出。

结果将是一个两列的列表,第一列是员工的姓名,第二列是他们经理的姓名。如果某个员工没有经理,对应的 ManagerName 列会显示为 NULL

1.7 子查询:

子查询可以在另一个查询中使用,它可以从一个表中筛选数据,然后用来与另一个表比较或操作。

select columns
from table1
where column_name IN (SELECT column_name FROM table2 where condition);

二、分组查询

2.1 分组查询

在SQL Server Management Studio(SSMS)中,分组查询主要通过group by 子句实现。group by子句通常与聚合函数(如COUNT()SUM()AVG()MAX()MIN()等)一起使用,可以对一组行中的某些列进行分组,并对每个组进行聚合计算。

以下是一个简单的分组查询示例,假设有一个名为Sales的表,包含了ItemQuantitySaleDate三个字段:

Sales Table
-------------------------------------
| Item      | Quantity | SaleDate    |
-------------------------------------
| Pen       | 10       | 2023-01-01  |
| Notebook  | 20       | 2023-01-01  |
| Pen       | 5        | 2023-01-02  |
| Eraser    | 15       | 2023-01-02  |
| Notebook  | 30       | 2023-01-03  |
| Pen       | 10       | 2023-01-03  |
| Eraser    | 20       | 2023-01-03  |
-------------------------------------

我们运行以下SQL查询:

select Item, SUM(Quantity) as TotalQuantity
from Sales
group by Item;

这个呢,将返回每个不同物品(Item)的总销售数量(TotalQuantity)。结果如下所示:

Result
------------------------
| Item      | TotalQuantity |
------------------------
| Pen       | 25           |
| Notebook  | 50           |
| Eraser    | 35           |
------------------------

在这个结果中,PenTotalQuantity是25(10+5+10),NotebookTotalQuantity是50(20+30),而EraserTotalQuantity是35(15+20)。

如果我们还想过滤出总销售数量大于30的物品,那就可以使用having子句,如下所示:

select Item, SUM(Quantity) as TotalQuantity
from Sales
group by Item
having SUM(Quantity) > 30;

此查询将返回总销售数量超过30的物品的列表。结果集将会是:

Result
------------------------
| Item      | TotalQuantity |
------------------------
| Notebook  | 50           |
| Eraser    | 35           |
------------------------

在这个结果中,只有NotebookEraser显示在列表中,因为它们的TotalQuantity值分别是50和35,都大于30。

2.2 查询重复数据

在SQL Server中,要筛选出重复的数据,可以使用group byhaving子句结合聚合函数。例如,我么想要找出Sales表中Item字段重复的记录,可以使用以下查询:

select Item, COUNT(*)
FROM Sales
GROUP BY Item
HAVING COUNT(*) > 1;

这个查询是按Item分组的,然后数每个分组的行数。having count(*) > 1这个条件将筛选出那些行数大于1的分组,也就是那些有重复Item值的记录。
在SQL中,COUNT(*)是一个聚合函数,用来计算某个结果集中的行数。它会包含所有的行,包括NULL值在内。这里使用COUNT(*) 来找出Sales表中Item字段重复的记录。这里COUNT(*) 计算的是每个Item分组内的记录数,然后使用having COUNT(*) > 1 来过滤,只显示那些出现了不止一次的Item,这样就能找出重复的记录。

现在假设Sales表的内容如下所示:

Sales Table
-------------------------------------
| ID   | Item      | Quantity | SaleDate    |
-------------------------------------
| 1    | Pen       | 10       | 2023-01-01  |
| 2    | Notebook  | 20       | 2023-01-01  |
| 3    | Pen       | 5        | 2023-01-02  |
| 4    | Eraser    | 15       | 2023-01-02  |
| 5    | Notebook  | 30       | 2023-01-03  |
| 6    | Pen       | 10       | 2023-01-03  |
-------------------------------------

运行上述查询后,会得到如下结果:

Result
------------------------
| Item      | (No column name)  |
------------------------
| Pen       | 3                 |
| Notebook  | 2                 |
------------------------

这个结果中显示了PenNotebook是重复的,因为它们各自出现了3次和2次。

(不常用)如果我们还想要获取到具体的重复记录,可以使用子查询或者with关键字(CTE,也就是公用表达式)来获取这些数据。以下是使用子查询的例子:

select *
from Sales
where Item in (select Itemfrom Salesgroup by Itemhaving COUNT(*) > 1
);

这个查询返回了Item字段重复的所有记录。

而下面是使用CTE的例子:

with DuplicateItems as (select Item, COUNT(*) AS Countfrom Salesgroup by  Itemhaving COUNT(*) > 1
)
select s.*
from Sales s
Inner join DuplicateItems d on s.Item = d.Item;

这个查询使用CTE先找出重复的Item,然后通过内连接返回Sales表中相关的所有记录。

运行上述任一查询后,你将会得到包含重复Item所有数据的结果集,它们都包含ItemPenNotebook的记录。

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

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

相关文章

通信、机房、IT运维、云计算类可视化大屏,大气直观漂亮。

通信、机房、IT运维和云计算可视化大屏的作用主要体现在以下几个方面: 实时监控:可视化大屏可以实时显示通信、机房、IT运维和云计算系统的运行状态和性能指标。通过图表、仪表盘、地图等可视化元素,可以直观地展示各种数据,如网…

【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…

初识node.js(使用)

文章目录 项目目录介绍和运行流程1.index.html&#x1f447;2.整个项目的核心入口文件其实是main.js3.App.vue 组件化开发 和 根组件普通组件的注册1.局部注册2.全局注册 综合案例 项目目录介绍和运行流程 1.index.html&#x1f447; <!DOCTYPE html> <html lang&quo…

数据结构:3_栈和队列

栈和队列 一.栈 1. 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。**栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#x…

RabbitMQ系列之交换机的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之交换机的使用》。&#x1f3af;&…

【C++】list容器功能模拟实现

介绍 上一次介绍了list队容器的迭代器模拟&#xff0c;这次模拟实现list的简单功能&#xff0c;尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。 list容器需要接纳所有类型的数据&#xff0c;因此&#xff0c;结构设置与迭代器设置同理&#xff0c;需要引入结点&…

java web mvc-04-Apache Wicket

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

Confluence6+mysql5.7破j安装避坑详细记录

目录 一、前言 二、下载与安装 1、版本和安装环境 2、安装数据库 3、配置数据库 4、安装confluence 三、Pj confluence 1、选择语言和产品安装 2、Pj 3、上传mysql驱动 4、重启Confluence服务继续安装 四、Confluence重启卸载方法 重启方法 方法一 方法二 卸载…

no space left on device

异常 在运行中容器异常中止,重新启动后出现的问题 [rootdxx xxx]# docker start 29258e5b52c9 Error response from daemon: write /var/lib/docker/containers/29258e5b52c9053ffa91afba5a3e4fc8519e7c99c7a184466bcdf236653bf10a/hash3291289824: no space left on device Er…

【Linux】Linux系统编程——pwd命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd&#xff08;Print Working Directory&#xff09;命令用于显示用户当前工作目录的完整路径。这是一个常用的命令&#xff0c;帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…

动静态库的理解、制作、使用。

一.动静态库的理解。 1.什么是库&#xff1f; 代码是无穷无尽的&#xff0c;当程序猿在写一些项目时&#xff0c;未必所有代码亲历亲为&#xff0c;他们可以在网上寻找大佬写过的一些有关需求的代码&#xff0c;这些代码可以让他们拿过来直接使用&#xff0c;而省去了许多精力…

android使用相机 intent.resolveActivity returns null

问题 笔者使用java进行android开发&#xff0c;启动相机时 intent.resolveActivity returns null takePictureIntent.resolveActivity(getPackageManager()) null详细问题 笔者使用如下代码启动相机 // 启动相机SuppressLint("LongLogTag")private void dispatc…

大数据开发之Spark(RDD弹性分布式数据集)

第 1 章&#xff1a;rdd概述 1.1 什么是rdd rdd&#xff08;resilient distributed dataset&#xff09;叫做弹性分布式数据集&#xff0c;是spark中最基本的数据抽象。 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 1.1…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题&#xff1f; 我们该如何改过来&#xff1f; 很简单 点击文件-设置 点击Python集成工具&#xff0c;在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录&#xff0c;如下图【更新】记录&#xff0c;表示本次提交到git本地需要退回/删除的操作&#xff1a; 选中项目&#xff0c;右键点击【git】——>【Show History】——>…

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略&#xff1a;增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理&#xff1a; 由于只有答案部分是我们期望模型来进行回答的内容…

2024.1.24 GNSS 学习笔记

1.伪距观测值公式 2.载波相位观测值公式 3.单点定位技术(Single Point Positionin, SPP) 仅使用伪距观测值&#xff0c;不使用其他的辅助信息获得ECEF框架下绝对定位技术。 使用广播星历的轨钟进行定位&#xff0c;考虑到轨钟的米级精度&#xff0c;所以对于<1米的误差&…

【Android】在WSA安卓子系统中进行新实验性功能试用与抓包(2311.4.5.0)

前言 在根据几篇22和23的WSA抓包文章进行尝试时遇到了问题&#xff0c;同时发现新版Wsa的一些实验性功能能优化抓包配置时的一些步骤&#xff0c;因而写下此篇以作记录。 Wsa版本&#xff1a;2311.40000.5.0 本文出现的项目&#xff1a; MagiskOnWSALocal MagiskTrustUserCer…

【刷题】 leetcode 面试题 01.06 字符串压缩

字符串压缩 字符串压缩思路一&#xff08;双指针顺畅版&#xff09;思路二&#xff08;sprintf函数巧解版&#xff09; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 字符串压缩 来看题目&#xff1a; 根据题目…

【华为 ICT HCIA eNSP 习题汇总】——题目集4

1、&#xff08;多选&#xff09;网络中出现故障后&#xff0c;管理员通过排查发现某台路由器的配置被修改了&#xff0c;那么管理员应该采取哪些措施来避免这种状况再次发生&#xff1f; A、管理员应该通过配置 ACL 来扩展只有管理员能够登录设备 B、管理员应该在路由的管理端…