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,一经查实,立即删除!

相关文章

python基础题练习

1.可否定义一个sum函数呢&#xff1f;返回指定区间的值的和&#xff1f;例如&#xff0c;区间[1,4]的和为123410返回指定区间值的平方的和呢&#xff1f;立方呢&#xff1f; 代码&#xff1a; # 计算从start到end&#xff08;包括end&#xff09;的所有整数的和。 def sum_ra…

AutoX.js向后端传输二进制数据

android的JavaScript自动化软件用过Hamibot和AutoX.js 不过在向后端传输二进制数据时都有些限制&#xff0c;不如浏览器前端那么自由。Hamibot的http按文档应该时能支持传字节数组&#xff0c;但是实际上应该还没有支持。AutoX.js的http也是这样&#xff0c;但是AutoX.js还支持…

P7557 [USACO21OPEN] Acowdemia S题解

[USACO21OPEN] Acowdemia S 题目描述 由于对计算机科学的热爱&#xff0c;以及有朝一日成为 「Bessie 博士」的诱惑&#xff0c;奶牛 Bessie 开始攻读计算机科学博士学位。经过一段时间的学术研究&#xff0c;她已经发表了 N N N 篇论文&#xff08; 1 ≤ N ≤ 1 0 5 1 \leq…

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;每⾏的后⾯都加⼀个反…

基于深度学习的可再生能源的效率优化

基于深度学习的可再生能源效率优化是一种应用先进人工智能技术来提升太阳能、风能、水能等可再生能源的生产和利用效率的策略。可再生能源的生产效率通常受限于不稳定的自然条件&#xff08;如日照、风速等&#xff09;&#xff0c;深度学习能够通过分析历史数据和实时环境信息…

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

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

linux-网络管理-网络配置

Linux 网络管理与网络配置 在Linux系统中&#xff0c;网络管理是系统管理员的重要职责之一。网络配置包括如何配置网络接口、管理IP地址、网关、DNS等核心网络设置。现代Linux系统提供了多种工具用于网络管理&#xff0c;既包括传统的命令行工具&#xff0c;也包括现代的网络管…

前端——阿里图标的使用

阿里图标 将小图标定义成字体&#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…

Python NumPy学习指南:从入门到精通

Python NumPy学习指南&#xff1a;从入门到精通 第一部分&#xff1a;NumPy简介与安装 1. 什么是NumPy&#xff1f; NumPy&#xff0c;即Numerical Python&#xff0c;是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray&#xff0c;并支持大量的数学函…

力扣反转链表系列【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库而不…

js进阶——this全面解析

全面解析 this 关键字 在 JavaScript 中&#xff0c;this 是一个经常让初学者困惑的概念。this 的值取决于函数的调用位置&#xff0c;而不是它定义的位置。因此&#xff0c;理解调用位置和不同的绑定规则非常重要。接下来我们详细讲解 this 的各个方面。 1. 调用位置 this …

Java : 图书管理系统

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