返回

挑战你的SQL功底:10道进阶练习题,含数据与解答

后端

掌握 SQL 的 10 大挑战

简介

对于任何渴望掌握 SQL 技能的人来说,练习都是不可或缺的。为了帮助你提高技能水平,我们精心设计了 10 个挑战,涵盖了从数据汇总到数据更新的各种 SQL 概念。在解决这些挑战的过程中,你将巩固对 SQL 的理解并提升你的数据处理能力。

1. 数据汇总

目标:从员工表中提取所有员工的姓名和总工资,并按总工资降序排列。

代码示例:

SELECT name, SUM(salary) AS total_salary
FROM employees
GROUP BY name
ORDER BY total_salary DESC;

解释:

此查询使用 SUM() 函数计算每个员工的总工资,并按降序排列结果。

2. 数据分组

目标:将产品表中的产品按价格范围分组,并统计每组产品的数量。

代码示例:

SELECT
    CASE
        WHEN price < 10 THEN '0-9'
        WHEN price >= 10 AND price < 20 THEN '10-19'
        WHEN price >= 20 AND price < 30 THEN '20-29'
        ELSE '30+'
    END AS price_range,
    COUNT(*) AS product_count
FROM products
GROUP BY price_range;

解释:

此查询使用 CASE 语句将产品分为不同的价格范围,然后使用 COUNT() 函数统计每组中的产品数量。

3. 数据连接

目标:从订单表和产品表中提取订单号、产品名称和产品价格,并按产品价格降序排列。

代码示例:

SELECT o.order_id, p.product_name, p.price
FROM orders o
JOIN products p ON o.product_id = p.product_id
ORDER BY price DESC;

解释:

此查询使用 JOIN 语句将订单表和产品表连接起来,提取有关订单和产品的相关信息。

4. 数据过滤

目标:从客户表中提取所有居住在加州且购买金额超过100美元的客户姓名和购买金额。

代码示例:

SELECT name, SUM(amount) AS total_amount
FROM customers
WHERE state = 'CA'
GROUP BY name
HAVING total_amount > 100;

解释:

此查询使用 WHEREHAVING 子句过滤出符合特定条件的客户记录。

5. 数据更新

目标:将产品表中价格低于10美元的产品价格更新为10美元。

代码示例:

UPDATE products
SET price = 10
WHERE price < 10;

解释:

此查询使用 UPDATE 语句修改满足特定条件的产品的价格。

6. 数据删除

目标:从产品表中删除所有价格为0的产品。

代码示例:

DELETE FROM products
WHERE price = 0;

解释:

此查询使用 DELETE 语句从表中删除满足特定条件的行。

7. 子查询

目标:从订单表中提取订单金额大于子查询中平均订单金额的订单号和订单金额。

代码示例:

SELECT order_id, amount
FROM orders
WHERE amount > (
    SELECT AVG(amount)
    FROM orders
);

解释:

此查询使用子查询计算平均订单金额,然后使用 WHERE 子句筛选出金额高于平均水平的订单。

8. 窗口函数

目标:从销售表中提取每个产品在过去3个月内的累计销售额。

代码示例:

SELECT product_id, SUM(sales) OVER (
    PARTITION BY product_id
    ORDER BY date
    ROWS BETWEEN INTERVAL '3 months' PRECEDING AND CURRENT ROW
) AS cumulative_sales
FROM sales;

解释:

此查询使用 OVER 子句应用窗口函数,计算每个产品在指定的期间内的累计销售额。

9. 存储过程

目标:创建一个存储过程,接收一个产品ID作为参数,并返回该产品的详细信息。

代码示例:

CREATE PROCEDURE GetProductDetails(@product_id INT)
AS
BEGIN
    SELECT *
    FROM products
    WHERE product_id = @product_id;
END;

解释:

存储过程允许你封装可重用的代码块,并使用参数传递数据。

10. 触发器

目标:创建一个触发器,当产品表中的产品价格发生变化时,自动将产品价格变化记录到日志表中。

代码示例:

CREATE TRIGGER ProductPriceChange ON products
AFTER UPDATE
AS
BEGIN
    INSERT INTO product_price_changes (product_id, old_price, new_price)
    SELECT product_id, OLD.price, NEW.price
    FROM products
    WHERE product_id IN (SELECT product_id FROM inserted);
END;

解释:

触发器允许你定义在特定数据库操作(例如更新)发生时自动执行的动作。

结论

通过解决这些挑战,你将显著提升你的 SQL 技能,为更复杂的数据库操作做好准备。记住,实践是掌握任何技能的关键,因此不断练习和探索新的 SQL 挑战至关重要。

常见问题解答

1. 如何开始学习 SQL?

许多在线和离线资源都可以帮助你入门 SQL,例如教程、课程和书籍。选择一种适合你学习风格和可用时间的方法。

2. 掌握 SQL 需要多长时间?

掌握 SQL 的时间取决于你的个人能力、学习速度和投入的努力。持续练习和解决问题是提高技能的关键。

3. SQL 在哪些领域有用?

SQL 在广泛的领域中都有应用,包括数据分析、数据管理、商业智能和软件开发。

4. SQL 的职业前景如何?

对 SQL 熟练的人才需求不断增长,因为数据分析和数据驱动的决策在各个行业变得越来越重要。

5. 学习 SQL 的最佳方法是什么?

实践、练习、再练习!解决问题、尝试不同的查询并探索 SQL 的不同功能是提高技能的最佳方法。