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

SQL中的子查询和CTE(with ....as..)

第一次看到with as 这种类似于python中读文件的写法还是挺疑惑的,其实它是CTE,功能和子查询很类似但又有不同点,在实际应用场景中具有着独特作用。

子查询

子查询是在主查询中的嵌套查询,可以出现在SELECT、FROM、WHERE等子句中。子查询可以是标量子查询、行子查询或表子查询。

优点:

    •    简单的查询结构,对于小规模查询可以很方便地使用。
    •    适用于一次性使用的临时计算。

缺点:

    •    可读性差:嵌套查询可能使SQL语句变得难以理解,特别是当嵌套层次较深时。
    •    不能复用:子查询只能在定义它的查询中使用,无法在其他地方重用。

CTE(Common Table Expressions)

CTE是在SQL语句的开头使用WITH关键字定义的临时结果集,随后可以在主查询中引用这个结果集。CTE在某些数据库系统中也被称为”公用表表达式”。
优点:

    •    可读性好:将复杂的查询分解为多个易于理解的部分。
    •    复用性强:同一个CTE可以在主查询中多次引用,提高查询的效率。
    •    递归查询:CTE支持递归查询,这是子查询无法做到的。

缺点:

    •    对于简单的查询可能显得冗余,不如子查询简洁。
    •    性能上不一定优于子查询,具体视情况而定,需要根据具体数据库和查询场景测试性能。

适用场景

子查询适用于:

    •    简单查询或一次性使用的临时计算。
    •    嵌套在WHERE、FROM或SELECT子句中时。

CTE适用于:

    •    复杂查询,将复杂查询分解为多个易于理解的部分。
    •    需要在查询中多次引用同一结果集时。
    •    递归查询,处理层次结构数据(如组织结构图、树形结构等)。

示例

假设我们有一个employees表,我们想要找出每个部门工资最高的员工:

-- 使用子查询
SELECT department_id, employee_id, salary
FROM employees e1
WHERE salary = (SELECT MAX(salary)FROM employees e2WHERE e2.department_id = e1.department_id
);-- 使用CTE
WITH MaxSalaries AS (SELECT department_id, MAX(salary) AS max_salaryFROM employeesGROUP BY department_id
)
SELECT e.department_id, e.employee_id, e.salary
FROM employees e
JOIN MaxSalaries ms ON e.department_id = ms.department_id AND e.salary = ms.max_salary;

在这个例子中,使用CTE显得更清晰,因为这将最大工资的计算与主查询分离开来,使得整个查询结构更易于理解和维护。

http://www.lryc.cn/news/387289.html

相关文章:

  • Cesium 基本概念:创建实体和相机控制
  • vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果
  • 在Ubuntu 16.04上安装和配置GitLab的方法
  • STM32的SPI通信
  • 机器学习引领教育革命:智能教育的新时代
  • 6月29日,每日信息差
  • SpringCloud中复制模块然后粘贴,文件图标缺少蓝色方块
  • JS乌龟吃鸡游戏
  • 第十节:学习ConfigurationProperties类来配置pojo实体类参数(自学Spring boot 3.x的第二天)
  • 如何学习Node.js
  • 云计算基础知识
  • 基于单片机光纤测距系统的设计与实现
  • python项目实战——人生重开模拟器
  • 小时候的子弹击中了现在的我-hive进阶:案例解析(第18天)
  • 电影票房预测管理系统设计
  • 正则表达式与Pyhton
  • Transformer常见面试题
  • Linux——vim的配置文件+异常处理
  • node mySql 实现数据的导入导出,以及导入批量插入的sql语句
  • Webpack: 底层配置逻辑
  • 数字图像处理期末复习题1
  • poi-tl 生成 word 文件(插入文字、图片、表格、图表)
  • centos上部署Ollama平台,实现语言大模型本地部署
  • Java学习 - Redis Redigo简单介绍
  • 【鸿蒙学习笔记】ArkTS组件 Blank
  • 如何使用Spring Boot进行单元测试
  • 2024steam夏促商店打不开、steam活动加载不了解决方法一览
  • IPC进程通信:QNX
  • OpenCV学习之cv2.imshow()函数
  • Oracle、MySQL、PostGreSQL、SQL Server-空值