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

《SQL基础教程》第五章 SQL进阶之路:掌握高级查询的核心技巧

🔍 一、为什么需要高级查询?

实际业务中常需解决:

  • 跨表关联分析(如订单关联用户信息)
  • 动态分组统计(如部门平均工资排名)
  • 复杂条件过滤(如筛选高于部门平均薪水的员工)

 

⚙️ 二、子查询:SQL的嵌套思维

​本质​​:将一个查询结果作为另一个查询的条件或数据源

​分类与典型场景​​:

类型返回值应用场景举例示例片段(简写)
​标量子查询​单值比较薪资是否高于部门平均值SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp)
​关联子查询​多行关联按部门动态计算参照值SELECT name, salary FROM emp e1 WHERE salary > (SELECT AVG(salary) FROM emp e2 WHERE e1.dept=e2.dept)
​派生表查询​临时表多步骤数据处理SELECT * FROM (SELECT dept, AVG(salary) avg_sal FROM emp GROUP BY dept) AS t WHERE avg_sal > 10000

​避坑指南​​:

  • 关联子查询中必须建立内外层关联(如e1.dept=e2.dept
  • 避免在WHERE子句直接使用聚合函数(需用子查询替代)

 

🔗 三、关联查询:多表连接的魔法

​核心语法​​:

SELECT 列 
FROM 表A 
[INNER|LEFT|RIGHT] JOIN 表B ON 连接条件

​三大连接类型对比​​:

连接类型保留数据范围典型应用场景
​INNER JOIN​两表交集数据查询有订单的用户信息
​LEFT JOIN​左表全量+右表匹配统计所有用户的订单量(含零订单)
​RIGHT JOIN​右表全量+左表匹配展示所有商品及其购买记录(含未售)

6

7

实战案例​​:

-- 查询所有员工及其经理名(含无经理员工) 
SELECT e.name, m.name AS manager 
FROM employees e 
LEFT JOIN employees m ON e.manager_id = m.id;

📐 四、函数与计算:数据加工利器

​常用函数工具箱​​:

/* 字符串处理 */ 
CONCAT('姓', '名') → '姓名' -- 拼接字符串[1](@ref) 
SUBSTRING('SQL教程', 1, 3) → 'SQL' -- 截取子串 
/* 日期计算 */ 
DATEDIFF('2025-06-10', NOW()) -- 计算日期差 
DATE_FORMAT(NOW(), '%Y年%m月') -- 格式化日期 
/* 类型转换 */ 
CAST('123' AS SIGNED) -- 字符串转数字 
COALESCE(NULL, 0) -- NULL替换为0[1,6](@ref)

🔄 五、进阶查询技巧

  1. ​去重查询(DISTINCT)​

    SELECT DISTINCT dept FROM emp; -- 获取唯一部门列表
  2. ​合并查询结果(UNION)​

    -- 合并不同表结构相似数据(自动去重) 
    SELECT name FROM users UNION 
    SELECT 
    cust_name FROM orders;[6,7](@ref)

  3. ​分组排序(窗口函数)​

    -- 按部门薪资排名(SQLite/MySQL 8.0+支持) 
    SELECT name, salary, RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank 
    FROM emp;[6](@ref)

  4. ​转置查询(行转列)​

    -- 将季度销售数据转为横向统计 
    SELECT product, SUM(CASE WHEN quarter='Q1' THEN sales END) AS Q1, SUM(CASE WHEN quarter='Q2' THEN sales END) AS Q2 
    FROM sales GROUP BY product;[6](@ref)

💎 六、性能与安全建议

  • ​索引优化​​:JOIN字段、WHERE条件列建索引提速
  • ​子查询陷阱​​:避免多层嵌套,改用JOIN或临时表
  • ​防笛卡积​​:JOIN必须写ON条件!
http://www.xdnf.cn/news/906139.html

相关文章:

  • 2.1 Windows编译环境介绍
  • Caliper 配置文件解析:config.yaml
  • 加密货币钱包开发指南:多链资产管理与非托管安全范式
  • 关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
  • Appium+python自动化(十一)- 元素定位- 下
  • 串:探索 KMP 算法的高效模式匹配之旅
  • Nestjs框架: nestjs-schedule模块注册流程,源码解析与定时备份数据库
  • 【通义万相 Wan2.1】在并行智算云上的部署教程
  • 跨分割信号的回流路径处理
  • 毫米波雷达基础理论(3D+4D)
  • 【Servo】信号激励;激励数据、采集数据、跟踪数据
  • 我爱学算法之—— 前缀和(中)
  • 进程的详解,命令行参数,程序的地址空间(Linux)
  • 学习日记-day23-6.6
  • C++11异常特性
  • 如何计算光伏工程造价预算表?
  • YUM仓库编译出现`conflicting requests`问题解决方案
  • [Java恶补day17] 41. 缺失的第一个正数
  • AirSim/Cosys-AirSim 游戏开发(三)打包可执行文件
  • spring获取注册的bean并注册到自定义工厂中管理
  • 【大模型】大模型数据训练格式
  • 光纤采集系统
  • grafana-mcp-analyzer:基于 MCP 的轻量 AI 分析监控图表的运维神器!
  • 【计算机网络】HTTP
  • 安徽省N1 叉车司机考试题及答案解析
  • webui无法注册如何配置
  • volka 25个短语动词
  • Android动态广播注册收发原理
  • (4-point Likert scale)4 点李克特量表是什么
  • 基于cornerstone3D的dicom影像浏览器 第二十九章 自定义菜单组件