SQL面试常见题目

news2024/11/15 23:05:41

SQL面试常见题目涉及多个方面,包括数据查询、数据操作、表的设计与优化等。以下列举一些经典的SQL面试题目,并附上解析答案:

1. 查询一张表中重复的数据

题目:
给定一个表 employees,包含 id, name, salary 列。如何查找表中重复的 name 值?

SELECT name, COUNT(*) as count FROM employees GROUP BY name HAVING COUNT(*) > 1;

解析:
通过 GROUP BYname 列分组,并使用 HAVING COUNT(*) > 1 来过滤掉那些重复出现的 nameCOUNT(*) 用于统计每个 name 出现的次数。

2. 查找第 N 高的薪水

题目:
如何查询员工表 employees 中的第 N 高的薪水?

SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1 OFFSET N-1;

解析:
使用 ORDER BY salary DESC 按工资降序排序,并通过 LIMIT 1 OFFSET N-1 跳过前 N-1 个记录,直接选出第 N 高的薪水。DISTINCT 确保只返回不同的薪水值。

3. 自连接:查找员工的直属上司

题目:
有一个员工表 employees,其中有 idnamemanager_id,每个员工都有一个直属上司,manager_id 是上司的员工ID。写一个 SQL 查询,找出每个员工及其上司的姓名。

SELECT e.name AS employee_name, m.name AS manager_name

FROM employees e LEFT JOIN employees m ON e.manager_id = m.id;

解析:
通过自连接将员工表连接两次,分别表示员工和上司。LEFT JOIN 确保即使某些员工没有上司(如CEO),也能查询到其信息。

4. 删除表中重复记录,保留一条

题目:
给定一个表 employees,如何删除表中的重复记录,只保留一条?

DELETE FROM employees WHERE id NOT IN ( SELECT MIN(id) FROM employees GROUP BY name, salary );

解析:
SELECT MIN(id) 从每组相同的 namesalary 中选择最小的 id,通过 DELETE 删除那些 id 不在这些最小值中的记录。

5. 查找两个表中共有的数据

题目:
给定两个表 employeesdepartments,如何查找两张表中共有的 name

SELECT e.name FROM employees e INNER JOIN departments d ON e.name = d.name;

解析:
使用 INNER JOINemployeesdepartments 表按 name 进行匹配,返回共有的 name

6. 获取每个部门的最高薪资员工

题目:
给定一个 employees 表(包含 id, name, salary, department_id 列),如何查询每个部门中薪资最高的员工?

SQL 查询:

SELECT e1.department_id, e1.name, e1.salary FROM employees e1 WHERE e1.salary = ( SELECT MAX(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id ); 

解析:
使用子查询 SELECT MAX(e2.salary) 来获取每个部门的最高薪资,并通过外层查询获取对应的员工信息。

7. 统计表中每个部门的人数

题目:
给定一个员工表 employees,如何统计每个部门的员工数量?

SELECT department_id, COUNT(*) AS employee_count FROM employees

GROUP BY department_id;

解析:
使用 GROUP BY 按部门分组,COUNT(*) 统计每个部门的员工数量。

8. 查询日期范围内的数据

题目:
查询 employees 表中 hire_date2022-01-012022-12-31 之间的员工信息。

SELECT * FROM employees WHERE hire_date BETWEEN '2022-01-01' AND '2022-12-31';

解析:
使用 BETWEEN 语法进行日期范围过滤,确保 hire_date 在指定的时间范围内。

9. 找出工资比上司高的员工

题目:
如何找出工资比直属上司高的员工?

SQL 查询:

SELECT e.name AS employee_name, e.salary AS employee_salary, m.salary AS manager_salary FROM employees e JOIN employees m ON e.manager_id = m.id WHERE e.salary > m.salary;

解析:
通过自连接员工表,分别表示员工和上司,并通过 WHERE 过滤出那些员工工资高于上司工资的记录。

10. 查找连续出现的记录(未懂)

题目:
如何查询表中某个字段连续出现多次的记录?例如,查找某个用户登录连续3天以上的记录。

SQL 查询:

SELECT user_id, login_date FROM ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) - ROW_NUMBER() OVER (ORDER BY login_date) AS grp FROM logins ) t GROUP BY user_id, grp HAVING COUNT(*) >= 3;

 

