sql having是什么意思_SQL面试通关秘籍:面试知识点+技巧分享!

c2545e2903f7f49cc54a1f48f49f67cd.png

SQL是用于数据分析和数据处理的最重要的编程语言之一,因此与数据科学相关的工作(例如数据分析师、数据科学家和数据工程师)在面试时总会问到关于 SQL 的问题。

SQL面试问题旨在评估应聘者的技术和解决问题的能力。因此对于应聘者来说,关键在于不仅要根据样本数据编写出正确的查询,而且还要像对待现实数据集一样考虑各种场景和边缘情况

在这篇文章中,我将介绍 SQL 面试问题中常见的模式,并提供一些在 SQL 查询中巧妙处理它们的技巧。

1

问问题

要搞定一场 SQL 面试,最重要的是尽量多问问题,获取关于给定任务和数据样本的所有细节。充分理解需求后,接下来你就可以节省很多迭代问题的时间,并且能很好地处理边缘情况。

我注意到许多候选人经常还没完全理解SQL问题或数据集,就直接开始编写解决方案了。之后,等我指出他们解决方案中存在的问题后,他们只好反复修改查询。最后,他们在迭代中浪费了很多面试时间,甚至可能到最后都没有找到正确的解决方案。

我建议大家在参加SQL面试时,就当成是自己在和业务伙伴共事。所以在你提供解决方案之前,应该要针对数据请求了解清楚所有的需求。

举例:查找薪水最高的前 3 名员工。

346105e926f1f2b49002c9efe4bbdff1.png

样本employee_salary表

这里你应该要求面试官说清楚“前三名”具体是什么意思。我应该在结果中包括 3 名员工吗?你要我怎样处理关系?此外,请仔细检查样本员工数据。salary 字段的数据类型是什么?在计算之前是否需要清除数据?

2

选哪一个JOIN

0bce50dc753a4ec9fc3dd0d4b54a519e.png

在SQL中,JOIN 通常用来合并来自多个表的信息。

有四种不同类型的 JOIN,但在大多数情况下,我们只使用INNER、LEFT和FULLJOIN,因为 RIGHTJOIN并不是很直观,还可以使用 LEFTJOIN 很简单地重写。在 SQL 面试中,需要根据给定问题的特定要求选择你要使用的正确JOIN。

举例:查找每个学生参加的课程总数。(提供学生 id、姓名和选课的数量。)

a78a452fb2135606986fd9e2ca49a4d5.png

样本student和class_history表

你可能已经注意到了,并非所有出现在 class_history 表中的学生都出现在了 student 表中,这可能是因为这些学生已经毕业了。(这在事务数据库中实际上是非常典型的情况,因为不再活跃的记录往往会被删除。)

根据面试官是否希望结果中包含毕业生,我们需要使用LEFT JOIN或 INNER JOIN来组合两个表:

WITH class_count AS (
    SELECT student_id, COUNT(*) AS num_of_class
    FROM class_history
    GROUP BY student_id
)
SELECT 
    c.student_id,
    s.student_name,
    c.num_of_class
FROM class_count c
-- CASE 1: include only active students
JOIN student s ON c.student_id = s.student_id
-- CASE 2: include all students
-- LEFT JOIN student s ON c.student_id = s.student_id

3

GROUP BY

GROUP BY是SQL中最重要的功能,因为它广泛用于数据聚合。如果在一个 SQL 问题中看到诸如求和、平均值、最小值或最大值之类的关键字,这就表明你可能应该在查询中使用GROUP BY了。

一个常见的陷阱是在GROUP BY过滤数据时混淆 WHERE和HAVING——我见过很多人犯了这个错误。

举例:计算每个学生在每个学年的必修课程平均 GPA,并找到每个学期中符合 Dean’s List(GPA≥3.5)资格的学生。

a78a452fb2135606986fd9e2ca49a4d5.png

样本gpa_history表

由于我们在GPA计算中仅考虑必修课程,因此需要使用WHERE is_required=TRUE来排除选修课程。

我们需要每位学生在每学年的平均GPA,因此我们将同时GROUP BY student_id和school_year 列,并取gpa列的平均值。最后,我们只保留学生平均 GPA高于3.5的行,可以使用HAVING来实现。合起来是下面这样:

SELECT 
    student_id,
    school_year,
    AVG(gpa) AS avg_gpa
FROM gpa_history
WHERE is_required = TRUE 
GROUP BY student_id, school_year
HAVING AVG(gpa) >= 3.5
注意:每当在查询中使用GROUP BY时,都只能选择group-by列和聚合列,因为其他列中的行级信息已被舍弃。

4

SQL 查询执行顺序

大多数人会从SELECT开始,从上到下编写SQL查询。

