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

news2024/11/18 12:16:17

文章目录

  • 一、多数据表之间的数据查询
    • 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 查询如下:

select
  e1.EmployeeName as EmployeeName,
  e2.EmployeeName as ManagerName
from
  Employees e1
left join Employees e2
  on 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 Item
    from Sales
    group by Item
    having COUNT(*) > 1
);

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

而下面是使用CTE的例子:

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

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

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

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

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

相关文章

ai伪原创生成器app,一键生成原创文章

近年来,随着人工智能技术的飞速发展,AI伪原创生成器App已经成为了许多写手和创作者们的新宠。这款AI伪原创生成器App以其一键生成原创文章的快速便捷性,正在引起广泛的关注和使用。下面跟随小编一起来了解下吧! 随着互联网的普及&…

两千字讲明白java中instanceof关键字的使用!

写在开头 在过往的内容中,我们讲了不少的Java关键字,比如final、static、this、super等等,Java中的关键字非常之多,下图是整理的关键字集合 而我们今天要学习的就是其中的instanceof关键字! instanceof的定义 inst…

共享wifi项目到底能不能做?

如今,互联网已经渗透到我们生活的方方面面,人们对WiFi的需求越来越大,已经成为人们不可或缺的一部分。在这样的背景下,共享WiFi项目应运而生,作为近年来兴起的创业选择,成为了越来越多创业者追逐的热门项目…

5分钟做自己的微信红包封面

文章目录 怎么制作自己的红包封面?开通红包封面的要求如下:收费情况制作具体网站:https://chatapi.onechat.fun/register?affYoU6 提交审核logo封面、挂件、气泡证明材料 发放红包封面其他 怎么制作自己的红包封面? 开通红包封面…

秒级弹性!探索弹性调度与虚拟节点如何迅速响应瞬时算力需求?

作者:吴昆 前言 在前面的文章《弹性调度助力企业灵活应对业务变化,高效管理云上资源》中,我们介绍了阿里云容器服务 ACK 弹性调度为了帮助客户解决在使用云上弹性资源时,面对的“难以差异化控制业务资源使用量,缩容时…

C语言第七弹---循环语句

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 循环语句 1、while循环1.1、if和while的对比1.2、while语句的执行流程1.3、while循环的实践1.4、练习 2、for循环2.1、语法形式2.2、for循环的执行流程2.3、for循…

架构篇16:高性能NoSQL

文章目录 K-V 存储文档数据库列式数据库全文搜索引擎小结关系数据库经过几十年的发展后已经非常成熟,强大的 SQL 功能和 ACID 的属性,使得关系数据库广泛应用于各式各样的系统中,但这并不意味着关系数据库是完美的,关系数据库存在如下缺点。 关系数据库存储的是行记录,无法…

使用Java编写RESTful Web服务

RESTful Web服务是一种基于HTTP协议的软件架构风格,它使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来执行不同的操作,并使用统一的接口来访问和操作资源。在Java中,有多种框架可用于编写RESTful Web服务&#xff0…

Typecho后台无法登录显示503 service unavailable问题及处理

一、Typecho 我的博客地址:https://www.aomanhao.top 使用老薛主机动态Typecho博客框架handsome主题的搭配,文章内容可以异地网页更新,可以听后台背景音乐,很好的满足我的痛点需求,博客部署在云端服务器访问响应较快…

阿里云4核8G云服务器价格、带宽及系统盘费用

阿里云服务器4核8g配置云服务器u1价格是955.58元一年,4核8G配置还可以选择ECS计算型c7实例、计算型c8i实例、计算平衡增强型c6e、ECS经济型e实例、AMD计算型c8a等机型等ECS实例规格,规格不同性能不同,价格也不同,阿里云服务器网al…

Steam幻兽帕鲁搭建教程,如何选择服务器

如何选购服务器 大家可以根据自己的需求选购,大家最好选用物理服务器,可以找我参考一下。1到6人建议使用16H32G的20带宽的。12人以上建议大家使用E5的CPU内存64G的带宽50起步的。大家在选择服务器商的时候一定要选择正规的拥有资质的,这样售…

RabbitMQ系列之交换机的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ系列之交换机的使用》。🎯&…

ntp时间适配服务器和ssh免密登录

1.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 服务端server向阿里时间服务器进行时间同步 第一步:定位服务端server #安装软件 [rootserver ~]# yum install chrony -y # 编辑配置文件,定位第3行,修改…

Win10添加网络打印机后无法打印的解决方法

在Win10电脑中,用户成功添加了网络打印机,却遇到了无法打印的问题,导致用户不能顺利完成打印任务。以下小编分享三种简单的方法,帮助大家轻松解决Win10网络打印机已添加但无法打印的问题,解决后用户就能通过网络打印机…

【AI大模型】WikiChat超越GPT-4:在模拟对话中事实准确率提升55%终极秘密

WikiChat,这个名字仿佛蕴含了无尽的智慧和奥秘。它不仅是一个基于人工智能和自然语言处理技术的聊天机器人,更是一个能够与用户进行深度交流的智能伙伴。它的五个突出特点:高度准确、减少幻觉、对话性强、适应性强和高效性能,使得…

pnpm 源不对 Will retry in 10 seconds. 2 retries left.

现象 由于使用npm config set registry 切换淘宝源时,把地址打错了。 后面使用pnpm install 时出现 此时无论我怎么使用npm config set registry 或者pnpm config set registry 切回正确的源均没有效果。 解决 在其他用npm的项目运行一下npm i 再运行pnpm i 即…

生产问题(十四)K8S抢占CPU导致数据库链接池打爆

一、引言 线上一天出现了两次数据库连接失败的大量报错,一开始以为是数据库的问题,但是想了想如果是数据库的问题,应该会有大量的应用问题 具体分析之后,发现其实是容器cpu出现了Throttled,导致大量线程阻塞 二、分析 …

UDS Flash刷写流程介绍

一、刷写流程介绍 1.1刷写包含以下三个步骤:预编程,编程,后编程 1.2预编程步骤 此步骤是保证能够正常进入编程(10 02)会话下。 (1)如果无特殊要求,只保证刷写能够正常进行&#x…

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别:都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …

嵌入式-stm32-江科大-EXTI外部中断

一:EXTI外部中断(external interrupt) 1.1 STM32 中断系统 中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前的程序,转而去处理中断程序,…