SQL有时看起来像是一种普通的语言,但它的能力远比人们想象的要强大。
在关于数据分析必备SQL命令的文章中,我无法避免谈论那些绝对必要的命令。你可以在SQL速查表中找到我提到的许多命令的更多细节。
但要增加一些趣味性,并提到一些不太常见但在数据分析中会有用的命令。
即使是最基本的SQL数据分析也离不开这些命令中的至少一些,通常甚至是全部。
它们如此重要,我们甚至可以称之为10条诫命。
没有SELECT,你无法进行任何类似数据分析的操作,因为首先你需要获取数据,这就是SELECT的目的:从一个或多个表中检索数据。
这个示例查询从员工表中检索特定列(first_name
,last_name
,salary
)。它演示了SELECT的基本数据检索功能。
SELECT first_name, last_name, salary FROM employees WHERE department = 'Sales';
WHERE子句用于过滤数据,允许你缩小数据集的范围。
这个示例过滤产品,只显示类别为1且单价大于50的产品。WHERE子句允许使用AND/OR运算符进行多个条件的组合。
SELECT product_name, unit_price FROM products WHERE category_id = 1 AND unit_price > 50;
GROUP BY子句根据列中的相同值将数据组织成组。这样,你可以更容易地总结大量数据。
这个示例按部门对员工进行分组,并计算每个部门的员工数量和平均工资。GROUP BY对于在不同层次上聚合数据是必不可少的。
SELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary FROM employees GROUP BY department;
这是SQL中用于过滤数据的另一个子句。HAVING在聚合之后过滤数据,因此允许在子句中使用聚合函数,这与WHERE不同。
这个示例仅显示产品数量超过10的类别。HAVING过滤分组结果,与WHERE不同,它可以使用聚合函数。
SELECT category, COUNT(*) as product_count FROM products GROUP BY category HAVING COUNT(*) > 10;
JOIN子句允许你将来自两个或多个表的数据结合起来。数据库逻辑要求数据库规范化,这意味着你通常不会在一个表中找到所有需要的数据。如果你不想被限制在一个表的范围内,JOIN是很重要的,它可以避免所谓的‘阿尔卡特拉兹数据分析’。(我刚刚编的。)
这个示例通过匹配客户ID将订单信息与客户详细信息结合起来。JOIN连接来自多个表的相关数据。
SELECT o.order_id, c.customer_name, o.order_date FROM orders o JOIN customers c ON o.customer_id = c.customer_id;
如果你不想依赖SQL的输出逻辑(实际上是逻辑,但说成是心血来潮更戏剧化),请使用ORDER BY。它是一个用于按一个或多个列对结果集进行排序的子句。排序可以是升序(文本数据按字母顺序;数字数据从小到大;日期从旧到新)或降序(文本数据按反字母顺序;数字数据从大到小;日期从新到旧)。
以下示例按价格降序排序产品,然后按名称字母顺序排序。ORDER BY可以按多个列以不同的方向排序。
SELECT product_name, unit_price FROM products ORDER BY unit_price DESC, product_name ASC;
LIMIT子句在你想限制查询返回的行数时很有用。
这个示例显示按销售单位排序的前5个产品。LIMIT将输出限制为特定数量的行,适用于前N项分析。
SELECT product_name, units_sold FROM sales ORDER BY units_sold DESC LIMIT 5;
CASE语句是SQL中if-else逻辑的实现。通过它,你可以动态分组数据(基于条件),标记数据,并派生新列。
这个示例使用条件逻辑将产品分类为不同的价格范围。CASE允许根据条件动态分类数据。
SELECT product_name, CASE WHEN unit_price < 20 THEN '预算' WHEN unit_price < 50 THEN '中档' ELSE '高档' END as price_categoryFROM products;
在数据分析中,去除重复项是常见问题之一,而DISTINCT优雅地解决了这个问题:它只检索唯一值。
以下示例显示类别和供应商的唯一组合。DISTINCT从结果集中消除重复行。
SELECT DISTINCT category, supplier_id FROM products ORDER BY category;
UNION和UNION ALL运算符将两个或多个SELECT语句的结果合并为一个结果。它们之间的区别在于UNION会去除重复项(出现在所有查询输出中的行),而UNION ALL则包含所有行。
这个示例将活跃和停产产品列表合并为一个结果集。UNION合并多个SELECT语句的结果,同时去除重复项。
SELECT product_id, product_name, '活跃' as status FROM current_productsUNIONSELECT product_id, product_name, '停产' FROM discontinued_products;
现在,让我们提到一些可能经常被忽视但可以为SQL数据分析增加更多灵活性的其他命令。
我们列出的命令将在大多数数据分析中常用。它们执行不可避免的分析任务,如获取、过滤、分组和聚合数据。
将它们与这八个额外命令结合使用,你将轻松获得一个灵活的SQL数据分析工具。