⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 medium.com/ 「网络」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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

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

当数据库上没有主键或唯一键时,就会出现数据库中的重复问题,这就是为什么建议在表中包含键列。无论如何,使用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)

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

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它。

候选键和主键的区别?

主键和候选键之间有什么区别?另一个流行的 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 查询面试题的全部内容。

文章目录
  1. 1. 如何查找数据库表中的重复记录?
  2. 2. SQL中 Truncate 和 Delete 的区别?
  3. 3. 候选键和主键的区别?
  4. 4. 如何查找员工的第二高或第二最高工资?
  5. 5. 12 个用于技术面试的 SQL 查询示例和练习题
    1. 5.0.1. 1. 你能编写一个 SQL 查询来显示工资比经理高的员工(姓名)吗?
    2. 5.0.2. 2. 编写一个 SQL 查询来查找其部门中薪水最高的员工。
    3. 5.0.3. 3. 编写一个 SQL 查询来列出少于 3 人的部门?
    4. 5.0.4. 4. 编写一个 SQL 查询来显示所有部门及其人数。
    5. 5.0.5. 5. 你可以编写一个 SQL 查询来显示同一部门中没有经理的所有员工吗?
    6. 5.0.6. 6. 你能编写一个 SQL 查询来列出所有部门以及那里的总工资吗?