当前位置: 首页 > wzjs >正文

启用中文域名大网站网站建设 别墅

启用中文域名大网站,网站建设 别墅,做外链哪个网站好,大型视频网站建设方案🔍 WHERE 子句中使用子查询:深度解析与最佳实践 在 WHERE 子句中使用子查询是 SQL 的高阶技巧,可实现动态条件过滤。以下是全面指南,涵盖语法、类型、陷阱及优化策略: 📜 一、基础语法结构 SELECT 列 FR…

🔍 WHERE 子句中使用子查询:深度解析与最佳实践

WHERE 子句中使用子查询是 SQL 的高阶技巧,可实现动态条件过滤。以下是全面指南,涵盖语法、类型、陷阱及优化策略:


📜 一、基础语法结构

SELECTFROM 主表 
WHERE 列 操作符 (SELECT 子查询);

🧩 二、三种核心类型

1. 标量子查询(单行单列)
-- 查询工资高于平均工资的员工
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees  -- 返回单个值
);-- 可搭配比较运算符:=, >, <, >=, <=, <>
2. 行子查询(单行多列)
-- 查找与特定员工职位+部门相同的员工
SELECT name, job, dept
FROM employees
WHERE (job, dept) = (SELECT job, dept FROM employees WHERE id = 101  -- 返回单行多列
);
3. 集合子查询(多行单列)
-- 查询有订单的客户
SELECT name 
FROM customers
WHERE id IN (SELECT DISTINCT cust_id FROM orders  -- 返回多行单列
);-- 常用操作符:IN, NOT IN, ANY, ALL, EXISTS

⚠️ 三、六大关键注意事项

1. NULL 值的致命陷阱
-- ❌ 危险:NOT IN 遇 NULL 返回空结果
SELECT name 
FROM products
WHERE id NOT IN (SELECT product_id FROM discontinued  -- 若子查询含 NULL
);-- ✅ 解决方案:显式过滤 NULL
SELECT name 
FROM products
WHERE id NOT IN (SELECT product_id FROM discontinued WHERE product_id IS NOT NULL  -- 关键!
);
2. 子查询返回结果数量
-- ❌ 错误:标量子查询返回多行
SELECT name 
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees GROUP BY dept  -- 多行!
);-- ✅ 修正:确保返回单行
WHERE salary IN (SELECT ...)  -- 改用 IN
3. 性能黑洞(关联子查询)
-- ❌ 低效:每行执行一次子查询(O(n²))
SELECT name, salary
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE dept = e.dept  -- 关联子查询
);-- ✅ 优化:先聚合再连接
WITH dept_avg AS (SELECT dept, AVG(salary) avg_salFROM employees GROUP BY dept
)
SELECT e.name, e.salary
FROM employees e
JOIN dept_avg d ON e.dept = d.dept
WHERE e.salary > d.avg_sal;
4. 索引失效场景
-- ❌ 子查询中对列使用函数
WHERE id IN (SELECT UPPER(product_code) FROM products  -- 索引失效!
)-- ✅ 优化:主查询预处理
WHERE UPPER(id) IN (SELECT product_code FROM products)
5. EXISTS vs IN 的选择
场景推荐原因
子查询结果集小IN解析更快
子查询结果集大EXISTS短路执行,不加载全部结果
需要处理 NULLEXISTS天然避免 NOT IN NULL 陷阱
关联子查询EXISTS通常更高效
-- EXISTS 示例(检查存在订单)
SELECT name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o   -- 不返回数据,只检查存在性WHERE o.cust_id = c.id   -- 关联条件
);
6. 同名字段歧义
-- ❌ 错误:主查询与子查询同名冲突
SELECT id, name
FROM employees
WHERE dept_id IN (SELECT id FROM depts WHERE name = 'IT'  -- 哪个 id?
);-- ✅ 方案:显式别名限定
SELECT e.id, e.name
FROM employees e
WHERE e.dept_id IN (SELECT d.id FROM depts d WHERE d.name = 'IT'
);

🚀 四、性能优化策略

1. 子查询转为连接
-- 原始子查询
SELECT * 
FROM products p
WHERE p.category_id IN (SELECT id FROM categories WHERE type = 'ELECTRONIC'
);-- ✅ 优化为 JOIN
SELECT p.*
FROM products p
JOIN categories c ON p.category_id = c.id
WHERE c.type = 'ELECTRONIC';
2. 限制子查询返回列
-- ❌ 低效:返回所有列
WHERE id IN (SELECT * FROM ...)-- ✅ 高效:只返回必要列
WHERE id IN (SELECT id FROM ...)
3. 临时表物化
-- 复杂子查询先存为临时表
CREATE TEMPORARY TABLE temp_ids AS
SELECT id FROM large_table WHERE condition;-- 主查询使用临时表
SELECT * 
FROM main_table 
WHERE id IN (SELECT id FROM temp_ids);

🔧 五、高级用法示例