但你知道SQL引擎执行函数时要到后面才执行SELECT吗?以下是 SQL 查询的执行顺序:

  • FROM, JOIN
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • ORDER BY
  • LIMIT, OFFSET

再次考虑前面的示例:

因为我们想在计算平均GPA之前过滤掉选修课程,所以我使用WHERE is_required=TRUE代替HAVING,因为WHERE会在GROUP BY和HAVING之前执行。我不能编写HAVING avg_gpa >= 3.5的原因是,avg_gpa被定义为SELECT的一部分,因此无法在SELECT之前执行的步骤中引用它。

我建议在编写查询时遵循引擎的执行顺序,这在编写复杂查询时会很有用。

5

Window 函数

Window函数也经常出现在SQL面试中。共有五种常见的Window函数:

  • RANK/DENSE_RANK/ROW_NUMBER:它们通过排序特定列来为每行分配一个排名。如果给出了任何分区列,则行将在其所属的分区组中排名。
  • LAG/LEAD:它根据指定的顺序和分区组从前一行或后一行检索列值。

在SQL面试中,重要的是要了解排名函数之间的差异,并知道何时使用LAG/LEAD

举例:查找每个部门中薪水最高的前 3 名员工。

b00d10ca745e3e52db7ffbc7e871d1cc.png

另一个示例employee_salary表

当一个SQL问题要求计算“TOP N”时,我们可以使用ORDER BY或排名函数来回答问题。

但在这个示例中,它要求计算“每个 Y 中的 TOP N X”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。

以下查询恰好能找到 3 名薪水最高的员工,而不论他们的关系如何,如下:

WITH T AS (
SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_salary DESC) AS rank_in_dep
FROM employee_salary)
SELECT * FROM T
WHERE rank_in_dep <= 3 
-- Note: When using ROW_NUMBER, each row will have a unique rank number and ranks for tied records are assigned randomly. For exmaple, Rimsha and Tiah may be rank 2 or 3 in different query runs.

此外,根据关系的处理方式,我们可以选择其他排名函数。同样,细节是很重要的!

f775bff74e0ef93156c1606582fcd3b2.png

ROW_NUMBER,RANK,DENSE_RANK结果比较

6

重复项

SQL面试中的另一个常见陷阱是忽略数据重复

尽管样本数据中的某些列似乎具有不同的值,但面试官还是希望候选人考虑所有可能性,就像他们在处理真实数据集一样。

例如:在上一个示例employee_salary表中,可以让雇员共享相同的名称。

要避免由重复项导致的潜在问题,一种简单方法是始终使用 ID 列唯一地标识不同的记录。

举例:使用 employee_salary 表查找每个部门所有员工的总薪水。
正确的解决方案是 GROUP BY employee_id,然后使用 SUM(employee_salary) 计算总薪水。如果需要雇员姓名,请在末尾与 employee 表联接以检索雇员姓名信息。
错误的方法是使用 GROUP BY employee_name。

7

NULL

在SQL中,任何谓词都可以产生三个值之一true,false和NULL,后者是unknown或missing数据值的保留关键字。处理NULL数据集时可能会意外地很棘手。

在SQL面试中,面试官可能会特别注意解决方案是否处理了NULL值。有时,很明显有一列是不能nullabl的,但对于其他大多数列来说,很有可能会有NULL值。

建议:确认示例数据中的关键列是否为nullable,如果可以,请利用IS(NOT)NULL,IFNULL和COALESCE 之类的函数来覆盖这些边缘情况。

8

交流

最后一点也非常重要:在SQL面试期间要随时与面试官沟通交流。

我面试过的许多候选人都很沉默寡言,有疑问的时候才会知声。当然如果他们最终给出了完美的解决方案,那也不是什么问题。

但是,在技术面试期间保持沟通交流往往会是有价值的。

例如:你可以谈论对问题和数据的理解,说明你计划如何解决问题,为什么使用某些函数而不是其他选项,以及正在考虑哪些极端情况。

9

总结

  • 首先要提问,收集所需的细节
  • 在INNER,LEFT和FULL JOIN之间谨慎选择
  • 使用GROUP BY聚合数据并正确使用WHERE和HAVING
  • 了解三个排名函数之间的差异
  • 知道何时使用LAG/LEAD窗口函数
  • 如果在创建复杂的查询时遇到困难,请尝试遵循SQL执行顺序
  • 考虑潜在的数据问题,例如重复和NULL值
  • 与面试官交流你的思路
Xinran Waibel | 作者
王强 | 译者
https://www.infoq.cn/article/...

如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。

我是民工哥,一个爱折腾的IT技术老司机,欢迎关注我,我们一起学习,共同成长!!

