SQL刷题快速入门(三)

其他章节:
SQL刷题快速入门(一)
SQL刷题快速入门(二)

承接前两个章节,本系列第三章节主要讲SQL中where和having的作用和区别 GROUP BY和ORDER BY作用和区别表与表之间的连接操作(重点)组合查询,都是SQL题目中的常考点,日常中也经常使用

where和having的作用和区别

WHEREHAVING 是 SQL 中用于过滤数据的两个不同子句,它们在查询中的作用和用法有所区别。

WHERE 子句

WHERE 子句用于在查询的 FROM 子句之后,对表中的行进行过滤。它可以根据指定的条件来排除不满足条件的行。WHERE 子句可以与 SELECT, UPDATE, DELETE 等语句一起使用。
主要特点:

  • 用于过滤原始表中的行。
  • 不能与聚合函数一起使用。
  • GROUP BY 子句之前执行。
    示例:
SELECT *
FROM customers
WHERE age > 18;

在这个例子中,WHERE 子句过滤出 customers 表中年龄大于 18 的所有行。

HAVING 子句

HAVING 子句用于在 GROUP BY 子句之后,对分组的结果进行过滤。它通常与聚合函数一起使用,用于指定分组必须满足的条件。HAVING 子句只能与 SELECT 语句一起使用。
主要特点:

  • 用于过滤 GROUP BY 后的分组结果。
  • 可以与聚合函数一起使用。
  • GROUP BY 子句之后执行。
    示例:
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 10;

在这个例子中,GROUP BY 子句按 category 列对 products 表中的行进行分组,并计算每个类别的产品数量。然后 HAVING 子句过滤出产品数量大于 10 的类别。

区别

  • WHERE 用于过滤原始表中的行,而 HAVING 用于过滤分组后的结果。
  • WHERE 不能与聚合函数一起使用,而 HAVING 通常与聚合函数一起使用。
  • WHEREGROUP BY 子句之前执行,HAVINGGROUP BY 子句之后执行。
  • 如果不使用 GROUP BY 子句,则只能使用 WHERE 来过滤数据;如果使用 GROUP BY 子句,则可以使用 HAVING 来对分组后的结果进行进一步的过滤。
    在某些情况下,WHEREHAVING 可以互换使用,但最佳实践是使用 WHERE 来过滤不需要的行,然后使用 HAVING 来过滤分组后的结果。

在 SQL 中,WHEREHAVING 子句都用于过滤数据,但它们在查询中执行的位置和用途有所不同。

  • WHERE 子句用于在聚合操作之前过滤行,它可以与任何类型的 SQL 查询一起使用,包括 SELECT, UPDATE, DELETE 等。
  • HAVING 子句用于在聚合操作之后过滤分组的结果,它只能与 SELECT 语句中的 GROUP BY 子句一起使用。

使用 WHERE 子句的情况:

  • 当你需要根据单个列或表达式的值来过滤行时,可以使用 WHERE 子句。
  • 它可以与 SELECT, UPDATE, DELETE 语句一起使用。
  • 它可以在聚合操作之前执行,因此它可以用来过滤掉那些不会影响聚合结果的行。

使用 HAVING 子句的情况:

  • 当你需要根据聚合函数的结果来过滤分组时,可以使用 HAVING 子句。
  • 它只能在包含 GROUP BY 子句的 SELECT 语句中使用。
  • 它可以在聚合操作之后执行,因此它可以用来过滤掉那些聚合结果不符合特定条件的分组。

示例:

假设你有一个名为 sales 的表,其中包含 product_id, amountdate_sold 列。
如果你想计算每个产品的销售额,并只包括那些销售额大于 100 的产品,你可以使用 WHERE 子句:

SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
HAVING SUM(amount) > 100;

在这个查询中,WHERE 子句被省略了,因为它不是必需的。GROUP BY 子句用于分组数据,而 HAVING 子句用于过滤分组后的结果。
如果你想计算每个产品的销售额,并只包括那些销售额大于 100 的产品,你可以使用 WHERE 子句:

SELECT product_id, SUM(amount) AS total_sales
FROM sales
WHERE amount > 100
GROUP BY product_id;

在这个查询中,WHERE 子句用于过滤行,而 GROUP BY 子句用于分组数据。由于 WHERE 子句在聚合操作之前执行,它会影响聚合结果,因此在这种情况下,HAVING 子句不是必需的。
总的来说,WHEREHAVING 子句的主要区别在于它们在查询中的执行顺序和用途。WHERE 子句用于过滤行,而 HAVING 子句用于过滤分组后的结果。在大多数情况下,你只需要使用其中一个,而不是同时使用它们。

GROUP BY和ORDER BY作用和区别

GROUP BYORDER BY 是 SQL 中两个不同的子句,它们各自有不同的用途和功能:

GROUP BY

GROUP BY 子句用于将查询结果集中的多行数据根据一个或多个列进行分组。它通常与聚合函数(如 COUNT(), MAX(), MIN(), SUM(), AVG() 等)一起使用,以对每个分组进行计算并返回每个分组的聚合结果。
主要用途:

  • 对数据进行分组,以便可以按组别计算数据。
  • 必须与聚合函数一起使用,除非数据库支持选择非聚合列(某些数据库,如 MySQL,允许在 GROUP BY 中选择非聚合列,但这通常不被认为是标准 SQL 的最佳实践)。
    示例:
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category;

