博客
关于我
10个高级的 SQL 查询技巧,你掌握了几个?
阅读量:791 次
发布时间:2023-01-24

本文共 2769 字,大约阅读时间需要 9 分钟。

作为一名技术人员,我认为掌握以下10个SQL高级技巧对您在数据科学面试中至关重要。这些概念不仅能帮助您更高效地解决问题,还能让您在技术讨论中脱颖而出。

1. 常见表表达式(CTEs)

CTEs(Common Table Expressions)在SQL中是不可或缺的工具,尤其是在处理复杂的子查询时。通过将表数据抽象为临时表,您可以在查询中模块化代码,同样您可以为每个CTE分配变量名,使代码更加易于维护。例如,在下面的查询中,CTE toronto_ppl 把Toronto的用户数据抽象出来,而 avg_female_salary 则计算女性平均工资。

WITH toronto_ppl AS (
SELECT DISTINCT name FROM population WHERE country = 'Canada' AND city = 'Toronto'
), avg_female_salary AS (
SELECT AVG(salary) as avgSalary FROM salaries WHERE gender = 'Female'
)
SELECT name, salary FROM People WHERE name IN (SELECT name FROM toronto_ppl) AND salary > (
SELECT avgSalary FROM avg_female_salary
);

2. 递归CTEs

递归CTE具有自我引用特性,适用于处理层级数据,比如组织架构图中的上级至员工关系。递归CTE的应用场景包括查询文件系统、网页链接图等分层数据。以下是一个获取每个员工ID管理者ID的递归CTE实例:

WITH org_structure AS (
SELECT id, manager_id FROM staff_members WHERE manager_id IS NULL
UNION ALL
SELECT sm.id, sm.manager_id FROM staff_members sm
INNER JOIN org_structure os ON os.id = sm.manager_id
)

3. 临时函数

在需要重复使用复杂逻辑时,临时函数能派上用场。例如,下面的资历函数可以通过CASE WHEN分解,为每个员工分配不同的级别:

CREATE TEMPORARY FUNCTION get_seniority(tenure INT64) AS (
CASE WHEN tenure < 1 THEN 'analyst'
WHEN tenure BETWEEN 1 AND 3 THEN 'associate'
WHEN tenure BETWEEN 3 AND 5 THEN 'senior'
WHEN tenure > 5 THEN 'vp'
ELSE 'n/a'
END
);
SELECT name, get_seniority(tenure) AS seniority FROM employees;

4. 使用CASE WHEN枢转数据

CASE WHEN不仅适合编写条件语句,还能用来枢转数据。例如,可以通过CASE WHEN将多个月的收入数据合并为单一列:

SELECT 
CASE
WHEN month = 'Jan' THEN revenue
ELSE NULL
END AS Jan_Revenue
FROM monthly_data;

5. EXCEPT vs NOT IN

EXCEPT和NOT IN虽然都用于比较两张表,但细微差别在于它们过滤数据的方式。EXCEPT会删除重复行并保留唯一值,而NOT IN会比较两个表的行是否完全一致。

6. 自联结

尽管自联结看似复杂,但在一些场景下却非常实用。例如,下面的自联结查询可以找出比管理人员工资更高的员工:

SELECT a.Name as Employee FROM Employee a
JOIN Employee b ON a.ManagerID = b.Id
WHERE a.Salary > b.Salary;

7. RANK vs DENSE_RANK vs ROW_NUMBER

在SQL中,您可以使用RANK、DENSE_RANK和ROW_NUMBER等函数来为数据排序。RANK函数会跳过重复值,而DENSE_RANK则不会留下间隔。以下是其中一个示例:

SELECT 
Name,
GPA,
ROW_NUMBER() OVER (ORDER BY GPA DESC),
RANK() OVER (ORDER BY GPA DESC),
DENSE_RANK() OVER (ORDER BY GPA DESC)
FROM student_grades;

8. 计算Delta值

当您需要比较不同时间段的数据时,LAGLEAD函数特别有用。例如,可以计算本月与上个月销售额的差异:

SELECT 
month,
sales,
sales - LAG(sales, 1) OVER (ORDER BY month) AS month_over_month
FROM monthly_sales;

9. 计算运行总数

如果您需要生成累计数据,使用SUM函数搭配窗口函数就能轻松实现。以下是一个累计营收额的示例:

SELECT 
Month,
Revenue,
SUM(Revenue) OVER (/order by Month) AS Cumulative
FROM monthly_revenue;

10. 日期时间操纵

在处理日期时间数据时,掌握一些关键函数至关重要。比如,可以用DATE_DIFF计算两个日期之间的差异:

SELECT 
a.Id,
a.RecordDate,
a.Temperature,
b.RecordDate,
DATEDIFF(a.RecordDate, b.RecordDate) as diff_date
FROM Weather a
JOIN Weather b ON a.Temperature > b.Temperature;

总结

掌握以上10个SQL高级技巧不仅有助于您在面试中脱颖而出,还能让您在日常工作中更加高效。希望这篇文章对您有所帮助,祝您学习愉快!

转载地址:http://ureyk.baihongyu.com/

你可能感兴趣的文章
ado filter 多条记录_Excel 有了Filter函数VLOOKUP函数要靠边站了
查看>>
ado读取多条oracle数据,Oracle ADO数据存取
查看>>
anaconda新建python2环境安装不了jupyterlab_anaconda3安装及jupyter环境配置教程(全)...
查看>>
android asynctask handler 区别,AsyncTask与Thread+Handler简要分析
查看>>
android fastjson漏洞_初识Fastjson漏洞(环境搭建及漏洞复现)
查看>>
android pod 组件化_CocoaPods 组件化实践 - 私有Pod
查看>>
android进程管理策略,Android进程保活
查看>>
arduino蓝牙通讯代码_arduino 联接蓝牙模块
查看>>
asp.mvc 4项目发布文件目录结构_如何用SpringBoot(2.3.3版本)快速搭建一个项目?文末有小彩蛋...
查看>>
aspen串联反应怎么输入_如何进步提升串联谐振试验装置的稳定性
查看>>
aspose html转pdf_Java实现Word/Pdf/TXT转html
查看>>
a推b等价于非a或b_AB胶/蜜月胶常见问题的原因分析及解决方法
查看>>
bat 命令返回结果_【批处理】带你入门命令行
查看>>
c++ string取子串_Integer与String的设计哲学
查看>>
c++ 数组批量赋值_数组之间不能赋值?穿个马甲吧!
查看>>
cad模糊查询符号_mysql 正则模式和like模糊查询
查看>>
continue可以用if判断里面吗_谁能说说if()else()里的continue是干嘛的?
查看>>
ctrl c 和 ctrl v 不能用了_神奇操作,原来CTRL键还能这么用
查看>>
cytoscape安装java_Cytoscape史上最全攻略
查看>>
c语言程序设计年历显示,C语言程序设计报告《万年历》.doc
查看>>