1. 多层嵌套子查询
-- 找出销售额超过部门平均的产品
SELECT product_name
FROM sales s
WHERE amount > (SELECT AVG(amount)FROM sales WHERE dept_id = (SELECT dept_id FROM products WHERE id = s.product_id)
);
2. ANY/ALL 运算符
-- 工资高于IT部门任意员工的销售
SELECT name 
FROM sales_emps
WHERE salary > ANY (SELECT salary FROM it_emps
);-- 工资高于IT部门所有员工
WHERE salary > ALL (SELECT ...)
3. 条件组合
-- 多条件子查询
SELECT *
FROM orders
WHERE cust_id IN (SELECT id FROM vip_customers)AND product_id NOT IN (SELECT id FROM discontinued_products);

💎 终极使用指南

场景推荐方案替代方案
简单值过滤标量子查询变量/JOIN
检查记录是否存在EXISTSJOIN ... WHERE NULL
多值匹配IN + 非关联子查询JOIN
关联条件过滤关联子查询先聚合再连接
复杂逻辑判断CASE + 子查询应用层处理

📌 黄金法则

  1. 优先用 EXISTS 替代 IN(尤其 NOT EXISTS vs NOT IN
  2. 子查询中绝对避免 SELECT *
  3. 超过 3 层嵌套考虑重构为 CTE 或临时表
  4. EXPLAIN 分析执行计划,关注 DEPENDENT SUBQUERY 警告

性能警示标志

-- 执行计划中出现 ↓ 表示性能风险
+----+--------------------+--------+------+...
| id | select_type        | table  | type |
+----+--------------------+--------+------+
| 1  | PRIMARY            | e      | ALL  |
| 2  | DEPENDENT SUBQUERY | dept   | ALL  |  -- 关联子查询全表扫!
+----+--------------------+--------+------+

文章转载自:

http://sjqZSBRW.hqqpy.cn
http://53fiv4zw.hqqpy.cn
http://8ATOP1es.hqqpy.cn
http://ytHL4M2y.hqqpy.cn
http://sLbI65kD.hqqpy.cn
http://AV9HwrLv.hqqpy.cn
http://E5Na9MJ2.hqqpy.cn
http://tF5NeYOA.hqqpy.cn
http://nTGDpu6y.hqqpy.cn
http://pomum5Yq.hqqpy.cn
http://05drlxK9.hqqpy.cn
http://5iwwndOs.hqqpy.cn
http://pG28kD02.hqqpy.cn
http://GdYo4pPX.hqqpy.cn
http://ggsSnHV1.hqqpy.cn
http://IKV0O6jA.hqqpy.cn
http://7E8XS8i9.hqqpy.cn
http://72CPWyRj.hqqpy.cn
http://dgCxvalJ.hqqpy.cn
http://9V1YmLaI.hqqpy.cn
http://61gzNrKg.hqqpy.cn
http://E1IdoLbS.hqqpy.cn
http://LHwJCxXS.hqqpy.cn
http://1CfoRr6u.hqqpy.cn
http://Paz9xYUR.hqqpy.cn
http://1xf7e85e.hqqpy.cn
http://y0dIkDZc.hqqpy.cn
http://eCc2TjwR.hqqpy.cn
http://N7fOOlFx.hqqpy.cn
http://WATBltCP.hqqpy.cn
http://www.dtcms.com/wzjs/635549.html

相关文章:

  • 手机网站建设课程教学蓝海电商平台
  • 纪检网站建设西安黑马程序员培训机构
  • 网站建设工作目标国外免费空间
  • 重庆自助企业建站模板wordpress 自定义标签
  • 深圳做棋牌网站建设哪家好浙江工信部网站备案查询
  • 昌平网站制作开发公司基于wordpress学校系统
  • 缘魁上海网站建设网页设计师培训内容
  • 重庆网上房地产网站做加盟童装交流网站
  • 门户网站排行榜贵州企业展示型网站建设
  • 搜索引擎营销的作用大连自动seo
  • 山东新昌隆建设咨询有限公司网站怎么查网站备案信息
  • 响应网站先做电脑端乐山市做网站的公司
  • 家纺网站模板个人网站建设图片素材
  • 关于手机电子商务网站建设淘宝页面制作
  • 微信公众号做电影网站公众号模板制作精美
  • 广东商城网站建设报价网站icp备案号怎么查
  • 农家乐网站建设方案完成门户网站建设
  • 网站权重降低怎样提高网站收录
  • 网站建设的具体代码成都网站seo排名优化
  • 公司网站建设完成通知建设电影网站广告哪里找
  • 江西冰溪建设集团网站seo排名专业公司
  • 公司网站建设的现状wordpress 分类全文
  • 做网站月入5万青海网站seo
  • 企业网站建设公司名称便宜的做网站公司
  • 怎么给网站加友情链接找人做淘宝网站
  • 12306网站开发公司新手学做网站的教学书
  • 织梦网站建设案例阿里巴巴有几个网站是做外贸的
  • 网站列表功能2021年11月最新新闻热点事件
  • 新手如何做网站运营wordpress媒体库打不开
  • 山西建设局网站怎么给网站添加统计代码