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

【数据库系统概论】数据查询之单表查询。详细解释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
  1. 比较大小
    例:查询计算机系的所有学生的学号和姓名:
SELECT Sno,Sname
FROM Student
WHERE Sdept='CS';

例: 查询考试成绩不及格的学生的学号:

SELECT Sno
FROM SC
WHERE Grade<60;
/*等价于:*/
SELECT Sno
FROM SC
WHERE NOT Grade>=60;
  1. 确定范围
    例:查询年龄在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;
  1. 确定集合
    例:查询信息系(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';
  1. 字符匹配(模糊查询)

    • % (百分号):代表任意长度(长度可以为0)的字符串
    • _(下横线):代表任意单个字符
    • 当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义

    例:查询所有姓张的、第3个字为“伟”的学生的姓名,学号和性别:

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '张__伟%';

例:查询DB_Design课程的课程号及学分:

SELECT  *
FROM  Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE '\';
  1. 涉及空值的查询
    例:查询所有有成绩的学生学号和课程号:
SELECT Sno,Cno
FROM  SC
WHERE  Grade IS NOT NULL;
  1. 基于多个条件的查询
    例:查询计算机系年龄在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

前言 ❓单表查询选择表中的若干列查询经过计算的值选择表中的若干元组&#xff08;行&#xff09;消除取值重复的行查询满足条件的元组&#xff08;WHERE&#xff09; 对查询结果排序&#xff08;ORDER BY&#xff09;聚集函数对查询结果分组&#xff08;GROUP BY&#xff09; …...

2023年医药商业行业发展研究报告

第一章 行业概况 1.1 定义 医药商业行业&#xff0c;作为医药领域的重要组成部分&#xff0c;扮演着至关重要的角色。这一行业专注于医药商品的经营与流通&#xff0c;确保药品能够有效、安全地到达消费者手中。随着医药科技的进步和市场需求的增长&#xff0c;医药商业行业在…...

Android 消息机制

Android 消息机制 Android 的消息机制也是Handler机制&#xff0c;主要作用是用来在不同线程之间通信&#xff0c;通常使用在子线程执行完成一些儿耗时操作&#xff0c;需要回到主线程更新UI时&#xff0c;通过Handler将有关UI操作切换到主线程。由于Android中主线程不可进行耗…...

QT计时器QTime的使用举例

Qt 中的计时器&#xff08;QTimer&#xff09;是一种用于执行定时操作的机制。您可以使用 QTimer 来执行周期性任务、在一段时间后执行操作或创建间隔定时器。以下是使用 QTimer 的基本步骤以及一个简单的示例&#xff1a; **包含头文件&#xff1a;**首先&#xff0c;确保您的…...

js中await用法

在JavaScript中&#xff0c;await用于暂停异步函数执行&#xff0c;等待Promise对象的解决。当Promise对象解决时&#xff0c;await将返回被解决的值&#xff0c;否则它将抛出一个被拒绝的Promise错误。 下面是一些使用await的例子&#xff1a; 使用await等待一个Promise对象…...

Qt多工程同名字段自动翻译工具

开发背景 项目里不同工程经常会引用同一批公共类&#xff0c;这些类里如果有字段需要翻译&#xff0c;需要在不同的项目里都翻译一遍&#xff0c;比较麻烦冗余。 特此开发了这个小翻译工具&#xff0c;能读取程序目录下的所有ts文件&#xff0c;以类名归类&#xff0c;不同项目…...

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配置&#xff08;选配&#xff09;下载comfyUI代码创建、激活虚拟环境下载依赖安装torchvision启动comfyUI为什么Mac不支持CUDA&#xff0c;即英伟达的显卡&#xff1f;安装Intel工具包 环境 显卡&#xff1a;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中执行任务时&#xff0c;没法看到JobManager的错误&#xff0c;以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中&#xff0c;增加日志&#xff0c;发现jdbc连接被关闭了。 重新…...

基于nodemailer实现邮件发送

概述 node中可用nodemailer实现邮件的发送。本文使用QQ邮箱实现邮件的发送。 实现效果 实现 1. QQ邮箱配置 首先需要开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务&#xff0c;如下图所示。 生成授权码 2. 发送邮件 发送邮件的代码比较简单&#xff0c;如下&#xf…...

【PostgreSQL内核学习(十八)—— (数据库表参数)】

数据库表参数 default_reloptions 函数案例 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核…...

区块链的两个核心概念之一签名, 另一个是共识.

Alice的公私钥&#xff0c; 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花&#xff0c;即重复宣称所有权&#xff0c; 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…...

wpf中prism框架切换页面

主页面...

正则表达式(Regular Expression)学习网址分享

正则表达式&#xff08;Regular expressions&#xff0c;也叫REs、 regexs 或regex patterns&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xf…...

【已解决】socket.gaierror: [Errno -3] Temporary failure in name resolution

问题描述 今天在环境迁移的过程中遇到多个问题&#xff0c;包括ModuleNotFoundError: No module named flask&#xff0c;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条主线&#xff0c;一条是技术&#xff0c;一条是管理。项目过程由项目团队实施。一般术语以下两大类之一&#xff1a;一类是项目管理过程。另一类是面向产品的过程。在大多数情况下&#xff0c;大多数项目都有共同的项目管理过程。它们通过有目的的实施而互相联系起…...

python每日一练(5)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

经典循环命题:百钱百鸡

翁五钱一只&#xff0c;母三钱&#xff0c;小鸡三只一钱&#xff1b;百钱百鸡百鸡花百钱。 (本笔记适合能熟练应用for循环、会使if条件分支语句、能格式化字符输出的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a…...

IDEA使用模板创建webapp时,web.xml文件版本过低的一种解决方法

创建完成后的web.xml 文件&#xff0c;版本太低 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Appl…...

在Openresty中使用lua语言向请求浏览器返回请求头User-Agent里边的值

可以参考《Linux学习之Ubuntu 20.04在https://openresty.org下载源码安装Openresty 1.19.3.1&#xff0c;使用systemd管理OpenResty服务》安装Openresty。 然后把下边的内容写入到openresty配置文件/usr/local/openresty/nginx/conf/nginx.conf&#xff08;根据实际情况进行选…...

Hive面试常见基础问题

以下是一些Hive面试问题和答案&#xff1a; Hive是什么&#xff1f; 答&#xff1a;Hive是一个开源的数据仓库工具&#xff0c;用于处理和分析大规模结构化数据。它能够创建、修改和查询表结构&#xff0c;支持多种数据类型和查询操作&#xff0c;同时提供数据汇总和数据查询的…...

设计模式 - 观察者模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 观察者模式属于行为型模式。在程序设计中&#xff0c;观察者模式通常由两个对象组成&#xff1a;观察者和被观察者。当被观察者状态发生改变时&#xff0c;它会通知所有的观察者对象&#xff0c;使他们能够及时做出响应&#xf…...

【自动驾驶】PETR/PETRv2/StreamPETR论文分析

1.PETR PETR网络结构如下&#xff0c;主要包括image-backbone, 3D Coordinates Generator, 3D Position Encoder, transformer Decoder 1.1 Images Backbone 采用resnet 或者 vovNet,下面的x表示concatenate 1.2 3D Coordinates Generator 坐标生成跟lss类似&#xff0c;假…...

GPT实战系列-Baichuan2本地化部署实战方案

目录 一、百川2(Baichuan 2)模型介绍 二、资源需求 模型文件类型 推理的GPU资源要求 模型获取途径 国外: Huggingface 国内:ModelScope 三、部署安装 配置环境 安装过程...

用netty实现简易rpc

文章目录 rpc介绍&#xff1a;rpc调用流程:代码&#xff1a; rpc介绍&#xff1a; RPC是远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式。SAP系统RPC调用的原理其实很简单&#xff0c;有一些类似于三层构架的C/S系统&#xff0c;第三方的客户程序通过接…...

【计算机网络】第三章课后习题答案

习题目录&#xff1a; 【3-01】数据链路&#xff08;即逻辑链路&#xff09;与链路&#xff08;即物理链路&#xff09;有何区别&#xff1f;"链路接通了"与"数据链路接通了"的区别何在&#xff1f; 【3-02】数据链路层中的链路控制包括哪些功能&#xf…...