weixin_39802814
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常用面试SQL
牛逸凡的博客
07-21 545
S(S#,SN,SD,SA)   【分别代表学号,学员姓名,所属单位,学员年龄】 C(C#,CN)         【分别代表课程编号,课程名称】 SC(S#,C#,G)      【分别代表学号,所选的课程编号,学习成绩】 insert into sc values(s1,c1,10); insert into sc values(s1,c2,10); insert into sc valu...
SQL面试通关秘籍面试知识点+技巧分享
致力于C语言C++知识分享!
12-14 196
SQL是用于数据分析和数据处理的最重要的编程语言之一,因此与数据科学相关的工作(例如数据分析师、数据科学家和数据工程师)在面试时总会问到关于 SQL 的问题。 SQL面试问题旨在评估应聘者的技术和解决问题的能力。因此对于应聘者来说,关键在于不仅要根据样本数据编写出正确的查询,而且还要像对待现实数据集一样考虑各种场景和边缘情况。 在这篇文章,我将介绍 SQL 面试问题常见的模式,并提供一些在 SQL 查询巧妙处理它们的技巧。 1、问问题 要搞定一场 SQL 面试,最重要...
干货,SQL面试通关秘籍
SeizeeveryDay的博客
09-28 294
Xinran Waibel| 作者王强|译者https://www.infoq.cn/article/fqEAvFfISfKthSIf4FZf?utm_source=rss&amp...
sql面试题目汇总(就是想参考下,由于转自多个网站,没法写明出处,请原作者原谅)
思维加速度
12-15 6652
1.触发器的作用?  答:触发器是一特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。2。什么是存储过程?用什么来调用?答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建
不懂就问:SQL 语句 where 条件后 写上1=1 是什么意思
SQL数据库开发
11-05 2425
点击关注上方“SQL数据库开发”,设为“置顶或星标”,第一时间送达干货程序员在编程过程,经常会在代码使用到“where 1=1”,这是为什么呢?SQL注入初次看到这种写法的同学肯定很...
常见SQL面试知识点+使用技巧
SeizeeveryDay的博客
01-22 977
点击关注上方“数据不吹牛”,设为“置顶或星标”,第一时间送达干货SQL是用于数据分析和数据处理的最重要的编程语言之一,因此与数据科学相关的工作(例如数据分析师、数据科学家和数据工程师)在...
渗透测试 ( 6 ) --- SQL 注入神器 sqlmap
墨鱼菜鸡
07-11 3145
sqlmap 官网:http://sqlmap.org/ sqlmap文档地址:https://github.com/sqlmapproject/sqlmap/wiki/Usage sqlmap 使用 思维导图:http://download.csdn.net/detail/freeking101/9887831 黑帽与白帽都喜爱的十大SQL注入工具:...
字节跳动Java面试:java获取当前时间年月日
m0_57501637的博客
05-27 318
前言 作为一个典型的分布式项目,Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期,它的部署完全要依靠一堆由社区维护的脚本。 其实,Kubernetes 作为一个 Golang 项目,已经免去了很多类似于 Python 项目要安装语言级别依赖的麻烦。但是,除了将各个组件编译成二进制文件外,用户还要负责为这些二进制文件编写对应的配置文件、配置自启动脚本,以及为 kube-apiserver 配置授权文件等等诸多运维工作。 这几年,在跟朋友探讨
Java开发技巧!网上java培训师
m0_57285455的博客
07-04 204
01 JAVA基础 1.1 java知识点 Hashmap 源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么8的时候树化,4不可以吗,等等 concureentHashMap,段锁,如何分段,和hashmap在hash上的区别,性能,等等 HashTable ,同步锁,这块可能会问你synchronized关键字 1.6之后提升了什么,怎么提升的这些 ArrayList 优势,扩容,什么时候用 LinkedList 优势,
2021春招BAT面试真题详解,菜鸟网络java面试
m0_59183028的博客
07-12 482
01 JAVA基础 1.1 java知识点 Hashmap 源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么8的时候树化,4不可以吗,等等 concureentHashMap,段锁,如何分段,和hashmap在hash上的区别,性能,等等 HashTable ,同步锁,这块可能会问你synchronized关键字 1.6之后提升了什么,怎么提升的这些 ArrayList 优势,扩容,什么时候用 LinkedList 优势,
面试常见sql-7个常见sql
11-03
面试常见sql-7个常见sql
面试常见sql
weixin_45020244的博客
05-15 324
面试常见sql 文章目录面试常见sql一、查询学生表信息1、统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生 id,姓 名,总成绩2、列出各门课程成绩最好的学生, 要求显示字段: 学号,姓名,科目,成绩3、计算每个人的平均成绩, 要求显示字段: 学号,姓名,平均成4、列出各门课程的平均成绩,要求显示字段:课程,平均成绩5、用一条 SQL 语句查询 学生表每门课都大于 80 分的学生姓名6、用 sql 查询出“张”姓学生平均成绩大于 75 分的学生信息 一、查询学生表信息 学生表(stud
sql面试问题汇总
weixin_43930865的博客
11-04 1096
1:sqldelete,drop,truncate区别。
数据库面试知识点整理
热门推荐
snowbaby1234的博客
08-02 2万+
事务四大特性(ACID) 1. 原子性(Atomicity) 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 2. 一致性(Consistency) 数据库在事务执行前后都保持一致性状态。 在一致性状态下,所有事务对一个数据的读取结果都是相同的。 3. 隔离性(...
sql 面试必备知识点
最新发布
2301_76522810的博客
04-15 827
3).在SQL Server,每一个DML语句都具有一个隐式的事务,语句执行结束时事务被自动提交到服务器端,而在Oracle,当第一条SQL语句开始执行时,一个新的事务自动开始,除非显式地使用COMMIT进行提交,或者是使用ROLLBACK进行回滚,或者是退出某个Oracle工具时,这些事务才结束,否则SQL语句的操作仅在会话级别进行,并没有保存到数据库。6)单独处理倾斜key:一般来讲倾斜的key都很少,我们可以将它们抽样出来,对应的行单独存入临时表,然后打上随机数前缀,最后再进行聚合。
一道SQL语句面试题,关于group by
huying_0917的专栏
10-12 1217
<br />1.一道SQL语句面试题,关于group by <br />表内容: <br />2005-05-09 胜 <br />2005-05-09 胜 <br />2005-05-09 负 <br />2005-05-09 负 <br />2005-05-10 胜 <br />2005-05-10 负 <br />2005-05-10 负 <br /><br />如果要生成下列结果, 该如何写sql语句? <br /><br />            胜 负 <br />2005-05-09 2 2
SQL常见的一些面试
一位不想写代码偏偏还在挣扎的万年小白
05-27 306
【转】 SQL常见的一些面试SQL常见面试题 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 100 王五 ...
sql常见面试
花开也疯狂
05-14 780
Sql常见面试题 受用了1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name   kecheng   fenshu 张三     语文       81 张三     数学       75 李四     语文       76 李四     数学       90 王五     语文       81 王五     数学       100 王五     英...
数据库SQL面试知识点整理
nsjlive的博客
08-22 318
一)什么是存储过程?有哪些优缺点? 存储过程是一些预编译的SQL语句。 更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。 存储过程是一个预编译的代码块,执行效率比较高 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,...
SQL面试必备:核心知识点与实战技巧
"这是一份关于SQL数据库面试的资料,包含多方面的面试题目及标准答案,方便在手机上查阅。涵盖了SQL的基本操作如创建、修改和...这些知识点覆盖了SQL数据库面试的多个重要领域,对于准备面试或提升SQL技能非常有帮助。
写文章

