【数据库系统概论】数据查询之单表查询。详细解释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条主线,一条是技术,一条是管理。项目过程由项目团队实施。一般术语以下两大类之一:一类是项目管理过程。另一类是面向产品的过程。在大多数情况下,大多数项目都有共同的项目管理过程。它们通过有目的的实施而互相联系起…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
