SQL-自连接和分组

一.介绍

这是一道面试题,看似简单,其实还是有一定技巧的,分析一下可以复习一下SQL查询的一些重要概念。

二.问题

给定一个包含四列的员工表

  • ID
  • Name
  • Salary
  • ManagerId

要求

获取经理姓名、每个经理的员工数量以及每个团队的总工资。

三.设置表格和初始数据

根据问题设置表格

USE [TestDB]
GO/****** Object:  Table [dbo].[Employees]    Script Date: 5/28/2021 7:42:51 PM ******/   SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE TABLE [dbo].
[Employees]([Id] [int] IDENTITY(1, 1) NOT NULL,[Name] [nvarchar](max) NOT NULL,[Salary] [int] NOT NULL,[ManagerId] [int] NOT NULL,CONSTRAINT [PK_dbo.Employees] PRIMARY KEY CLUSTERED    ([Id] ASC   )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON[PRIMARY]   ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

插入初始数据

insert dbo.Employees
Values  ('Greg', 100000, 1),('George', 150000, 1),('Helen', 130000, 1),('Tom', 120000, 2),('Kevin', 110000, 2),('David', 120000, 3),('Geek', 110000,3),('Tesla', 120000,3)

结果是

四.解决问题

1.SQL 中的自连接

这是一个自连接问题。自连接是一种常规连接,但表与自身连接。我们在下面回顾了连接类型;

不同类型的 SQL JOIN

以下是 SQL 中不同类型的 JOIN,

  • (INNER)JOIN。 返回两个表中具有匹配值的记录
  • LEFT(OUTER)JOIN。 返回左表中的所有记录以及右表中匹配的记录
  • RIGHT(OUTER)JOIN。 返回右表中的所有记录以及左表中匹配的记录
  • FULL(OUTER)JOIN。 当左表或右表有匹配项时,返回所有记录

我们进行自连接,

  • 左边的表是员工表 - dbo.Employees e,
  • 右边的表是经理表 - dbo.Employees m,
  • 其中 Employee 表的 ManagerId == Manager 表的 Id (EmployeeId)
SELECT m.Name [Manager Name], e.Id [Employee ID], e.salary [Employee Salary]
FROM dbo.Employees e JOIN dbo.Employees m
ON e.ManagerId = m.Id

我们得到了结果,

其中经理姓名是我们需要的,员工 ID 和薪水是从员工表(左)中的 SQL SELECT 中进行计数和求和的。

交叉连接

它返回连接表中行的笛卡尔积。换句话说,它将生成将第一个表中的每一行与第二个表中的每一行组合在一起的行。

例如。 我有两张表,学生表和员工表。交叉连接结果将是 45(5*9)

2.SQL 中的 Group by

为了获得计数和总数,我们需要使用Group by子句,

SQL GROUP BY 语句
GROUP BY语句将具有相同值的行分组为汇总行,例如“查找每个国家/地区的客户数量”。

GROUP BY语句通常与聚合函数( COUNT()、MAX()、MIN()、SUM()、AVG() )一起使用,按一列或多列对结果集进行分组。

SELECT m.Name [Manager Name], count(m.Id) [team amount], sum(e.salary) [Total Salary]
FROM dbo.Employees e JOIN dbo.Employees m
ON e.ManagerId = m.Id
group by m.name

我们对 m.name 进行分组,并使用聚合函数 Count() 和 Sum()。

备注

当我们选择 m.name 时,我们必须按 m.nam 分组;否则,假设我们按 m.id 分组

SELECT m.Name [Manager Name], count(m.Id) [team amount], sum(e.salary) [Total Salary]
FROM dbo.Employees e JOIN dbo.Employees m
ON e.ManagerId = m.Id
group by m.id

然后我们收到所选 m.name 的错误消息,


消息 8120,级别 16,状态 1,第 1 行,

列“dbo.Employees.Name”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

五.概括

本文讨论了 SQL 查询的主要特性 - JOI 和 Group By。

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

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

相关文章

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码,中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to 然后我用终端敲ssh的命令连接,结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish connectio…

前端表格控件:打造自动化报表的高效工具

摘要 在现代Web应用中,自动化报表的生成对于数据分析和业务决策至关重要。前端表格控件提供了一种直观且强大的方式,使得报表的创建、展示和交互变得更加容易。本文将探讨如何利用前端表格控件实现自动化报表的设计、生成和优化。 引言 自动化报表可以…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

分布式日志分析系统--ELK

文章目录 ELK概述ELK主要特点ELK应用架构 Elasticsearch原理JSON格式倒排索引 ES与关系型数据库ES相关概念ES安装说明1.环境初始化2.优化系统资源限制配置3.编辑ES服务文件elasticsearch. yml 优化ELK集群安装脚本scp的使用集群安装成功 Shell命令API使用创建索引创建Type创建分…

Spring Cache常用注解

依赖代码如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 常用注解详解 1. Cacheable 作用&#xff1a;主要用于配置方法&#xff0c;使其…

真实体验!猫咪长肉选这些主食罐!猫生、希喂、黑夜传说详细测评

我的猫咖店铺开在高校附近&#xff0c;顾客以学生为主&#xff0c;也有很多养猫人士会到店里来&#xff0c;和我交流选粮经验。不少铲屎官都羡慕我店里的猫咪体格健壮&#xff0c;希望能介绍一些能够帮助猫咪长肉的主食罐头。那么今天我就选择了三款高肉含量的猫罐头进行测评&a…

【JLINK】J-link Commander

官方参考文档&#xff1a;J-Link Commander - SEGGER Wiki 一、运行 打开windows命令行窗口&#xff0c;找到有jlink.exe文件的地方&#xff0c;直接输入jlink.exe即可运行 二、常用命令 输入命令时候&#xff0c;大小写不影响 Command (long)Command (short)ExplanationExa…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十四)-租云服务器及配环境、docker基本命令

主要介绍了租云服务器和docker配置、基本命令&#xff01;&#xff01;&#xff01; 文章目录 前言 一、云平台 二、租云服务器及安装docker 1.阿里云 2.安装docker 三、docker命令 将当前用户添加到docker用户组 镜像&#xff08;images&#xff09; 容器(container) 四、实战…

在linux运维中为什么第一道防线是云防火墙,而不是waf

在Linux运维和云计算环境中&#xff0c;第一道防线通常是云防火墙&#xff08;Cloud Firewall&#xff09;&#xff0c;而不是Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因&#xff1a; 1…

vue elementui 上传视频 以及上传视频失败重新上传没反应的处理方法

<template><el-drawertitle"上传视频"size"50%":visible.sync"drawer":direction"direction"><div class"content"><div class"upload-box" v-if"!secondStep"><!--on-exce…

艾体宝干货 | 如何分析关键网络性能指标?持续接收样品试用申请!

网络性能是企业顺利运营的重要基础&#xff0c;而Allegro流量分析仪作为一款强大的网络性能分析工具&#xff0c;为企业提供了深入了解网络运行状况的途径。在本文中&#xff0c;我们将探讨如何利用Allegro 流量分析仪分析关键网络性能指标&#xff0c;以优化网络性能、提高安全…

AI来了,这4个方面,是我们普通人的赚钱机会

在2024年&#xff0c;AI不仅改变了我们的生活方式,更为我们带来了前所未有的赚钱机会。今天&#xff0c;让我们一起探索如何利用AI赚钱的几种方法。 通过AI做自由职业 还记得小时候大人们常说"一技在身,走遍天下"吗?在AI时代,这句话变得更加真实。自由职业意味着你…

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后&#xff0c;Nginx配置域名发送https请求时&#xff0c;/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误&#xff1a; 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的&#xff0c;后端是根据后端服…

金融行业缓存建设历程

本文转载与中原银行分布式缓存平台建设历程及实践经验中原银行分布式缓存平台历经三代建设&#xff0c;实现了高效稳定智能的缓存服务&#xff0c;提升了系统性能与资源利用率&#xff0c;降低了运维难度&#xff0c;强有力的支撑金融业务。https://mp.weixin.qq.com/s/3NgLvAb…

不得不安利的程序员开发神器,太赞了!!

作为一名程序员&#xff0c;你是否常常为繁琐的后端服务而感到头疼&#xff1f;是否希望有一种工具可以帮你简化开发流程&#xff0c;让你专注于创意和功能开发&#xff1f;今天&#xff0c;我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

什么是 HTTP/3?HTTP/3 为何席卷全球?HTTP/3 中有什么新内容?为什么需要它?

超文本传输​​协议 ( HTTP ) 是互联网的基石&#xff0c;有助于加载网页、流式传输视频以及为您最喜爱的应用程序获取数据。 去年 &#xff0c;负责定义互联网技术的组织 互联网工程任务组 ( IETF )对该协议的新版本 HTTP/3 进行了标准化。自那时起&#xff0c;HTTP/3 和相关…

C语言分支结构作业

作业 输入你的身高和体重&#xff0c;测试你的健康状况。 计算bmi的值&#xff0c; bmi &#xff08;体重/身高的平方) 如果bmi 小于18.5&#xff0c;则显示“偏瘦&#xff0c;注意加强营养” 如果bmi 在18.5和23.9之间&#xff0c;则显示“体重指数良好&#xff0c;注意保持…

Linux基本功能

Linux 操作系统&#xff0c;作为开源社区的明星之一&#xff0c;以其稳定性、安全性和灵活性在全球范围内得到广泛应用。 1. 多用户和多任务支持 Linux 是一个真正的多用户系统&#xff0c;允许多个用户同时登录并在同一时间内运行多个程序。每个用户拥有自己的账户和权限&…

Javascript前端面试基础(九)

浏览器缓存 浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时&#xff0c;获取缓存的流程如下 先根据这个资源的一些http header判断它是否命中强缓存&#xff0c;如果命中则直接从本地获取缓存资源&#xff0c;不会发请求到服务器;当强缓存没有命中时&#xff0c;客户…