在这个例子中,GROUP BY 子句按 category 列对 products 表中的行进行分组,并且计算每个类别的产品数量。

ORDER BY

ORDER BY 子句用于对查询结果集中的数据进行排序。它可以基于一个或多个列进行排序,并且可以指定升序(ASC)或降序(DESC)。
主要用途:

  • 对查询结果进行排序,以便数据按照特定的顺序显示。
  • 不需要与聚合函数一起使用,它可以用于任何查询结果集。
    示例:
SELECT *
FROM products
ORDER BY price DESC;

在这个例子中,ORDER BY 子句按 price 列的降序对 products 表中的行进行排序。

区别

  • GROUP BY 用于对数据进行分组,并通常与聚合函数一起使用,以计算每个分组的统计信息。
  • ORDER BY 用于对查询结果进行排序,无论是否进行了分组。
  • GROUP BY 会影响查询结果的行数(通常行数会减少,因为多行被合并为分组后的单一行),而 ORDER BY 不会改变行数,只是改变行的顺序。
  • GROUP BY 可以与 HAVING 子句一起使用,以过滤分组后的结果,而 ORDER BY 用于在结果被过滤和分组之后进行排序。
    在 SQL 查询中,GROUP BYORDER BY 可以同时使用,先分组再排序。例如:
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
ORDER BY product_count DESC;

在这个例子中,首先按 category 列对产品进行分组并计算每个类别的产品数量,然后按产品数量降序排序。

表与表之间的连接操作(重点)

在 SQL 中,表之间的连接操作用于将两个或多个表的数据结合起来,以便可以查询这些表中的数据。连接操作通常用于关联表中的数据,以便可以基于多个表中的数据进行查询。
以下是几种常见的表连接操作:

内连接 (INNER JOIN)

内连接返回两个表中匹配的行。这意味着,只有当两个表中的行满足连接条件时,它们才会出现在查询结果中。

SELECT column1, column2
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

左连接 (LEFT JOIN)

左连接返回左表(table1)中的所有行,即使在右表(table2)中没有匹配的行。如果右表中没有匹配的行,右表中的列将返回 NULL。

SELECT column1, column2
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

右连接 (RIGHT JOIN)

右连接与左连接类似,但返回的是右表(table2)中的所有行,即使在左表(table1)中没有匹配的行。如果左表中没有匹配的行,左表中的列将返回 NULL。

SELECT column1, column2
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

全连接 (FULL JOIN)

全连接返回左表(table1)和右表(table2)中的所有行。如果一个表中没有匹配的行,则使用 NULL 填充。

SELECT column1, column2
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

自连接 (SELF JOIN)

自连接用于查询一个表中的数据,并将其与同一表中的其他行进行比较。

SELECT table1.column1, table1.column2, table2.column1, table2.column2
FROM table1
INNER JOIN table1 table2
ON table1.common_column = table2.common_column;

交叉连接 (CROSS JOIN)

交叉连接返回两个表中所有可能的组合。

SELECT column1, column2
FROM table1
CROSS JOIN table2;

在选择连接类型时,应考虑实际的数据需求和查询性能。内连接通常是默认连接,除非有特定的理由需要使用其他类型的连接。左连接和右连接通常用于当查询需要包含某些行的数据,即使它们在另一个表中没有匹配的行时。全连接则非常少见,因为它通常会导致大量不必要的数据。自连接用于当需要比较同一表中的数据时。交叉连接则通常用于生成大量的组合数据,但可能会导致性能问题。

组合查询(union连接多个查询语句并去重,带all则不去重)

组合查询,在SQL中通常指的是将两个或多个 SELECT 语句的结果合并成一个结果集的操作。在MySQL中,可以通过 UNIONUNION ALL 关键字来实现组合查询。
以下是关于组合查询的一些关键字及其含义:

  1. UNION:

    • UNION 操作符用于合并两个或多个 SELECT 语句的结果集,并去除重复的行。
    • 所有 SELECT 语句中的列数和数据类型必须相同。
      示例:
    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2;
    
  2. UNION ALL:

    • UNION ALL 操作符与 UNION 类似,但是它不会去除重复的行,而是简单地将结果集合并。
    • 使用 UNION ALL 的查询通常比 UNION 快,因为它不需要去重。
      示例:
    SELECT column_name(s) FROM table1
    UNION ALL
    SELECT column_name(s) FROM table2;
    
  3. ORDER BY:

    • 当使用 UNIONUNION ALL 时,如果需要对最终结果集进行排序,可以在最后一个 SELECT 语句后使用 ORDER BY
    • ORDER BY 应用于 UNION 操作后的整个结果集。
      示例:
    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2
    ORDER BY column_name;
    
  4. LIMIT:

    • 如果需要对组合查询的结果进行限制,可以在最后一个 SELECT 语句后使用 LIMIT
    • LIMIT 通常用于限制返回的行数。
      示例:
    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2
    LIMIT 10;
    

    使用组合查询时,需要注意以下几点:

  • 每个查询选择的列数必须相同。
  • 对应列的数据类型应该兼容。
  • ORDER BY 子句只能放在最后一个 SELECT 语句之后。
  • LIMIT 子句只能放在最后一个 SELECT 语句之后,除非是每个单独的查询都有 LIMIT
    组合查询是处理复杂查询需求时的一个强大工具,它可以帮助你从多个数据源中提取和合并数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5234.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E-Prime2实现List嵌套

