子查询(Subquery)是SQL查询中非常强大且常用的功能,它允许在一个查询语句中嵌套另一个查询。子查询可以出现在SELECT、FROM、WHERE和HAVING子句中,用于进一步限定或计算数据。以下是子查询在实际项目中的一些应用案例:
SELECT department_id, department_name, avg_salary
FROM departments d
WHERE avg_salary = (
SELECT MAX(avg_salary)
FROM (
SELECT AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
) AS dept_avg_salary
);
在这个例子中,内层的子查询计算了每个部门的平均工资,外层的子查询则找出了这些平均工资中的最大值,最外层的查询根据这个最大值筛选出对应的部门。
假设我们有两个表:customers(客户表)和orders(订单表)。我们想要找出那些没有任何订单的客户。
SELECT *
FROM customers c
WHERE customer_id NOT IN (
SELECT DISTINCT customer_id
FROM orders
);
在这个例子中,子查询从orders表中选取了所有有订单的客户的ID,然后主查询从customers表中排除了这些ID,从而得到了没有订单的客户。
假设我们有一个sales表,其中包含销售员的ID、销售额等信息。我们想要找出那些销售额超过所有销售员平均销售额的销售员。
SELECT salesperson_id, total_sales
FROM sales
WHERE total_sales > (
SELECT AVG(total_sales)
FROM sales
);
在这个例子中,子查询计算了所有销售员的总销售额的平均值,主查询则筛选出那些总销售额超过这个平均值的销售员。
SELECT product_id, product_name, total_quantity
FROM products p
JOIN (
SELECT product_id, SUM(quantity) AS total_quantity
FROM order_items
GROUP BY product_id
) AS product_sales ON p.product_id = product_sales.product_id
ORDER BY total_quantity DESC;
在这个例子中,子查询计算了每个产品的总销售数量,然后主查询通过JOIN操作将这个结果与products表连接起来,并按销售数量降序排列。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。