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

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
    组合查询是处理复杂查询需求时的一个强大工具,它可以帮助你从多个数据源中提取和合并数据。

相关文章:

SQL刷题快速入门(三)

其他章节: SQL刷题快速入门(一) SQL刷题快速入门(二) 承接前两个章节,本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作(重点&…...

mybatis(19/134)

大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符&#xf…...

sqlmap 自动注入 -01

1: 先看一下sqlmap 的help: 在kali-linux 系统里面,可以sqlmap -h看一下: Target: At least one of these options has to be provided to define the target(s) -u URL, --urlURL Target URL (e.g. "Salesforce Platform for Application Development | Sa…...

3.8.Trie树

Trie树 Trie 树,又称字典树或前缀树,是一种用于高效存储和检索字符串数据的数据结构,以下是关于它的详细介绍: 定义与原理 定义:Trie 树是一种树形结构,每个节点可以包含多个子节点,用于存储…...

day 21

进程、线程、协程的区别 进程:操作系统分配资源的最小单位,其中可以包含一个或者多个线程,进程之间是独立的,可以通过进程间通信机制(管道,消息队列,共享内存,信号量,信…...

基于模板方法模式-消息队列发送

基于模板方法模式-消息队列发送 消息队列广泛应用于现代分布式系统中,作为解耦、异步处理和流量控制的重要工具。在消息队列的使用中,发送消息是常见的操作。不同的消息队列可能有不同的实现方式,例如,RabbitMQ、Kafka、RocketMQ…...

俄语画外音的特点

随着全球媒体消费的增加,语音服务呈指数级增长。作为视听翻译和本地化的一个关键方面,画外音在确保来自不同语言和文化背景的观众能够以一种真实和可访问的方式参与内容方面发挥着重要作用。说到俄语,画外音有其独特的特点、挑战和复杂性&…...

PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明

1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具,其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程,让模型架构一目了然。通过torchinfo的summary函数,用户可以快速获取模型的详细结构和统计信息&#xff0…...

亚博microros小车-原生ubuntu支持系列:5-姿态检测

MediaPipe 介绍参见:亚博microros小车-原生ubuntu支持系列:4-手部检测-CSDN博客 本篇继续迁移姿态检测。 一 背景知识 以下来自亚博官网 MediaPipe Pose是⼀个⽤于⾼保真⾝体姿势跟踪的ML解决⽅案,利⽤BlazePose研究,从RGB视频…...

C语言之高校学生信息快速查询系统的实现

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…...

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析:布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…...

迷宫1.2

先发一下上次的代码 #include<bits/stdc.h> #include<windows.h> #include <conio.h> using namespace std; char a[1005][1005]{ " ", "################", "# # *#", "# # # #&qu…...

RabbitMQ---应用问题

&#xff08;一&#xff09;幂等性介绍 幂等性是本身是数学中的运算性质&#xff0c;他们可以被多次应用&#xff0c;但是不会改变初始应用的结果 1.应用程序的幂等性介绍 包括很多&#xff0c;有数据库幂等性&#xff0c;接口幂等性以及网络通信幂等性等 就比如数据库的sel…...

Unity自学之旅03

Unity自学之旅03 Unity自学之旅03&#x1f4dd; 碰撞体 Collider 基础定义与作用常见类型OnCollisionEnter 事件碰撞触发器 &#x1f917; 总结归纳 Unity自学之旅03 &#x1f4dd; 碰撞体 Collider 基础 定义与作用 定义&#xff1a;碰撞体是游戏中用于检测物体之间碰撞的组…...

pip 相关

一劳永逸法&#xff08;pip怎么样都用不了也更新不了&#xff09;&#xff1a; 重下python(卸载旧版本&#xff09;&#xff1a;请输入访问密码 密码&#xff1a;7598 各版本python都有&#xff0c;下3.10.10 python路径建立&#xff0c;pip无法访问方式&#xff1a; 访问pip要…...

vue request 发送formdata

在Vue中&#xff0c;你可以使用axios库来发送包含FormData的请求。以下是一个简单的例子&#xff1a; 首先&#xff0c;确保你已经安装了axios&#xff1a; npm install axios然后&#xff0c;你可以使用axios发送FormData&#xff0c;例如&#xff1a; import axios from a…...

Android RTMP直播练习实践

前言&#xff1a;本文只是练习&#xff0c;本文只是练习&#xff0c;本文只是练习&#xff01; 直播的核心就是推流和拉流&#xff0c;我们就以RTMP的协议来实现下推流和拉流&#xff0c;其他的协议等我学习后再来补充 1.推流 1.1搭建流媒体服务器&#xff0c;具体搭建方法请参…...

ITIL认证工具商-ManageEngine Servicedesk Plus

ServiceDesk Plus是Zoho Corporation旗下企业IT管理部门ManageEngine提供的统一服务管理解决方案。凭借其无限的可扩展性、情境化的IT和业务集成以及一键式工作流程自动化功能&#xff0c;IT领导者可以使用ServiceDesk Plus有效执行和控制跨不同业务部门和IT功能的复杂工作流程…...

https 的 CA证书和电子签名

https 的攻击者可能使用伪造的一对公私钥与客户端交互, 那么如何确保确实是该服务器的公钥呢? 这就诞生了CA颁发机构 CA颁发机构 服务器和客户端都信任指定的CA颁发机构 服务器上传服务器公钥, CA颁发机构做了什么 服务器公钥哈希, 记为 Hash使用 CA 私钥为 Hash 进行 CA 签…...

频繁刷新网页会对服务器造成哪些影响?

当用户在进行浏览网页的过程中频繁刷新页面时&#xff0c;浏览器会向服务器发送请求&#xff0c;服务器会对该请求进行处理并返回到相应的页面内容中&#xff0c;所以频繁刷新网页会对服务器造成影响&#xff0c;有可能会出现以下问题&#xff1a; 用户每次刷新网页都会向服务器…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...