【数据库系统概论】数据查询之单表查询。详细解释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子句中不能包含。

感谢 💖

好啦,这次的分享就到这里,感谢大家看到这里🤞

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

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

相关文章

Web1.0——Web2.0时代——Web3.0

Web1.0 Web1.0是互联网的早期阶段&#xff0c;也被称为个人电脑时代的互联网。在这个阶段&#xff0c;用户主要通过web浏览器从门户网站单向获取内容&#xff0c;进行浏览和搜索等操作。在这个时代&#xff0c;技术创新主导模式、基于点击流量的盈利共通点、门户合流、明晰的主…

线程安全问题 --- 内存可见性问题

小王学习录 本月鸡汤:什么是内存可见性问题引起内存可见性问题的原因如何解决内存可见性问题volatile使用规范编外: 工作内存(工作存储区)由前面文章介绍可以知道, 引起线程安全问题有 五个原因, 分别是: 线程抢占式执行, 随即调度(根本原因); 多个线程对同一变量执行 修改操…

Vue-1.8生命周期

Vue生命周期 一个Vue实例从创建到销毁的整个过程。 生命周期&#xff1a; 1&#xff09;创建&#xff1a;响应式数据 ->发送初始化渲染请求 2&#xff09;挂载&#xff1a;渲染数据->操作dom 3&#xff09;更新&#xff1a;数据修改&#xff0c;更新视图 4&#xf…

028.Python面向对象_类补充_元类

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

关于IvorySQL和OpenGauss包SPEC处理的一些思考

包的SPEC区可以定义下面三种类型&#xff08;本篇只讨论SPEC区的情况&#xff09; 变量类型&#xff08;nested table等&#xff09;&#xff08;注意这是包内定义的类型&#xff0c;与SQL创建的不通&#xff09;游标 这三种类型在PG原生中&#xff0c;是找不到相似的功能的&…

VUE和Angular有哪些区别?

Vue.js和Angular是两个流行的前端JavaScript框架&#xff0c;它们有一些明显的区别&#xff0c;包括以下几个方面&#xff1a; 1、语言和工具链的选择&#xff1a; Vue.js使用HTML、JavaScript和CSS来创建组件&#xff0c;使得它更容易学习&#xff0c;因为它使用了常见的Web…

【tomcat、java】

java&#xff1a;maven配置 1.安装插件 <build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port&…

一种重要的天然氨基酸L-Homopropargylglycine(HPG)|CAS:942518-19-6

产品简介&#xff1a;L-Homopropargylglycine是一种重要的天然氨基酸&#xff0c;具有多种生物活性和医学应用价值。它广泛应用于生物学、药学、化学等多个领域。在生物学中&#xff0c;HPG被用作蛋白质合成的标记物&#xff0c;可以通过其特殊的化学反应与蛋白质中的半胱氨酸残…

【Overload游戏引擎分析】UBO与SSBO的封装

一、OpenGL的UBO 在OpenGL Shader中&#xff0c;如果逻辑比较复杂&#xff0c;使用的uniform变量较多。通常多个着色器使用同一个uniform变量。由于uniform变量的位置是着色器链接时候产生的&#xff0c;因此它在应用程序中获得的索引会有变化。Uniform Buffer Object&#xff…

如何写好一个接口

接口设计 接口要注意拓展性&#xff0c;设计得灵活一些&#xff0c;应对业务的变化。字段尽量不要耦合在一起。接口尽量通用。能调用一次完成的&#xff0c;不用调用两次。网络IO是很慢的。接口的字段&#xff0c;尽量少一些&#xff0c;字段越多&#xff0c;越混乱&#xff0…

国家开放大学 模拟试题训练

2208 政治学原理 参考试题 一、选择题&#xff08;每题2分&#xff0c;共20分&#xff0c;每题至少有一个答案&#xff0c;多选少选均不能得分&#xff09; 1.柏拉图在《理想国》-书中明确指出&#xff0c;政治的本质在于公正&#xff0c;一个“理想国”具有( )美德。 A.智慧…

【SV中的多线程fork...join/join_any/join_none】

SV中fork_join/fork_join_any/fork_join_none 1 一目了然1.1 fork...join1.2 fork...join_any1.3 fork...join_none 2 总结 SV中fork_join和fork_join_any和fork_join_none; Note: fork_join在Verilog中也有&#xff0c;只有其他的两个是SV中独有的&#xff1b; 1 一目了然 1.…

操作系统 OS

本文章是学习《操作系统》慕课版 和 王道《2024年 操作系统 考研复习指导》后所做的笔记&#xff0c;其中一些图片来源于学习资料。 目录 概念&#xff08;定义&#xff09; 目标 方便性 有效性 可扩充性 开放性 作用 OS 作为用户与计算机硬件系统之间的接口 — 人机交…

Stream流最佳实战

Stream流最佳实战 stream 进行排序、分组、多级分组、交集、并集、差集等 package com.al.admin.utils;import cn.hutool.core.util.ObjectUtil; import lombok.Data; import org.springframework.util.StringUtils;import java.text.SimpleDateFormat; import java.util.*; …

1、【gradio】快速开始,构建自己的机器学习的应用

1、【gradio】快速开始,构建自己的机器学习的应用 Gradio能做什么Hello, WorldInterface类组件属性多个输入和输出组件一个图片的ExampleChatbot(聊天机器人)Blocks:更多的灵活性和控制Hello, Blocks更复杂一点的实现先决条件:Gradio 需要 Python 3.8 或更高版本。 Gradio…

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型&#xff0c;而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇&#xff0c;你将了解训练出一个大模型的环境准备、数据准备&#xff0c;生成分词&#xff0c;模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…

取出SQLite数据(基本游标)

前面一节中已经为Starbuzz创建了一个SQLite帮助器。 目前还是从Java Drink类获取数据&#xff0c;这时候要修改这个应用从SQLite数据库获取数据。 本文所有代码均存放于 https://github.com/MADMAX110/Starbuzz 一、修改DrinkActivity来使用Starbuzz数据库 基本步骤&#xff…

Puppeteer基础知识(一)

Puppeteer基础知识&#xff08;一&#xff09; Puppeteer基础知识&#xff08;一&#xff09;一、简介二、其他一些自动化测试工具三、安装与使用四、Puppeteer常用命令五、常见问题解决&#xff1a; 一、简介 Puppeteer 是一个强大而灵活的工具&#xff0c;可以用于网页爬虫、…

Transformer预测 | Pytorch实现基于Transformer 的锂电池寿命预测(CALCE数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

QT位置相关函数

Qt&#xff08;Qt Framework&#xff09;是一个流行的C应用程序开发框架&#xff0c;提供了丰富的位置相关函数和类&#xff0c;用于处理窗口、窗口小部件和图形的位置和几何操作。以下是一些常用的Qt位置相关函数和类&#xff1a; QPoint&#xff1a;QPoint类表示一个二维点的…