SQL面试常见题目

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_salaryFROM employeesGROUP 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.mzph.cn/bicheng/54753.shtml

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

相关文章

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓&#xff0c;可以分成⼏⾏写&#xff0c;除了最后⼀⾏外&#xff0c;每⾏的后⾯都加⼀个反…

win10下使用docker、k8s部署java应用

在上一篇文章 Windows10上Docker和Kubernetes的安装 中&#xff0c;已经介绍了在 Windows10上安装Docker和Kubernetes &#xff0c;有了这个环境基础之后&#xff0c;就可以用来部署服务了 在项目目录下新建Dockfile文件&#xff0c;内容如下&#xff08;请根据实际情况调整&am…

前端——阿里图标的使用

阿里图标 将小图标定义成字体&#xff0c;通过引入字体的方式来展示这些图标 1.打开阿里图标库 https://www.iconfont.cn/ 2.登录 / 注册一个账号 3.选中你需要使用的图标 并且把它加入购物车 4.全部选择完之后 点击右上角 购物车 然后下载代码 5.解压后你下载的文…

Web+Mysql——MyBatis

MyBatis 目标 能够完成Mybatis代理方式查询数据能够理解Mybatis核心配置文件的配置 1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由…

面试面经|大模型算法岗常见面试题100道

本文提供了一份全面的大模型算法岗位面试题清单&#xff0c;包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点&#xff0c;旨在帮助求职者准备相关技术面试。 一、基础篇 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&a…

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…

zabbix“专家坐诊”第256期问答

原作者&#xff1a;乐维社区 原文链接&#xff1a;https://forum.lwops.cn/questions 问题一 Q&#xff1a;zabbix 6.4.18版本的&#xff0c;使用zabbix_agentd2监控mysql数据库&#xff0c;只能在界面配置mysql的相关信息吗&#xff1f;这个在zabbix表里面是明文存储的&#x…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

Java : 图书管理系统

图书管理系统的作用&#xff1a; 高效的图书管理 图书管理系统通过自动化管理&#xff0c;实现了图书的采编、编目、流通管理等操作的自动化处理&#xff0c;大大提高了图书管理的效率和准确性。 工作人员可以通过系统快速查找图书信息&#xff0c;实时掌握图书的借还情况&…

【Java】Java中接口与内部类详解

目录 引言 一、接口&#xff08;Interface&#xff09; 1.1 接口的定义 1.1.1 接口的特点 1.2 接口的实现 1.3 接口的继承 1.4 接口的注意事项 1.5 代码示例 二、内部类&#xff08;Inner Class&#xff09; 2.1 内部类特点 2.2 成员内部类 2.2.1 对象的创建 2.…

红外热成像应用场景!

1. 电力行业 设备故障检测&#xff1a;红外热成像仪能够检测电气设备&#xff08;如变压器、电线接头&#xff09;的过热现象&#xff0c;及时发现并定位故障点&#xff0c;预防火灾等安全事故的发生。 水电站查漏&#xff1a;在水电站中&#xff0c;红外热成像仪可用于快速查…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多&#xff0c;未必需要理解语言 统计语言模型发展史 统计语言模型&#xff1a; 判断一个句子是否合理&#xff0c;就计算这个句子会出现的概率 缺点是句子越长越…

掌握Python办公自动化,轻松成为职场高效达人

大家好&#xff0c;今天我们来聊聊为什么要学习和了解Python办公自动化&#xff1f; "自动化应用于高效运营将提高效率" ——比尔盖茨 在日常的工作中&#xff0c;存在很多重复性、规律性的工作。虽然现在有很多办公软件能够在一些方面提高工作效率&#xff0c;但无法…

基于FPGA+GPU异构平台的遥感图像切片解决方案

随着遥感和成像技术的不断进步和普及&#xff0c;获取大量高分辨率的遥感图像已成为可能。这些大规模的遥感图像数据需要进行有效的处理和分析&#xff0c;以提取有用的信息&#xff0c;进行进一步的应用。遥感图像切片技术应运而生&#xff0c;该技术可以将大型遥感图像分割成…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一&#xff0c;PyQt5 是 Python 绑定 QT5 应用的框…

增强GPT4v的Grounding能力,video-level

开源链接&#xff1a; appletea233/AL-Ref-SAM2: AL-Ref-SAM 2: Unleashing the Temporal-Spatial Reasoning Capacity of GPT for Training-Free Audio and Language Referenced Video Object Segmentation (github.com) In this project, we propose an Audio-Language-Refe…