SQL语句面试题

还记得上个月帮助隔壁班整理成绩单吗? 那家伙的数据实在是太多了,让人眼花缭乱。
一转眼就到了2 02 3 年1 1 月,阳光依然那么刺眼。

第一条SQL查询所有学生的学号、姓名、修读的课程数、总成绩。
这个很简单,用GROUP BY就可以了。
我坐在电脑前,一边打字,一边一行一行地写着,S.Sid、Sname、COUNT(Cid)作为选修课数,SUM(Score)作为总分,心里还在想着午饭吃什么。
时间不知不觉就过去了,所以必须快点吃饭。

第二条SQL查询学过“叶平”老师教授的所有课程的学生号和学生姓名。
这有点复杂,需要多个表连接。
我拿出笔和纸,画了一张草图,然后连接了三张桌子。
WHERE 条件是老师的名字。
写完之后再看吧? 好像忘记加HAVING了,所以需要加上分组判断。
我突然想到,这个查询如果用在实际中,可能需要过滤掉所有上过叶老师课的学生,不然数据就乱了。
地点在宿舍,具体号码是多少? 我不知道,我得去数据库看看。

第三条SQL查询“002 ”课程成绩低于“001 ”课程成绩的所有学生的学号和姓名。
This uses a subquery and nests two levels of JOIN. 我边写边嘀咕,A.Score>B.Score吧? 写完后我测试了一下,嘿嘿,果然是对的。
地点还是宿舍,时间不多,只好接着往下看。

第四条SQL按照平均分从高到低的顺序显示了所有学生在“数学”和“物理”两门课上的成绩。
这就要用到CASE语句,相当麻烦。
SID, math=MAX(CASE WHEN Cname='mathematics' THEN Score END),这样写可以吗? 写完感觉有点累,突然想到这个查询如果用在学校成绩管理系统中效率会更高。
地点还是宿舍,具体数字? 你得运行数据库来验证。

等一下,还有一件事。
写完这些SQL后,您需要再次检查它们以确保没有拼写错误。
我突然想到,如果有一个工具可以自动生成这些查询,那就太好了,这样我就不必每次都手动编写它们。
你说出它的名字,没什么特别的。

MySQL面试题 | 附答案解析(十一)

说白了,MySQL视图是虚拟表,游标是逐行处理数据的工具。
面试题主要测试这两个领域的应用场景和局限性。

对于开发来说,视图特别有用:
我们先来说说最重要的事情。
去年我们跑了一个电商项目,使用视图来封装与多个表相关的复杂查询。
开发直接调用视图名来获取结果。
SQL重用率提高了一倍,用户只能看到视图中的字段。
数据安全稳定。
在3 000条左右的数据量下,视图查询转换为基表查询的性能还不错,但是注意不要用聚合函数来写视图,那么就很难更新了。

此外,视图特别适合控制授权,例如为销售人员提供仅显示订单表并隐藏客户联系信息的视图。
很多人没有注意到这一点,但面试官完全理解。
还有另一个关键细节。
该视图取决于基表。
如果表结构发生重大更改,视图可能会崩溃。
我们必须记住这一点。
一开始我以为视图可以直接存储数据,后来发现这根本不可能。
这纯粹是动态生成查询结果。
这种看法必须改变。

说实话,滑块相当精致,但用得好的话也很强大:
光标适合逐行处理。
例如,去年在处理滞销商品时,我们使用滑块来批量更改状态。
性能比直接更新要差一些,但它可以让我们灵活地添加业务逻辑。
考虑显式管理生命周期,特别是如果您忘记关闭游标,数据库会疯狂地警告您。
我经历过一次。

还有一点就是游标操作的数据会锁定当前行,所以在高并发场景下要谨慎使用。
去年,我们的系统由于游标锁定而出现了数百个请求,后来我们改用批处理来解决该问题。
不要忘记添加一个延续处理程序,否则如果找不到程序将直接崩溃。
等等,还有一件事,游标最常用于存储过程,但不要使其过于复杂,否则可维护性将极其糟糕。

Finally, it is recommended to practice more questions on combining views and cursors, such as using views to simplify the data sources to be processed by cursors, but be careful of the update restrictions of views, it is very easy to get stuck.