DBMS-3.2 SQL(2)——DML的SELECT(含WHERE、聚集函数、GROUP BY、HAVING之间的关系)

news2024/10/7 6:59:57

本文章的素材与知识来自李国良老师和王珊老师。

  • 数据操纵语言DML(Data Manipulation Language)

  • SELECT

一.SELECT的语法与构成

1.语法

2.构成

二.投影

投影操作可以选择表中的若干列,主要体现在SELECT子句后的列表达式。

1.列表达式

2.列的重复行

(1)ALL(默认

(2)DISTINCT

 3.列的别名

(1)给列起的别名唯一作用是:在结果展示的时候将列名换为别名;即使给列起了别名,在SQL语句中也无法使用,只能用列的原名。(与给表起别名要区分开)

4.示例1——查询全部

5.示例2——广义投影

可以对列执行计算

三.选择

选择操作可以筛选满足条件的元组,主要体现在WHERE子句后的查询条件。

1.WHERE子句常用的查询条件

2.比较

(1)对于不等运算符 "!=" 和 "<>" ,两者作用相同。不过有极少数数据库只支持"<>"而不支持"!="

3.确定范围(BETWEEN AND)

(1)BETWEEN AND是包含首尾的

4.确定集合(IN)

5.空值(IS NULL)

(1)"IS"不能用"="代替。只能是"IS NULL"和"IS NOT NULL",不可以"= NULL"和"!= NULL"。

6.逻辑运算(AND、OR、NOT)

7.字符串运算

(1)_ :表示一个任意字符。例如"_a"表示:以a结尾,大小为2个字符的任意字符串。

(2)% :表示任意多个(包括0个和1个)任意字符。例如"%a"表示:以a结尾,大小至少为1个字符的任意字符串。

(3)ESCAPE:用于指定转义标识符,例如"ESCAPE /"则指定"/"为转义标识符,转义标识符后面跟着的任意一个字符就是普通字符,不具有任何含义。常用于匹配串本身就含有"_"或"%"的情况

(4)字符串类型数据在存储时需注意:

  • char类型在插入时会保留首部的空格,自动删除尾部的所有空格。
  • varchar类型在插入时会保留首部和尾部的所有空格。

(5)在字符串匹配上,"like"和"="的差异

  • "like"支持模糊匹配,而"="只支持完全匹配。
  • 对于字符串的完全匹配,使用"like"或"="都可以。

四.聚集

1.常见聚集函数

2.注意事项

(1)指定DISTINCT时,先消除重复取值的列,再用聚集函数作用。默认是ALL,即不去重

(2)SUM()和AVG()只能作用在数值列;MAX()和MIN()作用在非数值列时按字典序排序。

3.示例

五.分组

分组操作使用GROUP BY实现,配合HAVING可以完成分组后的再筛选。

1.定义

2.聚集函数与GROUP BY

(1)不使用GROUP BY进行分组,则聚集函数作用于整个查询结果

(2)使用GROUP BY进行分组,则聚集函数单独作用于每一个组

(3)示例

3.HAVING

(1)HAVING子句用来对GROUP BY分组后的每一个组进行再筛选

(2)示例

六.排序

1.定义

2.示例

七.连接

1.定义

(1)最常用的是等值连接和自然连接

(2)WHERE子句可以同时完成查询和连接

(3)连接查询一定要记得写连接条件

2.自身连接与表的重命名

(1)在一条SQL语句中给表起了别名,则在该条SQL语句中只能用表的别名,不能用原名

(2)在一条SQL语句中给列起了别名,在该条SQL语句中还是只能用列的原名,不能用别名

3.连接的三种写法

4.多种连接方式

八.嵌套查询

1.定义

(1)父查询与子查询

(2)子查询中不能使用ORDER BY子句:因为子查询的结果是用于父查询的,最终排序结果还是取决于父查询,因此子查询做ORDER BY是没有意义的。

(3)父查询对子查询的查询条件

2.不相关子查询

3.相关子查询

4.嵌套查询的类型1——带有IN谓词的子查询

(1)示例

(2)上述查询用连接查询也能实现,要记得把连接条件写全,三张表有两个连接条件

5.嵌套查询的类型2——带有比较运算符的子查询

6.嵌套查询的类型3——带有ANY或ALL谓词的子查询

(1)ANY

(2)上述例子也可以用聚集函数实现

(3)ALL

7.嵌套查询的类型4——带有EXISTS谓词的子查询

(1)定义

(2)示例

(3)用EXIST实现全称量词

(4)用EXIST实现逻辑蕴涵

8.嵌套查询与连接查询的关系

(1)使用嵌套查询能实现的,连接查询也能实现。

(2)嵌套查询的系统效率高于连接查询:因为连接查询一定会对连接的两个或多个表在内存中做笛卡尔积,占据系统内存;而嵌套查询是逐层进行的,每次只会对一个表进行操作,不会产生笛卡尔积。

九.集合操作

十.WHERE、聚集函数、GROUP BY、HAVING的关系

1.WHERE和聚集函数

(1)在WHERE子句中不能使用聚集函数:聚集函数是作用于WHERE子句的查询结果的,而WHERE子句在执行时还没有得到结果,因此不能使用聚集函数。

2.GROUP BY和HAVING

(1)有HAVING则一定要有GROUP BY:HAVING是对GROUP BY的分组结果进行筛选,若没有GROUP BY分组,则HAVING就没有作用对象。

(2)有GROUP BY不一定要有HAVING:可以只对结果进行GROUP BY分组,不对分组结果进行再筛选。

3.WHERE和GROUP BY

(1)WHERE和GROUP BY的使用并不冲突:WHERE是对查询做条件筛选,GROUP BY是对查询结果做分组。

4.WHERE和HAVING

WHERE和HAVING都是对查询结果做条件筛选,但两者作用不同:

(1)作用对象不同

  • WHERE子句作用于表或者视图,面对表或视图的所有元组。
  • HAVING子句作用于GROUP BY的分组结果,面向每一个分组的所有元组。

(2)执行顺序不同

  • WHERE是对查询做初次筛选,最先执行。
  • HAVING是对分组结果做二次筛选,在WHERE、GROUP BY之后执行。

(3)使用条件不同

  • WHERE没有使用条件。
  • HAVING必须要伴随GROUP BY使用。

(4)对于聚集函数的使用不同

  • WHERE子句不允许使用聚集函数。
  • HAVING子句允许使用聚集函数。
5.聚集函数和GROUP BY

(1)如果未对查询结果进行GROUP BY分组,则聚集函数作用于整个查询结果

(2)如果对查询结果进行GROUP BY分组,则聚集函数单独作用于每一个分组

6.聚集函数的出现位置及其对GROUP BY的依赖

(1)聚集函数允许出现的位置:SELECT子句、HAVING子句、ORDER BY子句

(2)如果SELECT子句中只有聚集函数,则可以不使用GROUP BY分组。

(3)如果SELECT子句中既有聚集函数,也有非聚集函数,则必须使用GROUP BY分组,且GROUP BY分组的列必须包含SELECT中的非聚集函数列。原因看第7点。

7.“对于使用了GROUP BY分组的查询语句,所有在SELECT子句中出现的列,要么出现在SELECT子句的聚集函数中,要么还必须同时出现在GROUP BY子句中;不能只在SELECT子句中单独出现”

(1)例子:

假设查询语句: SELECT sno,grade FROM sc GROUP BY sno;

该语句会查询sc表中的sno列和grade列,并将查询结果按sno值进行分组,sno值相同的元组会被合并到一组。

而sc表中会出现一个sno对应多个grade的情况,即有若干列都是sno相同但grade不同。

那些sno相同的列随着GROUP BY sno被合并到一个元组后,不同的grade也会被挤入一个单元格内,就违背了1NF。

(2)理解:

GROUP BY其实就是把多个元组合并为一个元组,随着合并必然会出现多个不同值挤入一个单元格的情况,为了不违背1NF,有三种解决方案

  • 不将这些违背1NF的列投影出来,即不出现在SELECT子句中。
  • 通过聚集函数将一个单元格的多个值合并为一个值,即出现在SELECT子句的聚集函数中。
  • 对这一列的每一个值分一个组,即出现在GROUP BY子句中。

(3)示例

8.执行顺序

WHERE > GROUP BY > 聚集函数 > HAVING > ORDER BY

十一.基于派生表的查询

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

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

相关文章

【书生浦语实战】茴香豆企业级知识库问答工具-搭建Dify问答助手

快速结论 1、用茴香豆快速搭建Dify问答助手&#xff0c;自带拒答、rerank、切片长度判断、阈值调节功能&#xff0c;回答还能带出图片&#xff0c;顶呱呱&#x1f44d; 2、茴香豆git仓地址&#xff1a;https://github.com/internlm/huixiangdou 遇到问题去翻这里会更多解释&…

如何利用免费音频剪辑软件制作出精彩音频

现在有许多免费的音频剪辑软件可供选择&#xff0c;它们为广大用户提供了丰富的功能和便捷的操作体验&#xff0c;让音频编辑变得更加轻松和有趣。接下来&#xff0c;让我们一起走进这些免费音频剪辑软件的世界&#xff0c;探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…

李宏毅深度学习-图神经网络GNN

图卷积的开源代码网站DGL 好用的还是 GAT, GIN&#xff08;指出最好的卷积 就是 hi 邻居特征&#xff08;而且只能用 sum&#xff09;&#xff09; Introduction GNN 可以理解为是由 Graph&#xff08;图) Nerual Networks 组合而成的&#xff0c;图结构应该都在数据结构与…

No.12 笔记 | 网络基础:ARP DNS TCP/IP与OSI模型

一、计算机网络&#xff1a;安全的基石 1. 网络的本质&#xff1a;数字世界的神经系统 定义&#xff1a;计算机的互联互通&#xff0c;实现资源共享和信息交换组成要素&#xff1a;发送者、接收者、介质、数据、协议&#xff08;五大要素&#xff09; 2. 网络架构&#xff1…

STM32PWM应用

一、输出比较(OC) OC&#xff08;Output Compare&#xff09;输出比较 可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前…

三菱FX3U定位控制接线示例(脉冲控制伺服)

一、FX3u系列基本单元(DC24V输入) 二、FX3u系列基本单元(晶体管输出) 脉冲输出用端子Y000、 Y001、 Y002为高速响应输出。 三、FX3UPLC链接MR-J4-A伺服连接实例 1、为了安全起见&#xff0c;不仅仅在可编程控制器侧&#xff0c;在伺服放大器侧也请设计正转限位和反转限位的限位…

查缺补漏----拥塞窗口

注意事项1&#xff1a; 首先区分超时和收到3个冗余ACK&#xff0c;显然超时更加严重。如下图所示&#xff1a; 如果网络出现超时&#xff0c;那么发送窗口cwnd变为1&#xff0c;门限值ssthresh变为原来拥塞窗口的一半 如果收到3个冗余ACK&#xff0c;发送窗口cwnd门限值ssth…

Java重修笔记 第六十一天 坦克大战(十一)IO 流 - 节点流和处理流、BufferedReader 和 BufferedWriter

节点流和处理流的区别和联系 1. 节点流是底层流/低级流&#xff0c;直接和数据源联系 2. 处理流是经过包装过后的节点流&#xff0c;也叫包装流&#xff0c;既可以消除不同节点流的实现差异&#xff0c;也可以提供更方便的方法来完成输入输出 3. 处理流&#xff08;包装流&…

二叉树基本概念讲解

一.树的概念 1.概念 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09;个有限结点组成⼀个具有层次关系的集合。把它叫 做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有⼀个特殊的结点&#xff0c…

动态规划基础一>面试题 08.01. 三步问题

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int waysToStep(int n) {/**1.创建dp表2.初始化3.填表4.返回值*/int MOD (int)1e9 7;//注意不能超出int范围&#xff0c;每做一次操作要取模//处理边界情况if(n 1 || n 2) return n;if(n 3) return 4;//1…

【小沐学CAD】ParaView Web的学习笔记(Python)

文章目录 1、简介1.1 visualizer1.2 Divvy1.3 Lite1.4 LightViz1.5 ArcticViewer1.6 HPCCloud1.7 glance1.8 trame 结语 1、简介 https://pvw.kitware.com/ VTK/ParaView Web&#xff0c;用于 Web 数据处理和可视化的框架 ParaViewWeb 是一个 Web 框架&#xff0c;用于在 Web …

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架&#xff1a;数据库ORM框架 --> 对象…

vulnhub-Web Developer 1靶机

vulnhub&#xff1a;Web Developer: 1 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.114.129&#xff0c;扫描端口 有网站服务&#xff0c;访问 没什么东西&#xff0c;扫目录 真不少&#xff0c;访问一下&#xff0c;也只是一些普通的Wordpr…

【机器学习】智驭未来:探索机器学习在食品生产中的革新之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#xff1a;探索机器学习在食品生产中的革新之路&#x1f4d2;2. 机器学习在食品质量控制中的应用&#x1f31e;实…

Crypto虐狗记---”你“和小鱼(六)

前言&#xff1a;剧情六 提示&#xff1a; 下载 手动&#xff1a; 脚本&#xff1a;我不会 参考大佬&#xff1a; 转轮机加密详解两种解题方法 -攻防世界-CSDN博客 import re sss1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE < 2: < KPBELNACZDTRXMJQOYHGVSFUWI < 3: < …

计算机的错误计算(一百一十五)

摘要 用错数定量解释计算机的错误计算&#xff08;一百一十四&#xff09;中的错误计算原因。 例1. 已知 计算 在 的错数&#xff0c;并与计算机的错误计算&#xff08;一百一十四&#xff09;中的相应错误数字个数做比较。 由 知&#xff0c; 再由 可得&#xff0c…

爬虫工程师必备工具——Postman和Fiddler的使用教程(11)

文章目录 1、工具获取2、基础使用教程2.1 Postman2.2 Fiddler2.2.1 简介2.2.2 工作原理2.2.3 功能设置2.2.4 使用方法1、工具获取 PostmanFiddler2、基础使用教程 2.1 Postman Postman是一款API调试工具,它简化了HTTP请求的构建、发送、响应查看以及测试流程,帮助开发人员高…

No.9 笔记 | PHP学习指南:从入门到精通的要点总结

一、PHP概述 1. Web技术基础 Web&#xff1a;由互相链接的超文本文件组成的系统URL&#xff1a;定位Web资源的地址HTTP&#xff1a;Web数据交换协议架构类型&#xff1a;B/S&#xff08;浏览器/服务器&#xff09;和C/S&#xff08;客户端/服务器&#xff09; 2. PHP简介 定…

无法加载响应数据: No data found for resourcewith given identifier

背景 学习黑马2022Redis教程&#xff0c;在开发P78达人探店功能&#xff0c;重新在前端登录的时候发现&#xff0c;所有的请求都需要发两遍才能成功。 失败的请求报错&#xff1a; 无法加载响应数据: No data found for resourcewith given identifier 排查 因为用到nginx,…

No.8 笔记 | SQL 查询语句:数据探索的钥匙

2024/10/7 心记 - 致在路上默默奋斗的你 在当今数字化的时代&#xff0c;网络安全已成为我们生活中不可或缺的一部分。它如同守护数字世界的隐形盾牌&#xff0c;保护着我们的隐私、数据和整个社会的稳定运行。 学习网络安全&#xff0c;是踏上一段充满挑战与机遇的征程。 每一…