2023年SQL大厂高频实战面试题(详细解析)

news2024/11/26 4:43:08

大家好,我是宁一。

已经连续四个周没有休息了,最近主业、副业都是忙碌的巅峰期,晚上11点下班回家,再写课写到凌晨两点。

连续一个多月连轴转,每天最大的愿望,就是睡足觉。

这一阶段终于忙完了~继续来更新SQL面试题啦~

题目五:

175. 组合两个表(简单)

现在有两个表:

Person表:包含 PersonId、

姓LastName、名FirstName的信息。

+----------+----------+-----------+| personId | lastName | firstName |+----------+----------+-----------+|    1     | Wang     | Allen     ||    2     | Alice    | Bob       |+----------+----------+-----------+

Address表:包含AddressId、PersonId、城市City、州State的信息。

+-----------+----------+---------------+------------+| addressId | personId | city          | state      |+-----------+----------+---------------+------------+|   1      |    2     | New York City | New York   ||    2     |    3     | Leetcode      | California |+-----------+----------+---------------+------------+

编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空null。

结果示例:​​​​​​​

+-----------+----------+---------------+----------+| firstName | lastName | city          | state    |+-----------+----------+---------------+----------+| Allen     | Wang     | Null          | Null     || Bob       | Alice    | New York City | New York |+-----------+----------+---------------+----------+

解题思路:

这道题很简单,主要考察是就是JOIN连接的知识点,到底用左连接还是右连接。

注意题目中的这句话“如果 personId 的地址不在 Address 表中,则报告为空  null ”。

空值出现在 Address 表中,所以我们把Person表放在左边、Address 表放在右边,使用左连接left join。​​​​​​​

SELECT firstName,lastName,city,stateFROM Person pLEFT JOIN Address aON p.personId = a.personId;

想要自己电脑本地测试,可以用这个快速创建数据表语句:​​​​​​​

-- 创建表Person CREATE TABLE Person(personId INT,LastName VARCHAR(10),FirstName VARCHAR(10));-- 插入语句INSERT INTO Person VALUES(1,'Wang','Allen'),(2,'Alice','Bob');CREATE TABLE Address(addressId INT,personId INT,City VARCHAR(20),state VARCHAR(20));-- 插入语句INSERT INTO Address VALUES(1,2,'New York City','New York'),(2,3,'Leetcode','California');

知识点:Join连接

多张数据表联合查询,需要用到JOIN连接,JOIN连接分为好几种:

INNER JOIN:内连接,也可以只写JOIN。只有进行连接的两个表中,都存在与连接标准相匹配的数据才会被保留下来,相当于两个表的交集。如果前后连接同一张表,也叫自连接。

LEFT JOIN: 左连接,也称左外连接。操作符左边表中符合 WHERE 子句的所有记录将会被返回,操作符右边表中如果没有符合 ON 后面连接条件的记录时,那么从右边表指定选择的列的值将会是 NULL。

RIGHT JOIN: 右连接,也称右外连接。会返回右边表所有符合 WHERE 语句的记录。左表中匹配不上的宇段值用 NULL 代替。

*  FULL JOIN:全连接,返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定宇段没有符合条件的值的话,那么就使用 NULL 替代。

题目六:

178. 分数排名(中等)

现有一个成绩表: Scores​​​​​​​

+----+-------+| id | score |+----+-------+| 1  | 3.50  ||  2 | 3.65  || 3  | 4.00  || 4  | 3.85  || 5  | 4.00  || 6  | 3.65  |+----+-------+

编写 SQL 查询,对分数进行从高到低排序,如果两个分数相等,那么两个分数的排名应该相同。要求排名应该是连续的,中间不要有空缺的数字。

查询结果格式如下所示。​​​​​​​

+-------+------+| score | rank |+-------+------+| 4.00  | 1    || 4.00  | 1    || 3.85  | 2    || 3.65  | 3    || 3.65  | 3    || 3.50  | 4    |+-------+------+

解题思路:

这道题主要考察的是“相关子查询”,在相关子查询中,子查询是在主查询每一条记录层面上依次进行的,子查询依赖主查询。

这道题我们先来给分数做个倒序排序,将rank列写成子查询,计算出大于等于当前外查询分数的去重个数,这个数量就是排名。

