【数据库系统概论】数据查询之单表查询。详细解释WHERE、OEDER BY、GROUP BY 和 HAVING
- 前言 ❓
- 单表查询
- 选择表中的若干列
- 查询经过计算的值
- 选择表中的若干元组(行)
- 消除取值重复的行
- 查询满足条件的元组(WHERE)
- 对查询结果排序(ORDER BY)
- 聚集函数
- 对查询结果分组(GROUP BY)
- 感谢 💖
本篇文章创作总时间:1h9min
总字数:3770字
预计阅读时间:10~20min
建议收藏之后慢慢阅读
前言 ❓
SQL提供了SELECT语句进行查询操作。虽然只有这一个查询动词,但它有灵活的使用方式和丰富的功能。
查询的一般格式为:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名>] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ]
- SELECT子句:指定要显示的属性列
- FROM子句:指定查询对象(基本表或视图)
- WHERE子句:指定查询条件。筛选元组(行)
- GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数
- HAVING短语:筛选出只有满足指定条件的组
- ORDER BY子句:对查询结果表按指定列值的升序或降序排序
单表查询
单表查询只涉及一个表或一个视图,是一种最简单的查询操作。
假设这里有三张表,分别是:
- 学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
- 课程表:Course(Cno,Cname,Cpno,Ccredit)
- 学生选课表:SC(Sno,Cno,Grade)
以下示例都基于这三张表。
选择表中的若干列
例1:查询全体学生的学号、姓名和所在系的有关信息:
SELECT Sno, Sname, Sdept
FROM Student;
例2:查询全体学生的所有信息:
SELECT *
FROM Student;
/* 该查询等价于如下查询 :*/
SELECT Sno, Sname, Ssex, Sage, Sdept
FROM Student;
查询经过计算的值
SELECT子句的<目标列表达式>可以是:表中的属性列、算术表达式、字符串常量、函数等。
对于算术表达式、常量、函数名的目标列表达式,通常会起一个别名。
例1:查询全体学生的姓名及出生年份:
SELECT Sname, 2023-Sage
FROM Student;
/* 这里的 2023-Sage 就是一个算术表达式,可以为它指定一个别名:*/
SELECT Sname, 2023-Sage BIRTHDAY
FROM Student;
选择表中的若干元组(行)
消除取值重复的行
在SELECT子句中使用DISTINCT关键字。
比如从学生选课表中查询选修了课程的学生学号,有的学生可能选修了多门课程,但只显示一次学号。这个时候就需要在查询的时候使用DISTINCT关键字消除重复行。
例1: 查询选修程的学生的学号,并消除重复的学号:
SELECT DISTINCT Sno
FROM SC
查询满足条件的元组(WHERE)
使用WHERE子句实现。
WHERE子句常用的查询条件有:
| 查 询 条 件 | 谓 词 |
|---|---|
| 比较 | =,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符 |
| 确定范围 | BETWEEN AND,NOT BETWEEN AND |
| 确定集合 | IN,NOT IN |
| 字符匹配 | LIKE,NOT LIKE |
| 空值 | IS NULL,IS NOT NULL |
| 逻辑运算 | AND,OR,NOT |
- 比较大小
例:查询计算机系的所有学生的学号和姓名:
SELECT Sno,Sname
FROM Student
WHERE Sdept='CS';
例: 查询考试成绩不及格的学生的学号:
SELECT Sno
FROM SC
WHERE Grade<60;
/*等价于:*/
SELECT Sno
FROM SC
WHERE NOT Grade>=60;
- 确定范围
例:查询年龄在20~23岁之间(包括20岁和23岁)的学生的姓名、所在系和年龄:
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
/*等价于:*/
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage>=20 AND Sage<=23;
- 确定集合
例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别:
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
/*等价于:*/
SELECT Sname, Ssex
FROM Student
WHERE Sdept=‘IS' OR Sdept='MA' OR Sdept=‘CS';
-
字符匹配(模糊查询)
- % (百分号):代表任意长度(长度可以为0)的字符串
- _(下横线):代表任意单个字符
- 当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义
例:查询所有姓张的、第3个字为“伟”的学生的姓名,学号和性别:
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '张__伟%';
例:查询DB_Design课程的课程号及学分:
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE '\';
- 涉及空值的查询
例:查询所有有成绩的学生学号和课程号:
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
- 基于多个条件的查询
例:查询计算机系年龄在20岁以下的学生的学号、姓名和性别:
SELECT Sno, Sname, Ssex
FROM Student
WHERE Sdept='CS' AND Sage<20;
对查询结果排序(ORDER BY)
使用ORDER BY子句,语法格式为:
ORDER BY <列名> [ASC | DESC ] [,…]
- 可以按一个或多个属性列排序
- 升序:ASC;降序:DESC;缺省值为升序
例:查询全体学生情况,查询结果按所在系的升序排序,同一系中的学生按年龄降序排序:
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
聚集函数
为了增强检索功能,SQL提供了许多聚簇函数,主要有:
- COUNT([DISTINCT|ALL] *) 统计元组个数(可以去重后再统计)
- COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
- SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须是数值型)
- AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值
- MAX([DISTINCT|ALL] <列名>) 计算一列值中的最大值
- MIN([DISTINCT|ALL] <列名>) 计算一列值中的最小值
注意 ❗❗❗:
WHERE子句是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUP中的HAVING子句。
例:计算选修了2号课程的学生平均成绩:
SELECT AVG(Grade) AS '平均成绩' /* 起别名 */
FROM SC
WHERE Cno='2';
例:统计选修了课程的学生人数:
SELECT COUNT(DISTINCT Sno)
FROM SC;
对查询结果分组(GROUP BY)
用GROUP BY子句将查询的结果按指定的列进行分组,即将指定列值相同的元组分为同一个组。目的是细化聚集函数的作用对象。
- 未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组 ,即相当于每个分组均有一个函数值
例: 查询每门课程的课程号及相应的选课人数:
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
- GROUP BY子句的作用对象是查询的中间结果表
- 分组方法:按指定的一列或多列值分组,值相等的为一组
- 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数
如果要按一定的条件对分组进行筛选,则使用HAVING子句指定筛选条件。
例:查询选修了3门以上课程的学生学号:
SELECT Sno
FROM SC
GROUP BY Sno HAVING COUNT(*)>3;
/* 先根据学生学号进行分组,这样就将同一个学号的元组都放在了一组中,然后进行count(*)统计这个组里有多少行,这就是该学号学生选修的课程数*/
注意 ❗❗❗:
HAVING短语与WHERE子句的区别:
- 作用对象不同。WHERE子句作用于基表或视图,从中选择满足条件的元组; HAVING短语作用于组,从中选择满足条件的组。
- 执行查询时,WHERE是在分组之前被应用,而HAVING子句中的条件在分组之后被应用。
- HAVING子句可以在条件中包含聚集函数,但WHERE子句中不能包含。
感谢 💖
好啦,这次的分享就到这里,感谢大家看到这里🤞
相关文章:
【数据库系统概论】数据查询之单表查询。详细解释WHERE、OEDER BY、GROUP BY 和 HAVING
前言 ❓单表查询选择表中的若干列查询经过计算的值选择表中的若干元组(行)消除取值重复的行查询满足条件的元组(WHERE) 对查询结果排序(ORDER BY)聚集函数对查询结果分组(GROUP BY) …...
2023年医药商业行业发展研究报告
第一章 行业概况 1.1 定义 医药商业行业,作为医药领域的重要组成部分,扮演着至关重要的角色。这一行业专注于医药商品的经营与流通,确保药品能够有效、安全地到达消费者手中。随着医药科技的进步和市场需求的增长,医药商业行业在…...
Android 消息机制
Android 消息机制 Android 的消息机制也是Handler机制,主要作用是用来在不同线程之间通信,通常使用在子线程执行完成一些儿耗时操作,需要回到主线程更新UI时,通过Handler将有关UI操作切换到主线程。由于Android中主线程不可进行耗…...
QT计时器QTime的使用举例
Qt 中的计时器(QTimer)是一种用于执行定时操作的机制。您可以使用 QTimer 来执行周期性任务、在一段时间后执行操作或创建间隔定时器。以下是使用 QTimer 的基本步骤以及一个简单的示例: **包含头文件:**首先,确保您的…...
js中await用法
在JavaScript中,await用于暂停异步函数执行,等待Promise对象的解决。当Promise对象解决时,await将返回被解决的值,否则它将抛出一个被拒绝的Promise错误。 下面是一些使用await的例子: 使用await等待一个Promise对象…...
Qt多工程同名字段自动翻译工具
开发背景 项目里不同工程经常会引用同一批公共类,这些类里如果有字段需要翻译,需要在不同的项目里都翻译一遍,比较麻烦冗余。 特此开发了这个小翻译工具,能读取程序目录下的所有ts文件,以类名归类,不同项目…...
vue3+elementui实现表格样式可配置
后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…...
x11截屏源码(ubuntu18.04)
使用x11库实现截屏并保存为png图片 【shot.c】 // filename: shot.c #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/cursorfont.h> #include <png.h> #include <stdio.h> #include <stdlib.h>…...
【ComfyUI】MacBook Pro 安装(Intel 集成显卡)
文章目录 环境概述配置pip镜像配置pip代理git配置(选配)下载comfyUI代码创建、激活虚拟环境下载依赖安装torchvision启动comfyUI为什么Mac不支持CUDA,即英伟达的显卡?安装Intel工具包 环境 显卡:Intel Iris Plus Grap…...
HTTPS 加密全过程
加密协议以前是SSL,现在都是TLS, 而证书现在大多数都是SSL证书 抓包流程: TCP三次握手过后, 客户端发送Client Hello 服务器相应Server Hello 服务器再次响应发送证书: 服务器再发送公钥:...
联邦学习综述二
联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…...
Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Idea中执行任务时,没法看到JobManager的错误,以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中,增加日志,发现jdbc连接被关闭了。 重新…...
基于nodemailer实现邮件发送
概述 node中可用nodemailer实现邮件的发送。本文使用QQ邮箱实现邮件的发送。 实现效果 实现 1. QQ邮箱配置 首先需要开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,如下图所示。 生成授权码 2. 发送邮件 发送邮件的代码比较简单,如下…...
【PostgreSQL内核学习(十八)—— (数据库表参数)】
数据库表参数 default_reloptions 函数案例 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核…...
区块链的两个核心概念之一签名, 另一个是共识.
Alice的公私钥, 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花,即重复宣称所有权, 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…...
wpf中prism框架切换页面
主页面...
正则表达式(Regular Expression)学习网址分享
正则表达式(Regular expressions,也叫REs、 regexs 或regex patterns),是一种文本模式,包括普通字符(例如,a 到z 之间的字母)和特殊字符(称为"元字符"…...
【已解决】socket.gaierror: [Errno -3] Temporary failure in name resolution
问题描述 今天在环境迁移的过程中遇到多个问题,包括ModuleNotFoundError: No module named flask,socket.gaierror: [Errno -3] Temporary failure in name resolution以及Downloading: "https://huggingface.co/gyrojeff/YuzuMarker.FontDetection…...
CUDA code=700(cudaErrorIllegalAddress) 报错与排查方法
CUDA code700(cudaErrorIllegalAddress) 报错与排查方法 最近笔者在调试自己写的 CUDA 代码时, 遇到了 code700(cudaErrorIllegalAddress) 的报错, 在此记录一下排查和解决方法. 报错 报错是由 CUDA API 函数执行时产生的, 由 checkCudaErrors() 函数检测出(CUDA 常用错误检…...
项目管理过程组
项目管理有2条主线,一条是技术,一条是管理。项目过程由项目团队实施。一般术语以下两大类之一:一类是项目管理过程。另一类是面向产品的过程。在大多数情况下,大多数项目都有共同的项目管理过程。它们通过有目的的实施而互相联系起…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
