首页 > 数据库 >SQL面试常见题目

SQL面试常见题目

时间:2024-09-24 19:21:15浏览次数:9  
标签:JOIN name employees 面试 SQL department 题目 id SELECT

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 的用法可以帮助你在处理复杂的多表查询时选择合适的策略。

标签:JOIN,name,employees,面试,SQL,department,题目,id,SELECT
From: https://blog.csdn.net/m0_55049655/article/details/142449309

相关文章

  • MySql distinct 用法
    DISTINCT的主要作用是什么,可以使用groupby或其他方法实现同样的效果吗?DISTINCT的主要作用是在SQL查询中去除结果集中的重复行,确保返回的每个行都是唯一的。它通常用于SELECT语句中,以获取某列或多列的唯一值组合。例如,假设有一个员工表employees,其中有一列department表示......
  • 超详细的系列总结!大模型岗面试题(含答案)来了!(大语音模型基础篇二)
    前言大模型应该是目前当之无愧的最有影响力的AI技术,它正在革新各个行业,包括自然语言处理、机器翻译、内容创作和客户服务等,正成为未来商业环境的重要组成部分。截至目前大模型已超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关岗位和面试也开始越来越卷......
  • mysql8.4:搭建主从复制(mysql 8.4.1)
    一,主库上:修改配置文件1,配置文件:/etc/my.cnf中,增加:server-id=1说明:无需指明logbin的值,因为它的默认值就是打开的,SHOWVARIABLESLIKE'log_bin';返回:说明:主库的server-id要和从库的server-id区分开,一般主库用1,其他各从库用2及以后的数字二,主库上:创建备份账号1,......
  • MySql Having 用法
    HAVING子句在MySQL中的用法主要用于对通过GROUPBY子句分组后的数据进行条件过滤。它与WHERE子句类似,但关键区别在于HAVING子句可以包含聚合函数(如COUNT()、MAX()、MIN()、SUM()、AVG()等),而WHERE子句在数据分组之前执行,不能包含聚合函数。下面是一些HAVING子句的具体用法示例:示......
  • Spark(十一)SparkSQL 数据的加载和保存
    通用的加载和保存方式这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL默认读取和保存的文件格式为parque1.加载数据spark.read.load是加载数据的通用方法,支持的数据源格式:scala>spark.read.csvjdbcloadoptionsparquet......
  • Postgresql一行命令备份(pg_dump版)
    pg_dumppg_dump-Upostgres-Fc-dnacos-fnacos_bk.sql;一行命名备份nacos数据库-U:表示备份数据库时,使用的用户名;-Fc:表示备份文件使用传统pg风格,这种格式最灵活;-d:需要备份的数据库名;-f:备份的文件路径参考pg_dump......
  • 大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree实测案例Re......
  • Java面试指南(基础篇)
    文章目录前言01Java语言的特点02JVM、JRE及JDK的关系03Java和C++的区别04基本数据类型05类型转换06自动装箱与拆箱07String的不可变性08字符常量和字符串常量的区别09字符串常量池10String类的常用方法11String和StringBuffer、StringBuilder的区别12switch......
  • 分享C++程序员面试八股文(九)
    以下是C++常见八股文(九):一、模板元编程(TemplateMetaprogramming)解释模板元编程的概念和优势概念:模板元编程是一种在编译期进行编程的技术,利用C++模板的强大功能,通过模板参数和特化等机制,在编译期执行各种计算和类型操作。它可以被看作是一种将程序的一部分逻辑在编译......
  • Mysql知识库【总结】
    MySQL是一种关系型数据库管理系统(RDBMS),其底层原理可以简单概括为以下几个方面:-存储引擎:MySQL支持多种存储引擎,如MyISAM、InnoDB、Memory等。每种存储引擎的实现方式不同,它们各自的特点和使用场景也不同。例如,MyISAM存储引擎适合于读多写少的场景,而InnoDB存储引擎则适合于......