解析:
使用窗口函数 ROW_NUMBER() 来生成连续行的编号,并通过计算差值将连续登录的记录分为一组,最后通过 HAVING COUNT(*) >= 3 筛选出连续登录超过3天的用户。


这些是SQL面试中一些常见问题的示例及其解答。在面试中,考查的内容通常会根据公司具体业务的不同而有所差异,理解SQL的基础和灵活应用非常重要。

------------------------------------------------------------------------------------------------------------------

11.JOIN

JOIN ON 是 SQL 中用于连接多个表的关键语法,用来根据两个表之间的关联条件组合数据。连接可以是 INNER JOINLEFT JOINRIGHT JOIN 等,ON 子句则定义了表之间的连接条件,通常是通过某个键(如外键)进行匹配。

SELECT e.name, e.salary, e.department_id
FROM employees e
JOIN (
    SELECT department_id, MAX(salary) AS max_salary
    FROM employees
    GROUP BY department_id
) max_salaries
ON e.department_id = max_salaries.department_id AND e.salary = max_salaries.max_salary;

1. JOIN 概述

  • JOIN 是 SQL 用于将两个或多个表中的记录根据某些条件组合在一起的操作。
  • ON 用于指定连接两个表的条件,通常是一个等值匹配。

2. ON 子句的作用

ON 子句的作用是指定连接的条件,告诉 SQL 服务器如何将表之间的记录进行匹配。通常,连接条件基于两个表中的一列或多列,这些列可以是主键和外键,也可以是其他列。

常见的连接条件:
  • 等值连接:使用相等关系匹配两张表的列,如 table1.column = table2.column
  • 非等值连接:也可以使用其他条件,如大于 (>) 或小于 (<)。
  • 多个条件连接:可以使用 ANDOR 来组合多个条件。

3. JOIN ON 语法

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column = table2.column;
  • table1table2 是要连接的两个表。
  • ON 后面的条件是两个表的连接条件,一般是基于某个公共列。

4. JOIN 类型详解

JOIN 的类型不同,决定了如何处理没有匹配记录的情况。下面详细介绍几种常见的 JOIN 类型,以及如何使用 ON 子句。

4.1 INNER JOIN
  • 定义:只返回两个表中满足 ON 条件的匹配记录。如果某一表中的记录没有匹配的记录,则该记录不会出现在结果集中。

  • SQL 示例

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.id;
  • 解释
    这个查询返回所有匹配的员工及其部门信息。如果员工没有部门,则不会出现在结果中。

4.2 LEFT JOIN(或 LEFT OUTER JOIN)
  • 定义:保留左表中的所有记录,即使右表中没有匹配的记录,未匹配的右表字段会显示为 NULL

  • SQL 示例

SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id;
  • 解释
    这个查询会返回所有员工信息,即使某些员工没有部门(department_iddepartments 表中没有匹配),部门列会显示 NULL

4.3 RIGHT JOIN(或 RIGHT OUTER JOIN)
  • 定义:保留右表中的所有记录,即使左表中没有匹配的记录,未匹配的左表字段会显示为 NULL

  • SQL 示例

SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.id;
  • 解释
    这个查询会返回所有部门,即使有些部门没有员工(employees 表中没有匹配的 department_id),这些部门的员工信息会显示为 NULL

4.4 FULL OUTER JOIN
  • 定义:保留两张表中所有记录,无论它们是否有匹配的记录。对于没有匹配的记录,另一表中的值为 NULL

  • SQL 示例

SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.id;
  • 解释
    这个查询会返回所有员工和所有部门。如果员工没有部门或部门没有员工,相关信息将显示为 NULL

5. ONUSING 的区别

JOIN 操作中,有时会看到 ONUSING 的混用。它们的主要区别如下:

  • ON明确地指定两个表之间连接的列,即使列名不同也可以使用。

SELECT e.name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.id;
  • USING只能在列名相同的情况下使用,语法简洁。
SELECT e.name, d.department_name
FROM employees e
JOIN departments d
USING (department_id);
  • 在这个例子中,USING 只适用于 employeesdepartments 表中都有 department_id 且列名一致的情况。

6. 复杂连接条件

