子查询入门|标量 / 行 / 列子查询,简化复杂查询

发布时间:2026/5/30 11:45:35

子查询入门|标量 / 行 / 列子查询,简化复杂查询 前言我们已经学会用多表 JOIN 完成复杂业务查询但在很多场景下先查一个值 / 一列 / 一行再用它做条件会更简单直观这就是子查询。子查询是 SQL 从 “会用” 到 “熟练” 的关键台阶也是面试与日常开发高频用法。本篇从定义、分类、语法、场景、案例、避坑完整精讲带你一次性掌握标量子查询、列子查询、行子查询三大基础类型代码可直接复制运行一、本章知识点汇总子查询定义与执行逻辑子查询三大基础类型标量、列、行标量子查询返回单行单列用 列子查询返回单列多行用IN / ANY / ALL行子查询返回单行多列用复合条件匹配子查询书写位置SELECT / WHERE / FROM三大子查询实战案例用户 - 订单 - 商品场景子查询与 JOIN 简单对比高频注意事项与职场规范课后练习题 思路二、各知识点详解1. 什么是子查询子查询嵌套查询在一个 SQL 内部嵌套另一个 SELECT 查询先执行内层查询把结果交给外层查询使用。外层查询主查询内层查询子查询子查询必须用( )包裹执行顺序先子查询后主查询2. 三大基础子查询按返回结果分类表格类型返回结果可用操作符常用位置难度标量子查询单行单列一个值 WHERE / SELECT★☆☆列子查询单列多行一列值IN / ANY / ALLWHERE★★☆行子查询单行多列一组值多字段组合匹配WHERE★★★3. 标量子查询最常用、最简单核心定义返回一行一列一个值数字、字符串、日期。适用场景查单个值做条件高于平均分、最新时间、最大 IDSELECT 里动态加计算列语法sqlSELECT 字段 FROM 表 WHERE 字段 (标量子查询);4. 列子查询条件范围查询核心定义返回一列多行一列表数据相当于一个值列表。适用场景查询在某个集合内的数据所有有订单的用户、买过某类商品的人替代多表连接简化逻辑常用关键字IN在列表中任意一个ANY满足任意一个ALL满足所有5. 行子查询多字段组合匹配核心定义返回一行多列用于同时匹配多个字段的场景。适用场景同时匹配部门 职位、分类 价格、用户 状态简化多条件并列写法语法sqlWHERE (字段1,字段2) (行子查询)三、实战环境准备直接复制运行沿用前面电商表结构确保连贯学习sql-- 用户表 CREATE TABLE users ( user_id INT PRIMARY KEY, user_name VARCHAR(20) NOT NULL ); -- 订单表 CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_time DATE ); -- 商品表 CREATE TABLE goods ( goods_id INT PRIMARY KEY, goods_name VARCHAR(30), price DECIMAL(10,2) ); INSERT INTO users VALUES (1,张三),(2,李四),(3,王五),(4,赵六); INSERT INTO orders VALUES (1001,1,299,2024-06-01), (1002,2,420,2024-06-02), (1003,3,88,2024-06-03); INSERT INTO goods VALUES (1,笔记本,299),(2,键盘,159),(3,T恤,99);四、应用案例及结果分析案例 1标量子查询实战高频需求 1查询订单金额高于平均金额的订单sqlSELECT * FROM orders WHERE amount (SELECT AVG(amount) FROM orders);子查询先算平均订单金额外层筛选大于平均值的订单典型报表筛选用法需求 2SELECT 中使用标量子查询动态列查询所有订单并显示订单总金额全局总计sqlSELECT order_id, user_id, amount, (SELECT SUM(amount) FROM orders) AS total_amount FROM orders;案例 2列子查询实战范围匹配需求查询下过订单的所有用户信息sqlSELECT * FROM users WHERE user_id IN (SELECT DISTINCT user_id FROM orders);子查询返回所有有订单的 user_id 列表外层 IN 匹配只保留有订单的用户等价于内连接但更简洁案例 3行子查询实战组合匹配需求查询与订单 1001同用户、同金额的订单sqlSELECT * FROM orders WHERE (user_id, amount) ( SELECT user_id, amount FROM orders WHERE order_id1001 );一次性匹配两个字段比写user_idxx AND amountxx更简洁五、注意事项标量子查询必须只返回 1 个值返回多行 → 报错子查询返回多于 1 行列子查询只能返回 1 列多列会直接语法错误行子查询字段数量、类型必须一一对应子查询尽量简单不要嵌套过深可读性差能用子查询简化就不用复杂 JOIN但超大表优先 JOIN不要在子查询里用 ORDER BY无意义、影响性能条件优先放WHERE少用 HAVING 子查询六、核心总结子查询 查询嵌套查询先内后外执行三大基础类型标量单行单列 → 用 列单列多行 → 用IN / ANY / ALL行单行多列 → 组合匹配标量子查询最常用平均值、最大值、动态列列子查询适合范围筛选、存在性判断行子查询适合多字段同时匹配子查询让复杂逻辑分步拆解更易读、易维护一句话记忆标量返回一个值列是列表用 IN行是组合多字段子查询先内后外真省心七、课后实战练习题附思路题目 1用标量子查询查询价格高于所有商品平均价的商品名称、价格。题目 2用列子查询查询没有下过订单的用户NOT IN。题目 3用行子查询查询和 “张三” 同一个用户、且金额相同的所有订单。参考答案思路题目 1sqlSELECT goods_name, price FROM goods WHERE price (SELECT AVG(price) FROM goods);题目 2sqlSELECT * FROM users WHERE user_id NOT IN (SELECT DISTINCT user_id FROM orders);题目 3sqlSELECT * FROM orders WHERE (user_id, amount) ( SELECT user_id, amount FROM orders WHERE user_id (SELECT user_id FROM users WHERE user_name张三) );

相关新闻