第一步:先来降序排列分数。​​​​​​​

SELECT a.Score AS '成绩'FROM Scores aORDER BY a.score DESC

第二步:将select后面,“排名”列写成子查询。计算出大于等于当前外查询分数的去重个数,这个数量就是排名。​​​​​​​

SELECT a.Score AS '成绩',    (SELECT COUNT(DISTINCT score)    FROM Scores    WHERE score >= a.score) AS '排名'FROM Scores aORDER BY a.score DESC

想要自己电脑本地测试,可以用这个快速创建数据表语句:​​​​​​​

-- 创建表CREATE TABLE Scores(Id INT,score  DECIMAL(10,2));-- 插入语句INSERT INTO Scores VALUES(1,3.50),(2,3.65),(3,4.00),(4,3.85),(5,4.00),(6,3.65);

题目七:

183. 从不订购的客户(简单)

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

Customers 表:​​​​​​​

+----+-------+| Id | Name  |+----+-------+| 1  | Joe   || 2  | Henry || 3  | Sam   || 4  | Max   |+----+-------+

Orders 表:​​​​​​​

+----+------------+| Id | CustomerId |+----+------------+| 1  | 3          || 2  | 1          |+----+------------+

例如给定上述表格,你的查询应返回:​​​​​​​

+-----------+| Customers |+-----------+| Henry     || Max       |+-----------+

解题思路:

这道题考察的是子查询,我们想要查出没有订购过的客户,就先在订单表Orders中,查出已经订购过的客户,再在客户表Customers中排除掉这些客户,就很容易知道谁从未订购过。

第一步:先在订单表Orders中,查出已经订购过的客户​​​​​​​

SELECT customeridFROM orders

第二步:使用 NOT IN 查询不在此列表中的客户。​​​​​​​

SELECT name AS '未订购客户'FROM customersWHERE id NOT IN(SELECT customeridFROM orders);

想要自己电脑本地测试,可以用这个快速创建数据表语句:​​​​​​​

-- 创建表CREATE TABLE Customers(Id INT,Name VARCHAR(10));-- 插入语句INSERT INTO Customers VALUES(1,'Joe'),(2,'Henry'),(3,'Sam'),(4,'Max');CREATE TABLE Orders(Id INT,CustomerId INT);-- 插入语句INSERT INTO Orders VALUES(1,3),(2,1);

题目八:

184. 部门工资最高的员工(中等)

现在有两个表,员工信息表Employee 和部门表Department。

编写SQL查询,查找每个部门中薪资前三的员工。按任意顺序返回结果表。

Employee 表:​​​​​​​

+----+--------+--------+--------------+| id | name   | salary | departmentId |+----+--------+--------+--------------+| 1  | Joe    | 85000  |   1          || 2  | Henry  | 80000  |   2          || 3  | Sam    | 60000  |   2          || 4  | Max    | 90000  |   1          || 5  | Janet  | 69000  |   1          || 6  | Randy  | 85000  |   1          || 7  | Will   | 70000  |   1          |+----+---------+---------+------------+

Department 表:​​​​​​​

+------+---------+| id   | name    |+------+---------+| 1    |   IT    || 2    |   Sales |+------+---------+

输出实例:

+------------+----------+--------+| Department | Employee | Salary |+------------+----------+--------+| IT         | Jim      | 90000  || Sales      | Henry    | 80000  || IT         | Max      | 90000  |+------------+----------+--------+

解题思路:

这道题考察的是表连接和子查询。

我们先把部门分组,查出每个部门对应的最高工资。再将这个查询结果,放在Where语句的后面,结合IN语句,查询部门名字和工资的关系。

要注意的是,一个部门可能有多个员工同时拥有最高工资,所以在子查询中不要包含雇员名字的信息。

第一步:先在员工表Employee中,对 DepartmentId 字段分组,得到每个部门工资的最大值。

SELECT DepartmentId, MAX( Salary )FROM EmployeeGROUP BY DepartmentId

第二步

再通过DepartmentId 字段连接员工表Employee 和部门表Department,连接完成后,根据上一步查出的部门ID(DepartmentId)以及对应的最高工资,查找所有对应的所有员工的名字。​​​​​​​

