一句话总结
SQL 是数据岗位的必考项,核心考点:JOIN(INNER/LEFT/RIGHT/FULL 区别)、窗口函数(ROW_NUMBER/RANK/DENSE_RANK/LEAD/LAG)、查询优化(索引+EXPLAIN)、经典题目(TopN/连续登录/行转列)。
JOIN查询
Q:各种JOIN的区别?
INNER JOIN:返回两表中匹配的行。
LEFT JOIN:返回左表所有行,右表无匹配则为NULL。
RIGHT JOIN:返回右表所有行,左表无匹配则为NULL。
FULL JOIN:返回两表所有行,无匹配则为NULL。
CROSS JOIN:笛卡尔积,返回两表所有组合。
窗口函数
Q:窗口函数有哪些?怎么用?
窗口函数在不减少行数的情况下进行聚合计算。
语法:函数名() OVER (PARTITION BY 列 ORDER BY 列 ROWS/RANGE ...)
常用窗口函数:
1. ROW_NUMBER():行号,不重复
2. RANK():排名,有并列跳号
3. DENSE_RANK():排名,有并列不跳号
4. LEAD/LAG:前/后N行的值
5. SUM/AVG OVER:累计/移动聚合
经典场景:部门薪资排名Top3、连续登录天数、同比环比计算。
查询优化
Q:SQL查询优化的方法?
索引优化:
1. 遵循最左前缀原则
2. 避免在索引列上使用函数或计算
3. 覆盖索引避免回表
4. 注意索引的选择性
查询优化:
1. 避免SELECT *
2. 小表驱动大表
3. 用EXISTS替代IN(大数据集)
4. 避免子查询,改用JOIN
EXPLAIN分析:关注type、key、rows、Extra字段。
经典SQL题目
1. 第二高薪水:使用LIMIT OFFSET或MAX子查询。
2. 连续登录天数:日期减去行号得到分组标识,再COUNT。
3. 部门工资Top3:DENSE_RANK窗口函数。
4. 求中位数:ROW_NUMBER排序后取中间行。
5. 行转列:CASE WHEN + 聚合函数,或PIVOT。