大家好,我是宁一
这篇我们来看看各大厂出的高频实战题~
选择题、问答题可以参考上一篇文章:2022年SQL经典面试题总结(带解析)
实战题相对比较复杂,需要一定的耐心,主要学习解题思路。
一、聚合函数
聚合函数,顾名思义,就是会将数据记录聚合到一起的函数,比如MAX、MIN、SUM、AVG、COUNT,都是将多条记录汇总为一条记录。通常与GROUP BY语句、HAVING语句结合使用。
我们来看看问题:
Employee 员工信息表表包括,每个员工对应的工号 Id,姓名 Name , 工资 Salary 和部门编号 DepartmentId 。
Department 部门信息表包含部门对应的编号ID和部门名称Name。
编写一个SQL查询,查找 Employee 表中,每个部门重复的工资记录,以及重复的个数。
例如上面示例应返回:
解题思路:通过join函数连接Department表,显示出部门名称,通过GROUP BY 对部门进行分组,使用COUNT聚合函数进行计数,最后通过HAVIGN判断重复的记录。
SELECT
de.name,
em.salary,
count(*)
FROM Employee em
JOIN Department de
ON em.department_id = de.id
GROUP BY de.name,em.salary
HAVING count(*)>1
二、JOIN连接
- INNER JOIN: 内连接,也可以只写JOIN。只有进行连接的两个表中都存在与连接标准相匹配的数据才会被保留下来。
- LEFT JOIN: 左连接,操作符左边表中符合 WHERE 子句的所有记录将会被 返回,操作符右边表中如果没有符合 ON 后面连接条件的记录时,那么从右边表 指定选择的列的值将会是 NULL。
- RIGHT JOIN: 右连接,会返回右边表所有符合 WHERE 语句的记录。左表 中匹配不上的宇段值用 NULL 代替。
- FULL JOIN:外连接,返回所有表中符合 WHERE 语句条 件的所有记录。如果任一表的指定宇段没有符合条件的值的话,那么就使用 NULL 替代。
经典问题解析:
编写一个 SQL 查询,查找所有至少连续出现三次的数字,表名为:Num,表结构如下:
解题思路:通过id+1的方式查找id下一次出现的数字,通过id+2的方式查找下下次出现的数字,只要下一次及下下次出现的数字和当前出现的数字相同,即为满足连续出现至少三次的数字。
SELECT DISTINCT a.num
FROM Num a
JOIN Num b
ON a.id+1 = b.id
JOIN Num c
ON a.id+2 = c.id
where a.num = b.num
AND a.num = c.num
结果如下: