上一篇
场景引入:
"老张盯着销售报表发愁——如何快速找出销售额超过部门平均值的明星产品?手动计算?太慢;分开查两次?太麻烦,这时,SQL Server子查询像瑞士军刀般闪亮登场…"
子查询就是嵌套在SQL语句中的查询,像俄罗斯套娃里的另一个查询,它先执行内层查询,再把结果交给外层使用。
SELECT product_name FROM products WHERE price > (SELECT AVG(price) FROM products) -- 这就是子查询
-- 找出比所有产品平均价贵30%的商品 SELECT product_id, product_name FROM products WHERE price > (SELECT AVG(price)*1.3 FROM products)
-- 查询有订单的客户 SELECT customer_name FROM customers WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders)
-- 检查是否存在VIP客户(更高效) SELECT '存在VIP客户' AS result WHERE EXISTS (SELECT 1 FROM customers WHERE is_vip=1)
-- 计算各部门薪资前3名 SELECT d.department_name, t.employee_name, t.salary FROM departments d JOIN (SELECT *, RANK() OVER(PARTITION BY dept_id ORDER BY salary DESC) AS rnk FROM employees) t ON d.dept_id = t.dept_id WHERE t.rnk <= 3
-- 下架30天无销量的商品 UPDATE products SET status = '下架' WHERE product_id NOT IN ( SELECT product_id FROM orders WHERE order_date > DATEADD(day, -30, GETDATE())
❌ 错误认知1:子查询总是性能差
✅ 事实:简单子查询可能比复杂的JOIN更高效
❌ 错误认知2:子查询必须单独运行
✅ 事实:关联子查询依赖外部查询的值(如下例)
-- 关联子查询:找出每个部门工资最高的员工 SELECT e.employee_name, e.salary, e.department_id FROM employees e WHERE e.salary = ( SELECT MAX(salary) FROM employees WHERE department_id = e.department_id -- 注意这里引用外部查询 )
:SQL Server子查询如同SQL语句里的"秘密武器",合理使用时既能保持代码清晰,又能解决复杂逻辑,关键是根据场景选择合适类型,并注意性能优化要点,下次遇到需要"查询中套查询"的需求时,不妨试试这个利器!
(注:本文基于2025年8月前SQL Server最新稳定版功能编写)
本文由 开如意 于2025-08-04发表在【云服务器提供商】,文中图片由(开如意)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/532067.html
发表评论