SQL刷题快速入门(三)

news2025/1/20 2:46:34

其他章节:
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.coloradmin.cn/o/2279161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web前端------表单标签

一.表单标签介绍 1.认识表单 表单---类似于日常生活中的申请单 都是去填写一些信息去申请某个功能&#xff0c;例如&#xff1a;账号密码昵称&#xff0c;登陆网站 2.常见标签 常见的标签 <form></form> 表单标签&#xff0c;所有表单信息都包含在这个标签内…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法&#xff1a; img_path "./data/yndx"1.1 使用 …

下定决心不去读研了。。。

大家好&#xff0c;我是苍何。 之前发表过一篇文章&#xff0c;表达了自己读研的困惑和纠结&#xff0c;得到了大家很多的建议&#xff0c;也引起了很多人的共鸣&#xff0c;在留言区分享了自己的故事&#xff0c;看着这些故事&#xff0c;我觉得都够苍何写一部小说了。 可惜苍…

单链表的新建、查找

10.3 头插法新建链表实战 10.3.1 流程图 10.3.1.1 整体的流程图 10.3.1.2 循环的流程图 10.3.2 代码 !!!头指针始终指向头结点&#xff01;&#xff01;&#xff01;头插法&#xff1a;实则就是不断地插元素插在头结点的后面最初要先给头结点的指针域赋值为NULL #include &…

【unity进阶篇】向量插值运算Vector3.Lerp和Vector3.Slerp

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

CSS 的基础知识及应用

前言 CSS&#xff08;层叠样式表&#xff09;是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现&#xff0c;使页面不仅实现功能&#xff0c;还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…

怎么投稿各大媒体网站?如何快速辨别一家媒体是否适合自己?

在做软文营销时&#xff0c;除去在官号和子账号上投稿外&#xff0c;怎么投稿各大媒体网站是困扰中小企业主的一大难题。没有多余账号、运营成本太高&#xff0c;让不少想做全平台推广的朋友止步于此。为了解决这些问题&#xff0c;今天就让小编来分享一下&#xff0c;怎么在各…

dl学习笔记:(4)简单神经网络

&#xff08;1&#xff09;单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…

01设计模式(D3_设计模式类型 - D3_行为型模式)

目录 一、模版方法模式 1. 基本介绍 2. 应用案例一&#xff1a;豆浆制作问题 需求 代码实现 模板方法模式的钩子方法 3. View的draw&#xff08;Android&#xff09; Android中View的draw方法就是使用了模板方法模式 模板方法模式在 Spring 框架应用的源码分析 知识小…

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

复健第二天之[MoeCTF 2022]baby_file

打开题目在线环境可以看到&#xff1a; 感觉要用伪协议去求&#xff0c;但是我们并不知道flag的位置&#xff0c;这里我选择用dirsearch去扫一下&#xff1a; 最像的应该就是flag.php了 于是就构建payload&#xff1a; **?filephp://filter/convert.base64-encode/resource…

Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)

目录 引言 Apache POI操作Excel的实用技巧 1.合并单元格操作 2.设置单元格样式 1. 创建样式对象 2. 设置边框 3. 设置底色 4. 设置对齐方式 5. 设置字体样式 6.设置自动换行 7. 应用样式到单元格 3. 定位和操作指定单元格 4.实现标签-值的形式 5.列宽设置 1. 设…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

C#在Json序列化时将key和value转为对应的中文

在C#中&#xff0c;实体类可以通过System.Text.Json或Newtonsoft.Json库等方式直接序列化为json字符串&#xff0c;key为字段&#xff08;属性&#xff09;名&#xff0c;value为值。 上面的方式虽然实现简单&#xff0c;但是有个缺陷&#xff0c;就是转化后的json给外人展示时…

23- TIME-LLM: TIME SERIES FORECASTING BY REPRO- GRAMMING LARGE LANGUAGE MODELS

解决问题 用LLM来解决时序预测问题&#xff0c;并且能够将时序数据映射&#xff08;reprogramming&#xff09;为NLP token&#xff0c;并且保持backbone的大模型是不变的。解决了时序序列数据用于大模型训练数据稀疏性的问题。 方法 Input Embedding 输入&#xff1a; X …

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用&#xff1a;Kotlin 与 Java 的混合编程 在开发 Android 应用程序时&#xff0c;我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而&#xff0c;有些开发者可能会想要在同一个项目中同时使用这两种语言&#xff0c;这就是所谓的混合编…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…

拆分工作簿转换PDF格式文件一步到位-Excel易用宝

今天一大早老板急匆匆的跑进办公室说&#xff0c;快快快&#xff0c;&#xff0c;快把这个工作簿中的工作表拆分出来&#xff0c;然后转换成PDF格式文件发给客户。 我一看这么多工作表&#xff0c;又是拆分表格&#xff0c;又是转换文件&#xff0c;这么复杂的工作&#xff0c…