SELECT  d.name AS 'Department',  e.name AS 'Employee',  SalaryFROM Employee eJOIN Department dON e.DepartmentId = d.IdWHERE (e.DepartmentId , Salary) IN  (    SELECT DepartmentId, MAX(Salary)    FROM  Employee    GROUP BY DepartmentId  );

想要自己电脑本地测试,可以用这个快速创建数据表语句:​​​​​​​

-- 创建表CREATE TABLE Employee(id INT,name VARCHAR(10),salary INT,departmentId INT);-- 插入语句INSERT INTO Employee VALUES(1,'Joe',70000,1),(2,'Jim',90000,1),(3,'Henry',80000,2),(4,'Sam',60000,2),(5,'Max',90000,1);CREATE TABLE Department(id INT,name VARCHAR(20));-- 插入语句INSERT INTO Department VALUES(1,'IT'),(2,'Sales’);

知识点:

(1)聚合函数:

聚合函数,顾名思义,就是会将数据记录聚合到一起的函数。

比如原先数据库中有100条记录,用聚合函数查询这100条记录中的最大值,最后输出的只有最大值的这一条记录。

常用的聚合函数有:

MAX( )  最大值

MIN( )  最小值

SUM( )  总值

AVG( )  平均值

COUNT( )  记录条数

(2)子查询:

SQL语句可以嵌套,最常见的就是查询语句的嵌套。我们一般称外面嵌套的语句为主查询,里面被嵌套的语句为子查询。

(3)group by分组:​​​​​​​

GROUP BY子句是用来给结果集分组的,通常与聚合函数结合使用。

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

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

相关文章

LongAdder源码【原创+图解+视频讲解】

目录 AtomicLong用法 源码分析 问题 解决 LongAdder用法 高并发下效率测试 原理 源码 add(long x) Striped64的longAccumulate 伪共享 总结 视频讲解: AtomicLong用法 public static void main(String[] args) {AtomicLong i new AtomicLong(0); ​S…

SQL UPDATE 语句

UPDATE 语句用于更新表中的记录。 SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 SQL UPDATE 语法 UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition; 参数说明: table_name:要修改的表名称。column1, colu…

C++:std::thread:线程用法

1&#xff1a;std::thread的基本用法 最简单的 std::thread用法如下&#xff0c;调用 thread将立即同时开始执行这个新建立的线程&#xff0c;新线程的任务执行完毕之后&#xff0c; main()的主线程也会继续执行。 #include<iostream> #include<thread> #include&l…

一致性hash算法和hash算法的区别和使用场景

1、hash算法使用场景 一般情况下hash算法主要用于&#xff1a;负载均衡&#xff08;nginx 请求转发&#xff0c;scg路由等&#xff09;&#xff0c;分布式缓存分区&#xff0c;数据库分库分表&#xff08;mycat&#xff0c;shardingSphere&#xff09;等。 2、hash算法大致实…

网络编程套接字——udp网络编程

目录 一、预备知识 1.端口 2.TCP协议和UDP协议 3.socket编程接口 ①socket 常见API ②sockaddr结构 二、网络编程 1.UDP网络程序 1.1服务器 ①打印 ②socket​编辑 ③bind ④recvfrom ​编辑 1.2客户端 ①sendto 1.3提升通信的花样性 ①将字符串返还 …

Individual Tree Segmentation Method Based on Mobile Backpack LiDAR Point Clouds

Abstract 单棵树 (IT) 分割对于森林管理、支持森林清查、生物量监测或树木竞争分析至关重要。光探测和测距 (LiDAR) 是这方面的一项突出技术&#xff0c;优于竞争技术。航空激光扫描 (ALS) 经常用于森林记录&#xff0c;在树顶表面显示良好的点密度。尽管使用多回波 ALS 可以收…

【虹科云展厅专题】虹科赋能汽车智能化云展厅——车载以太网/TSN专题

虹科2023年开年福利来了&#xff01; 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更…

Unity入门基础语法

物体的坐标 transform.position 世界坐标 transform.localPosition 相对坐标 设置物体的坐标&#xff1a; this.transform.localPosition new Vector3(1.5f, 0, 2.0f); 帧更新 Update()&#xff0c;称为帧更新 此方法会被游戏引擎定时调用&#xff0c;已更新游戏的状态 …

基于Java+SpringBoot+vue+element实现物流管理系统

基于JavaSpringBootvueelement实现物流管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

SQL Studio:一款纯Web化SQL开发工具,关键是免安装还免费!

经常使用SQL工具的开发者对Navicat一定都不陌生。这款软件作为一款全球化的多数据库管理工具&#xff0c;这些年逐步得到全国各地SQLer&#xff08;SQL开发者&#xff09;的关注。 与其他很多外来的软件产品一样&#xff0c;由于价格原因&#xff0c;很多SQLer感觉不太适合适应…

聊聊微服务架构中的用户认证方案

传统的用户认证方案 我们直奔主题&#xff0c;什么是用户认证呢&#xff1f;对于大多数与用户相关的操作&#xff0c;软件系统首先要确认用户的身份&#xff0c;因此会提供一个用户登录功能。用户输入用户名、密码等信息&#xff0c;后台系统对其进行校验的操作就是用户认证。…

S7-1200与三菱FX5U系列PLC通过简单CPU通信功能实现以太网通信的具体方法

S7-1200与三菱FX5U系列PLC通过简单CPU通信功能实现以太网通信的具体方法 前提条件: 西门子S7-1200一侧需要在防护安全中选择连接机制,选择连接机制后在将这里面的“ 允许来自远程对象的PUT/GET通讯访问”这个选项勾选即可。 另外要注意,被访问的DB块要设置为非优化的块访问…

Go第 9 章:map

Go第 9 章&#xff1a;map 9.1 map 的基本介绍 map 是 key-value 数据结构&#xff0c;又称为字段或者关联数组。类似其它编程语言的集合&#xff0c; 在编程中是经常使用到 9.2 map 的声明 9.2.1基本语法 var map 变量名 map[keytype]valuetype 9.2.2map 声明的举例 m…

如果这都不是爱!谷歌承包广告牌喊话苹果;亚马逊裁员的业内分析;李玟VR演唱会明日上线;AMD发布会全程高能;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f3a1; 『Google』再次买下大幅电子广告牌&#xff0c;喊话苹果推动 RCS 发展 一线消息&#xff0c;Google 在拉斯维加斯 Harmon Corner 投放了大型新年主题广告&#xff0c;喊话说服苹果采用 RCS 消息协议&#xff0c;不要在修复像素化的照片和视频上掉链子。视频显示…

YOLOv5-C3模块实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P8周&#xff1a;YOLOv5-C3模块实现&#x1f356; 作者&#xff1a;K同学啊一、前期准备1.设置GPUimport torch from torch import nn i…

数据库,计算机网络、操作系统刷题笔记26

数据库&#xff0c;计算机网络、操作系统刷题笔记26 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

消息队列如何保证消息幂等性消费

1 介绍 我们实际系统中有很多操作&#xff0c;不管你执行多少次&#xff0c;都应该产生一样的效果或返回一样的结果。 例如&#xff1a; 前端页面重复提交选中的数据&#xff0c;服务端只产生对应这个数据的一个反应结果&#xff0c;只保存一次数据。我们发起一笔付款请求&am…

裸露土堆智能识别检测系统 yolo

裸露土堆智能识别检测系统基于pythonyolo计算机视觉深度学习技术&#xff0c;对现场画面中土堆裸露情况进行实时分析检测&#xff0c;若发现画面中的土堆有超过40%部分裸露&#xff0c;则判定为裸露进行抓拍预警。我们选择当下YOLO最新的卷积神经网络YOLOv5来进行裸露土堆识别检…

商用密码安全性评估

商用密码应用安全性评估&#xff08;简称“密评”&#xff09;指在采用商用密码技术、产品和服务集成建设的网络和信息系统中&#xff0c;对其密码应用的合规性、正确性和有效性等进行评估。01办理依据 GM/T0054-2018《信息系统密码应用基本要求》 《信息系统密码测评要求&…

Linux内核内存分配函数kmalloc、kzalloc和vmalloc

在内核环境中&#xff0c;常用的内存分配函数主要有kmalloc、kzalloc和vmalloc这三个。既然这三函数都能在内核申请空间&#xff0c;那么这三个函数有什么区别呢&#xff1f;如何选用呢&#xff1f; kmalloc 首先是kmalloc&#xff0c;其函数原型为 // /include/linux/slab.…