玖叶教程网

前端编程开发入门

掌握 SQL 面试的艺术:解锁常见和复杂查询的解决方案

来源:medium.com/

  • 如何查找数据库表中的重复记录?
  • SQL中 Truncate 和 Delete 的区别?
  • 候选键和主键的区别?
  • 如何查找员工的第二高或第二最高工资?
  • 12 个用于技术面试的 SQL 查询示例和练习题

如何查找数据库表中的重复记录?

为了在数据库表中查找重复记录,我们需要确认重复项的定义。例如,在下面的联系人表中,应该存储联系人的姓名和电话号码,如果满足以下条件,则记录被认为是重复的:姓名和电话号码相同 ,但如果其中任何一个不同,则它们是唯一的。

当数据库上没有主键或唯一键时,就会出现数据库中的重复问题,这就是为什么建议在表中包含键列。无论如何,使用ANSI SQL 的 group by 子句很容易找到表中的重复记录。

在下面的查询中,我们使用了SELECT 查询来选择 Contacts 表中的所有记录。这里 James、Johnny、Harry 和 Ron 被重复四次。

mysql> select * from Contacts;
+-------+----------+
| name  | phone    |
+-------+----------+
| James | 80983243 |
| Johnny | 67543212 |
| Harry | 12341234 |
| Ron   | 44446666 |
| James | 80983243 |
| Johnny | 67543212 |
| Harry | 12341234 |
| Ron   | 44446666 |
| James | 80983243 |
| Johnny | 67543212 |
| Harry | 12341234 |
| Ron   | 44446666 |
| James | 80983243 |
| Johnny | 67543212 |
| Harry | 12341234 |
| Ron   | 44446666 |
| Ruby  |  8965342 |
| Ruby  |  6888342 |
+-------+----------+
18 rows in set (0.00 sec)

以下 SELECT 查询将仅根据名称查找重复记录,如果存储两个号码相同但不同的联系人,则可能不正确,如以下结果集中 Ruby 显示为重复,这是不正确的。

mysql> select name, count(name) from contacts group by name;
+-------+-------------+
| name  | count(name) |
+-------+-------------+
| Harry |           4 |
| James |           4 |
| Johnny |           4 |
| Ron   |           4 |
| Ruby  |           2 |
+-------+-------------+
5 rows in set (0.00 sec)

这是查找重复联系人的正确方法,它会查看姓名和电话号码,并且仅在姓名和电话相同时才打印重复的联系人。

mysql> select name, count(name) from contacts group by name, phone;
+-------+-------------+
| name  | count(name) |
+-------+-------------+
| Harry |           4 |
| James |           4 |
| Johnny |           4 |
| Ron   |           4 |
| Ruby  |           1 |
| Ruby  |           1 |
+-------+-------------+

SQL 查询中的having 子句将从唯一记录中过滤掉重复记录。如以下查询所示,它会打印所有重复记录以及它们在表中重复的次数。

mysql> select name, count(name) as times 
from contacts 
group by name, phone having times>1;
+-------+-------+
| name  | times |
+-------+-------+
| Harry |     4 |
| James |     4 |
| Johnny |     4 |
| Ron   |     4 |
+-------+-------+
4 rows in set (0.00 sec)

这就是如何查找表中重复记录的全部内容。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

视频教程:https://doc.iocoder.cn/video/

SQL中 Truncate 和 Delete 的区别?

Truncate和Delete都是面试的热门话题,在 SQL 面试中总是会出现一些关于这些命令的问题。

在生产环境中使用Truncate或Delete或编写任何从表中清除数据的脚本之前,这是需要理解的重要一点。

  1. Truncate速度快,Delete速度慢。2. Truncate不进行日志记录,而是逐行删除日志。3. 除非供应商特别支持,否则可以使用delete而不是truncate进行回滚。4. Truncate不会触发触发器,而delete会触发触发器。5. 当涉及到清除表时,不要Delete,而是Truncate它。6. Truncate会重置表中的标识列(如果有),Delete则不会。7. Truncate是DDL而Delete是DML(当你写考试时使用这个) 8. Truncate不支持where子句,而delete支持where子句。

因此,最后,如果我们有包含大量数据的表并且想要清空它,请不要Delete,而是Truncate它。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://github.com/YunaiV/yudao-cloud

视频教程:https://doc.iocoder.cn/video/

候选键和主键的区别?

主键和候选键之间有什么区别?另一个流行的 SQL 和数据库面试问题,时不时出现在各种编程面试中?

在了解候选键和主键之间的区别之前,让我们先看看它们之间的一些相似点。

  1. 唯一标识: 主键和候选键都可以唯一标识数据库中表中的记录。
  2. 约束: 主键和候选键都有约束 UNIQUE 和 NOT NULL。
  3. 结构: 主键或候选键可以是表中的单列或多列的组合。

什么是候选键?