用E-Prime实现一个简单的List嵌套,实验流程基于斯特鲁程序(色词一致/不一致实验)。 首先File-New,新建一个空白项目 此时生成流程如下 Experiment Object是实验中被用到的流程或者控件对象,SessionProc是总流程&#x…

JS宏进阶:正则表达式的使用

正则表达式,对于任何一门编程语言来说,都是一种非常强大的工具,主要用于搜索、编辑或操作文本和数据。因此,在JS中,也存在相应的对象new RegExp( ),在本章中,将详细介绍正则表达式在JS宏中的运用…

在 Kubernetes 上快速安装 KubeSphere v4.1.2

目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 (1)时钟 (2)RTC (3)ADC1 &#xf…

JavaScript学习笔记(1)

html 完成了架子, css 做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习 JavaScript,这门语言会让我们的页面能够和用户进行交互。 一、引入方式 1.内部脚本 将 JS 代码定义在 HTML 页面中 Jav…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址:https://www.gaga.gallery 标题:Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源:加利福…

Day 14 卡玛笔记

这是基于代码随想录的每日打卡 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:r…

|Python新手小白中级教程|第三十章:日期与时间(入门)

文章目录 前言一、日期与时间的基本概念二、时间戳1.概念2.形成过程 三、Python的时间格式化符号四、时间元组1.时间元组:2.struct_time元组的属性 五、time库可以干什么总结 前言 大家好呀,BOBO仔回来啦。 说实话,这几天我们学习面向对象的…

代码随想录刷题day13|(链表篇)24.两两交换链表中的结点

目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可,有两个关键点,一是循环何时终止?终止…

PIC单片机设置bootloader程序和app程序地址方法

在调试bootloader和app程序的时候通常都需要设置程序的偏移地址,下面就总结一下使用MPLAB X IDE 设置程序地址的方法。 打开bootloader工程 工程上单击鼠标右键,选择Properties,打工工程属性窗口。 此时会打开项目属性对话框 左边类别选择XC8 Line…

51c大模型~合集105

我自己的原文哦~ https://blog.51cto.com/whaosoft/13101924 #刚刚,ChatGPT开始有了执行力! 现在 AI 智能体可以 24*7 小时为你打工。 2025 刚过去了半个月,OpenAI 在智能体领域「开大」了。 今天,OpenAI 正在为 ChatGPT 推出…

迅为龙芯2K1000开发板/核心板流畅运行Busybox、Buildroot、Loognix、QT5.12系统

硬件配置 国产龙芯处理器,双核64位系统,板载2G DDR3内存,流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 接口全板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIF1、蓝牙、Mini H…

StarRocks强大的实时数据分析

代码仓库:https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始:StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化…

web前端1--基础

(时隔数月我又来写笔记啦~) 1、下载vscode 1、官网下载:Visual Studio Code - Code Editing. Redefined 2、步骤: 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…

基于tldextract提取URL里的子域名、主域名、顶级域

TLD是TopLevel Domain的缩写。‌tldextract‌ 是一个用于从URL中提取子域、主域名和顶级域(TLD)的Python库。它利用公共后缀列表(Public Suffix List)来确保即使是复杂或不常见的URL结构也能被正确解析。tldextract能够处理包括IC…

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似,区别就在于预处理部分存在不同;本文简单介绍了下音频处理的方法,以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…

数据结构之堆排序

文章目录 堆排序版本一图文理解 版本二向下调整建堆向上调整建堆 排升/降序升序 堆排序 版本一 基于已有数组建堆取堆顶元素并删除堆顶元素重新建大根堆,完成排序版本。 图文理解 版本二 前提:必须提供有现成的数据结构堆 数组建堆,首尾…

小菜鸟系统学习Python第三天

1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue

常用排序算法之插入排序

目录 前言 一、基本原理 1.算法步骤 2.动画演示 3.插入排序的实现代码 二、插入排序的时间复杂度 1. 时间复杂度 1.最优时间复杂度 2.最差时间复杂度 3.平均时间复杂度 2. 空间复杂度 三、插入排序的优缺点 1.优点 2.缺点 四、插入排序的改进与变种 五、插入排…

数据分析及应用:经营分析中的综合指标解析与应用

目录 1. 市场份额(Market Share) 2. 客户获取成本(Customer Acquisition Cost, CAC) 3. 客户生命周期价值(Customer Lifetime Value, CLV) 4. 客户留存率(Customer Retention Rate, CRR) 5. 净推荐值(Net Promoter Score, NPS) 6. 转化率(Conversion Rate) …