热门文章

  • mysql表如何删除一条数据_mysql如何删除表中一行数据? 39396
  • 联通突然从4g变成3g了_联通关闭2G、3G信号服务 谁为用户的损失买单? 25113
  • 一般通话记录能保存多少条_iPhone最近通话保存多久_iPhone保存多少条通话记录_智能家... 9701
  • 步道乐跑怎么刷次数_步道乐跑,你的次数及格了吗? 7905
  • ir2104s的自举电容_一文看懂ir2110自举电容的选择 - 全文 7230

最新文章

  • 服务器部署springcloud项目,springcloud项目部署到虚拟机服务器
  • 三星为什么4g显示上不了网络连接服务器,三星Galaxy S10 5G版面临网络问题 无法切换4G信号...
  • 邮件服务器dns失败,邮件服务器DNS没法正确注册解决方法
2021年155篇
2020年220篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家北欧风玻璃钢花盆本溪玻璃钢雕塑厂家柘城玻璃钢雕塑价格崇左玻璃钢雕塑定做四川节庆商场美陈销售厂家玻璃钢小品雕塑生产商生产玻璃钢雕塑厂家哪家专业淮安玻璃钢雕塑订制价格水晶玻璃钢花盆哪家好玻璃钢仿铜人物雕塑定制厂家院子玻璃钢花盆布局鹤壁校园玻璃钢景观雕塑生产厂家常见商场美陈厂家直销贵州玻璃钢人物雕塑价格如何杭州玻璃钢花盆销售厂家商场美陈vi玻璃钢泡沫雕塑供应商柳州小区玻璃钢雕塑公司九江玻璃钢雕塑云南佛像玻璃钢雕塑生产厂家南阳玻璃钢人物雕塑价格报价大象玻璃钢雕塑公司方案广东玻璃钢牛动物雕塑园林小品南山商场美陈装饰庆阳广场玻璃钢雕塑定做驻马店商场美陈克拉玛依玻璃钢雕塑造型贴金封开玻璃钢抽象雕塑批发工艺玻璃钢雕塑厂家巴彦玻璃钢雕塑厂香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化