候选键可为NULL也可不唯一,用于唯一标识表或关系中的每条记录。不止一个候选键可用于唯一地标识表或关系。例如一个student表,我们可以选择他的编号{id}或者是出生日期{birthday}作为这个student表的主键,都具备对student表进行唯一标识的作用,所以可以为多个也可以为NULL

什么是主键?

主键是唯一且非空的,用于唯一标识表或关系中的每条记录。例如一个student表,我们选择他的编号{id}作为主键,因为每个人的姓名可能相同,但是我们命名的编号肯定不同,所以就起到了唯一标识的作用。并且主键唯一且非空,{id}做到了。

二者关系?

主键是候选键的子集。也就是所有候选键都有成为主键的资格,就看你选谁当主键。

如何查找员工的第二高或第二最高工资?

如何找到某个员工的第二高或第二高薪水是最常见的 SQL 面试问题之一。

我们将编写 SQL 查询来获取员工第二高的工资。在编写查询之前,最好熟悉架构以及表中的数据。这是我们将在此 SQL 示例中使用的 Employee 表:

mysql> SELECT * FROM Employee;
+--------+----------+---------+--------+
| emp_id | emp_name | dept_id | salary |
+--------+----------+---------+--------+
| 1      | James    | 10      |   2000 |
| 2      | Jack     | 10      |   4000 |
| 3      | Henry    | 11      |   6000 |
| 4      | Tom      | 11      |   8000 |
+--------+----------+---------+--------+

SQL中的子查询是解决这种情况的好工具,这里我们首先选择最大工资,然后选择子查询的另一个最大排除结果

mysql> SELECT max(salary) FROM Employee WHERE salary NOT IN (SELECT max(salary) FROM Employee);
+-------------+
| max(salary) |
+-------------+
|        6000 |
+-------------+
1 row IN SET (0.00 sec)

下面是另一个使用子查询和 < 运算符而不是 IN 子句来查找第二高薪水的 SQL 查询:

mysql> SELECT max(salary) FROM Employee WHERE salary < (SELECT max(salary) FROM Employee);
+-------------+
| max(salary) |
+-------------+
|        6000 |
+-------------+
1 row IN SET (0.00 sec)

使用MYSQL数据库的LIMIT关键字的第二个最高工资,

MySQL 数据库的 LIMIT 关键字与 SQL Server 数据库的 TOP 关键字有点相似,并且只允许从结果集中获取某些行。查看下面的 SQL 示例,我们会发现它与 SQL Server TOP 关键字示例非常相似。

mysql> SELECT salary  FROM (SELECT salary FROM Employee ORDER BY salary DESC LIMIT 2) AS emp ORDER BY salary LIMIT 1;
+--------+
| salary |
+--------+
|   6000 |
+--------+
1 row IN SET (0.00 sec)

12 个用于技术面试的 SQL 查询示例和练习题

现在是时候编写 SQL 查询了。本节包含 SQL 查询面试问题,将测试许多 SQL 技能,例如联接、分组和聚合数据、如何处理 SQL 中的空值等。

在面试中,询问有关员工和部门的问题是很常见的,下面是表格,下面是问题和答案。

1. 你能编写一个 SQL 查询来显示工资比经理高的员工(姓名)吗?

-- 工资比经理高的员工(姓名)
SELECT a.emp_name FROM Employee a JOIN Employee b
ON a.mngr_id = b.emp_id
WHERE a.salary > b.salary;

2. 编写一个 SQL 查询来查找其部门中薪水最高的员工。

-- 部门中薪资最高的员工
SELECT a.emp_name, a.dept_id
FROM Employee a JOIN
(SELECT a.dept_id, MAX(salary) as max_salary
FROM Employee a JOIN Department b ON a.dept_id = b.dept_id
GROUP BY a.dept_id) b
ON a.salary = b.max_salary AND a.dept_id = b.dept_id;

3. 编写一个 SQL 查询来列出少于 3 人的部门?

-- 少于 3 人的部门 
SELECT dept_id, COUNT(emp_name) as 'Number of Employee'
FROM Employee
GROUP BY dept_id
HAVING COUNT(emp_name) < 3;

4. 编写一个 SQL 查询来显示所有部门及其人数。

-- 所有部门及其人数
SELECT b.dept_name, COUNT(a.dept_id) as 'Number of Employee'
FROM Employee a FULL OUTER JOIN Department b ON a.dept_id=b.dept_id
GROUP BY b.dept_name;

5. 你可以编写一个 SQL 查询来显示同一部门中没有经理的所有员工吗?

-- 同一部门没有经理的员工
SELECT a.emp_name FROM Employee a JOIN Employee b
ON a.mngr_id = b.emp_id
WHERE a.dept_id != b.dept_id;

6. 你能编写一个 SQL 查询来列出所有部门以及那里的总工资吗?

-- 所有部门以及总工资
SELECT b.dept_name, SUM(a.salary) as 'Total Salary'
FROM Employee a FULL OUTER JOIN Department b ON a.dept_id = b.dept_id
GROUP BY b.dept_name;

这就是本文有关SQL 查询示例、练习题和 SQL 查询面试题的全部内容。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言