ON 子句不仅可以使用等值条件,还可以使用更多复杂的条件来定义连接,比如多个条件组合或非等值连接。

示例:多个条件连接
SELECT e.name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.id AND e.hire_date > '2020-01-01';

解释
除了匹配 department_id 外,还添加了一个 hire_date 条件,筛选入职日期在 2020 年后的员工。

示例:非等值连接
SELECT e.name, p.project_name
FROM employees e
JOIN projects p
ON e.salary > p.budget;

解释
这个查询返回员工工资高于项目预算的所有员工和项目的组合。这里 ON 子句中的条件是非等值的。

7. ONWHERE 的区别

有时候,ONWHERE 都可以用于过滤数据,但它们的作用范围不同:

  • ON 作用于连接表之间的条件,用于连接两个表的匹配。
  • WHERE 则是在连接完成之后对结果集进行进一步过滤。
示例:
-- 使用 ON 进行连接
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id
WHERE e.salary > 5000;

解释
ON 子句处理表连接,WHERE 子句则是对连接后的结果进行过滤,返回工资大于 5000 的员工及其部门。

总结

  • JOIN ON:用于连接多个表,ON 子句定义了表之间的匹配条件。
  • JOIN 类型:包括 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN,决定了如何处理没有匹配的记录。
  • ON 子句的灵活性:不仅可以用于等值连接,还可以使用复杂条件进行多表关联。

JOIN ON 是 SQL 中的一个核心概念,理解不同类型的 JOINON 的用法可以帮助你在处理复杂的多表查询时选择合适的策略。

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

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

相关文章

大型语言模型(Large Language Models)的介绍

背景 大型语言模型&#xff08;Large Language Models&#xff0c;简称LLMs&#xff09;是一类先进的人工智能模型&#xff0c;它们通过深度学习技术&#xff0c;特别是神经网络&#xff0c;来理解和生成自然语言。这些模型在自然语言处理&#xff08;NLP&#xff09;领域中扮…

丢失照片/消息/文件,当发现没有备份 Android 手机数据时急救方法

当人们发现他们没有备份 Android 手机数据时&#xff0c;通常为时已晚。但是&#xff0c;我们都不想永久丢失珍贵的照片&#xff0c; 消息和其他文件。这就是为什么您应该检查 遵循 5 大免费 Android 数据恢复工具和最佳替代品 他们。 排名前五的免费 Android 数据恢复软件 1.奇…

ELK-01-elasticsearch-8.15.1安装

文章目录 前言一、下载elasticsearch二、将tar包放到服务器三、解压tar包四、更改配置文件五、添加启动用户六、用elasticserch用户启动6.1 报错6.2 解决问题16.3 解决问题26.4 再次用elasticserch用户启动6.5 windows浏览器打开 七、设置开机自动启动7.1 创建启动脚本7.2 在脚…

【C++】二、数据类型 (同C)

2.1 整形 无特殊情况&#xff0c;一般用int 2.2实型&#xff08;浮点型&#xff09; 1. 单精度 foat 2. 双精度 double 输入小数时默认double&#xff0c;定义变量时可以使用float转换为单精度 3. 可使用科学计数法表示小数&#xff08;看得懂即可&#xff09; 4. 用于浮点型用…

Excel--DATEDIF函数的用法及参数含义

DATEDIF函数的用法为: DATEDIF(start_date,end_date,unit),start_date表示的是起始时间&#xff0c;end_date表示的是结束时间。unit表示的是返回的时间代码&#xff0c;是天、月、年等。如下: Datedif函数的参数含义unit参数返回值的意义"y"两个时间段之间的整年数…

推荐使用10款源代码加密软件,保护核心源代码,减少泄密风险

在现代企业中&#xff0c;保护核心源代码的安全变得尤为重要。源代码不仅是产品的核心资产&#xff0c;也是黑客和竞争对手的目标。一旦代码泄露&#xff0c;不仅可能导致产品安全漏洞&#xff0c;还会使企业的知识产权面临威胁。为了解决这一问题&#xff0c;源代码加密软件能…

Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链【本系列文章的分析重点】

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路【本系列文章的分析重点】Java反序列化利用链篇 | CC1…

人工智能之计算机视觉的发展历程与相关技术内容,相应的模型介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能之计算机视觉的发展历程与相关技术内容&#xff0c;相应的模型介绍。本文围绕计算机视觉这一领域&#xff0c;以问答的形式呈现了关键问题及详细解答。内容涵盖计算机视觉的基本概念、技术原理、应用场景等…

全方位洗衣洗鞋小程序系统,重塑干洗店服务新体验;

全方位洗衣洗鞋小程序系统&#xff0c;重塑干洗店服务新体验; 一、核心功能革新&#xff1a; 1.多元化下单模式&#xff1a;融合上门取送、到店服务、寄存网点及智能衣柜四种便捷方式&#xff0c;用户轻松一键下单&#xff0c;享受个性化服务。 2.从下单到送回&#xff0c;全程…

Kotlin高阶函数func

Kotlin高阶函数func fun sum(a: Int, b: Int, someFunc: () -> Unit) {println("${a b}")someFunc() }fun myFunc() {println("计算成功") }fun main() {sum(1, 2, ::myFunc) } 输出&#xff1a; 3 计算成功 Kotlin函数作为参数指向不同逻辑_ketlin 将…

ubuntu中通过源码安装pointnet2_ops_lib

注&#xff1a;本帖所用环境为&#xff1a;ubuntu 24.04、 cuda 12.04 文章目录 1. 克隆 PointNet 源码库2. 安装依赖3. 编译 pointnet2_ops_lib4. 测试安装 1. 克隆 PointNet 源码库 首先&#xff0c;克隆 PointNet 的 GitHub 仓库&#xff1a; git clone https://github.co…

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛&#xff1a;第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中&#xff0c;对于指定数据集进行训练&#xff0c;训练结果存在欠拟合…

基于Es和智普AI实现的语义检索

1、什么是语义检索 语义检索是一种利用自然语言处理&#xff08;NLP&#xff09;和人工智能&#xff08;AI&#xff09;技术来理解搜索查询的语义&#xff0c;以提供更准确和相关搜索结果的搜索技术&#xff0c;语义检索是一项突破性的技术&#xff0c;旨在通过深入理解单词和…

QT菜单栏设计(二级菜单栏)

目的&#xff1a;创建一级菜单栏&#xff0c;添加对应选项&#xff0c;并向一级菜单栏中添加二级菜单栏选项。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindo…

【天怡AI-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Netty笔记07-粘包与半包(上)

文章目录 前言1. 粘包造成粘包的原因解决粘包的方法 2. 半包造成半包的原因解决半包的方法 粘包现象服务端代码示例客户端代码示例 半包现象现象分析粘包半包滑动窗口MSS 限制Nagle 算法 前言 粘包和半包问题是网络编程中常见的问题&#xff0c;特别是在TCP协议中。通过合理的设…

C++编程语言:基础设施:源文件和程序(Bjarne Stroustrup)

第15章 源文件和程序 (Source Files and Programs) 目录 15.1 单独编译(Separate Compilation) 15.2 链接(Linkage) 15.2.1 文件局部名(File-Local Names) 15.2.2 头文件(Header Files) 15.2.3 一次定义原则(The One-Definition Rule) 15.2.4 标准库头文件 1…

Python办公自动化教程(001):PDF内容提取

1、Pdfplumber介绍 pdfplumber的github地址&#xff1a; https://github.com/jsvine/pdfplumber/【介绍】&#xff1a;pdfplumber 是一个用于处理 PDF 文件的 Python 第三方库&#xff0c;它提供了一种方便的方式来提取 PDF 文件中的文本、表格和其他信息。【功能】&#xff…

JEDEC DDR3 SRAM standard

DDRDouble Data Rate双倍速率,DDR SDRAM双倍速率同步动态随机存储器&#xff0c;人们习惯称为DDR&#xff0c;其中&#xff0c;SDRAM 是Synchronous Dynamic Random Access Memory的缩写&#xff0c;即同步动态随机存取存储器。而DDR SDRAM是Double Data Rate SDRAM的缩写&…

交叉熵损失函数的使用

交叉熵损失函数 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff0c;也称为对数损失&#xff08;Log Loss&#xff09;&#xff0c;是机器学习和深度学习中常用的损失函数之一&#xff0c;尤其在分类问题中。它衡量的是模型预测的概率分布与真实标签的概率…