关系数据库SQL数据查询

article/2025/9/26 15:42:35

关系数据库SQL数据查询

数据查询

一、单表查询

1.查询仅涉及一个表,选择表中的若干列

[1]  查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [2]  查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;

查询全部列

  • 选出所有属性列:
  • 在SELECT关键字后面列出所有列名
  • 将<目标列表达式>指定为 *
	[3]  查询全体学生的详细记录SELECT  Sno,Sname,Ssex,Sage,Sdept FROM Student;SELECT  *FROM Student; 

查询经过计算的值

  • SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
 [4]  查全体学生的姓名及其出生年份。SELECT Sname,2014-Sage          /*假设当时为2014年*/FROM Student;输出结果:Sname   2014-Sage李勇         1994刘晨         1995王敏         1996张立         1995 

使用列别名改变查询结果的列标题:

	     SELECT Sname NAME,'Year of Birth:'  BIRTH,2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENTFROM Student;输出结果:NAME      BIRTH         BIRTHDAY   DEPARTMENT李勇    Year of Birth:    1994             cs刘晨    Year of Birth:    1995             cs王敏    Year of Birth:    1996             ma张立    Year of Birth:    1995             is

2.选择表中的若干元组

消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL

	[5]  查询选修了课程的学生学号。SELECT Sno   FROM SC;等价于:SELECT ALL  Sno  FROM SC;执行上面的SELECT语句后,结果为: Sno201215121201215121201215121201215122201215122

指定DISTINCT关键词,去掉表中重复的行

	   SELECT DISTINCT SnoFROM SC; 执行结果:Sno201215121201215122

常用的查询条件:

在这里插入图片描述

1. 比较大小:

	[6] 查询计算机科学系全体学生的名单。SELECT SnameFROM     StudentWHERE  Sdept=‘CS’; [7]查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname,Sage FROM     Student    WHERE  Sage < 20;[8]查询考试成绩有不及格的学生的学号。SELECT DISTINCT SnFROM  SCWHERE Grade<60; 

2. 确定范围:
谓词: BETWEEN … AND …

NOT BETWEEN … AND …

	[9] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄SELECT Sname, Sdept, SageFROM     StudentWHERE   Sage BETWEEN 20 AND 23; [10]  查询年龄不在20~23岁之间的学生姓名、系别和年龄SELECT Sname, Sdept, SageFROM    StudentWHERE Sage NOT BETWEEN 20 AND 23; 

3. 确定集合:
谓词:IN <值表>, NOT IN <值表>

	[11]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。SELECT Sname, SsexFROM  StudentWHERE Sdept IN ('CS','MA’,'IS' );[例12]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。SELECT Sname, SsexFROM StudentWHERE Sdept NOT IN ('IS','MA’,'CS' );
  1. 字符匹配:
  • 谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]

  • <匹配串>可以是一个完整的字符串,也可以含有通配符%和 _

  • % (百分号) 代表任意长度(长度可以为0)的字符串

  • 例如a%b表示以a开头,以b结尾的任意长度的字符串
    _ (下横线) 代表任意单个字符。

  • 例如a_b表示以a开头,以b结尾的长度为3的任意字符串

 匹配串为固定字符串[13]  查询学号为201215121的学生的详细情况。SELECT *    FROM  Student  WHERE  Sno LIKE201215121';等价于: SELECT  * FROM  Student WHERE Sno = ' 201215121 ';匹配串为含通配符的字符串[例14]  查询所有姓刘学生的姓名、学号和性别。SELECT Sname, Sno, SsexFROM StudentWHERE  Sname LIKE '%';[例15]  查询姓"欧阳"且全名为三个汉字的学生的姓名。SELECT SnameFROM   StudentWHERE  Sname LIKE '欧阳__';

使用换码字符将通配符转义为普通字符

	 [16]  查询DB_Design课程的课程号和学分。SELECT Cno,CcreditFROM     CourseWHERE  Cname LIKE 'DB\_Design' ESCAPE '\ ' ;[17]  查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。SELECT  *FROM    CourseWHERE  Cname LIKE  'DB\_%i_ _' ESCAPE '\ ' ;ESCAPE '\' 表示“ \” 为换码字符

5. 涉及空值的查询:
谓词: IS NULL 或 IS NOT NULL

  • “IS” 不能用 “=” 代替
 	[18]  某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,CnoFROM    SCWHERE  Grade IS NULL[19]  查所有有成绩的学生学号和课程号。SELECT Sno,CnoFROM     SCWHERE  Grade IS NOT NULL;

6.多重条件查询

  • 逻辑运算符:AND和 OR来连接多个查询条件
    AND的优先级高于OR
  • 可以用括号改变优先级

[例20] 查询计算机系年龄在20岁以下的学生姓名。

SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;

3.ORDER BY子句

ORDER BY子句

​ 可以按一个或多个属性列排序

​ 升序:ASC;降序:DESC;缺省值为升序

对于空值,排序时显示的次序由具体系统实现来决定

 [21]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno, GradeFROM    SCWHERE  Cno= ' 3 'ORDER BY Grade DESC;[22]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT  *FROM  StudentORDER BY Sdept, Sage DESC;  

4.聚集函数统计元组个数

COUNT(*)

  1. 统计一列中值的个数

    COUNT([DISTINCT|ALL] <列名>)

  2. 计算一列值的总和(此列必须为数值型)

    SUM([DISTINCT|ALL] <列名>)

  3. 计算一列值的平均值(此列必须为数值型)

    AVG([DISTINCT|ALL] <列名>)

  4. 求一列中的最大值和最小值

    MAX([DISTINCT|ALL] <列名>)

    MIN([DISTINCT|ALL] <列名>)

 	 [23]  查询学生总人数。SELECT COUNT(*)FROM  Student; [24]  查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;[25]  计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM    SCWHERE Cno= ' 1 ';[26]  查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SCWHERE Cno='1';[27 ] 查询学生201215012选修课程的总学分数。SELECT SUM(Ccredit)FROM  SC,CourseWHERE Sno='201215012' AND SC.Cno=Course.Cno; 

5.GROUP BY子句

GROUP BY子句分组:
细化聚集函数的作用对象

  • 如果未对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 按指定的一列或多列值分组,值相等的为一组
 [例28]  求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM    SCGROUP BY Cno; 查询结果可能为:Cno     COUNT(Sno)1             222             343             444             335             48

HAVING短语与WHERE子句的区别:

  • 作用对象不同
  • WHERE子句作用于基表或视图,从中选择满足条件的元组
  • HAVING短语作用于组,从中选择满足条件的组。

二、连接查询

  1. 连接查询:同时涉及两个以上的表的查询

  2. 连接条件或连接谓词:用来连接两个表的条件
    一般格式:

​ [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>

​ [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

  1. 连接字段:连接谓词中的列名称

​ 连接条件中的各连接字段类型必须是可比的,但名字不必相同

1.等值与非等值连接查询

等值连接:连接运算符为=

	[29]  查询每个学生及其选修课程的情况SELECT  Student.*, SC.*FROM     Student, SCWHERE  Student.Sno = SC.Sno;

结果为

在这里插入图片描述

1)嵌套循环法(NESTED-LOOP)

  • 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
  • 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
  • 重复上述操作,直到表1中的全部元组都处理完毕

(2)排序合并法(SORT-MERGE)

  • 常用于=连接

  • 首先按连接属性对表1和表2排序

  • 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续

  • 找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2

    中大于表1连接字段值的元组时,对表2的查询不再继续

  • 重复上述操作,直到表1或表2中的全部元组都处理完毕为止

(3)索引连接(INDEX-JOIN)

  • 对表2按连接字段建立索引
  • 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组

自然连接

	[30][3.49]用自然连接完成。SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROM     Student,SCWHERE  Student.Sno = SC.Sno;

2.自身连接

  • 自身连接:一个表与其自己进行连接
  • 需要给表起别名以示区别
  • 由于所有属性名都是同名属性,因此必须使用别名前缀
 [32]查询每一门课的间接先修课(即先修课的先修课)SELECT  FIRST.Cno, SECOND.CpnoFROM  Course  FIRST, Course  SECONDWHERE FIRST.Cpno = SECOND.Cno;

在这里插入图片描述

3.外连接

外连接与普通连接的区别

  • 普通连接操作只输出满足连接条件的元组
  • 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
  • 左外连接

​ 列出左边关系中所有的元组

  • 右外连接

​ 列出右边关系中所有的元组

[33] 改写[29]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON
(Student.Sno=SC.Sno);

执行结果

在这里插入图片描述

三、嵌套查询

嵌套查询概述

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
  SELECT Sname	                           /*外层查询/父查询*/FROM StudentWHERE Sno IN( SELECT Sno        /*内层查询/子查询*/FROM SCWHERE Cno= ' 2 ');
  • 上层的查询块称为外层查询或父查询

  • 下层查询块称为内层查询或子查询

  • SQL语言允许多层嵌套查询

    • 即一个子查询中还可以嵌套其他子查询
  • 子查询的限制

    • 不能使用ORDER BY子句

不相关子查询:

子查询的查询条件不依赖于父查询

  • 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

相关子查询:子查询的查询条件依赖于父查询

  • 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
  • 然后再取外层表的下一个元组
  • 重复这一过程,直至外层表全部检查完为止

1.带有IN谓词的子查询

[35]  查询与“刘晨”在同一个系学习的学生。此查询要求可以分步来完成① 确定“刘晨”所在系名             SELECT  Sdept  FROM     Student                            WHERE  Sname= ' 刘晨 ';结果为: CS② 查找所有在CS系学习的学生。    SELECT   Sno, Sname, Sdept     FROM      Student                 WHERE   Sdept= ' CS '; 

结果为:

在这里插入图片描述

2.带有比较运算符的子查询

当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。

[36]中,由于一个学生只可能在一个系学习,则可以用 = 代替INSELECT Sno,Sname,SdeptFROM    StudentWHERE Sdept   =(SELECT SdeptFROM    StudentWHERE Sname= '刘晨');[37 ]找出每个学生超过他选修课程平均成绩的课程号。SELECT Sno, CnoFROM    SC  xWHERE Grade >=(SELECT AVG(Grade) FROM  SC yWHERE y.Sno=x.Sno);

3.带有ANY(SOME)或ALL谓词的子查询

使用ANY或ALL谓词时必须同时使用比较运算

语义为:

  • ANY 大于子查询结果中的某个值

  • ALL 大于子查询结果中的所有值

  • < ANY 小于子查询结果中的某个值

  • < ALL 小于子查询结果中的所有值

  • = ANY 大于等于子查询结果中的某个值

  • = ALL 大于等于子查询结果中的所有值

  • <= ANY 小于等于子查询结果中的某个值

  • <= ALL 小于等于子查询结果中的所有值

  • = ANY 等于子查询结果中的某个值

  • =ALL 等于子查询结果中的所有值(通常没有实际意义)

  • !=(或<>)ANY 不等于子查询结果中的某个值

  • !=(或<>)ALL 不等于子查询结果中的任何一个值

 [38]  查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄SELECT Sname,SageFROM    StudentWHERE Sage < ANY (SELECT  SageFROM    StudentWHERE Sdept= ' CS ')AND Sdept <> ‘CS ' ;           /*父查询块中的条件 */

结果:
在这里插入图片描述

执行过程:

(1)首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)
(2)处理父查询,找所有不是CS系且年龄小于 20 或 19的学生
在这里插入图片描述


http://chatgpt.dhexx.cn/article/hpsPGr55.shtml

相关文章

样本轮廓系数(原理、sklearn.metrics.silhouette_score、silhouette_samples参数介绍)

一、轮廓系数含义&#xff1a; 轮廓系数&#xff08;Silhouette Coefficient&#xff09;&#xff0c;是聚类效果好坏的一种评价方式。 最佳值为1&#xff0c;最差值为-1。接近0的值表示重叠的群集。负值通常表示样本已分配给错误的聚类&#xff0c;因为不同的聚类更为相…

java上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前对于java语言&#xff0c;很多人都认为太简单。其实这是不对的&#xff0c;因为某种意义上来说所&#xff0c;java语言就像学习日语一样&#…

Qt之上位机开发实战(一)

一、Qt三大金刚 1、qt下的串口编程 2、qt下的网络编程 3、qt下的GPIO 本章节先介绍一下qt下的串口编程&#xff0c;首先我们新建一个Widget项目 其中接受框使用Plain Text Edit&#xff08;设置只读&#xff09;&#xff0c;串口号等按钮使用Combo Box&#xff0c;发送框使…

C# | 上位机开发新手指南(二)上位机通信

上位机开发新手指南&#xff08;二&#xff09;上位机通信 文章目录 上位机开发新手指南&#xff08;二&#xff09;上位机通信前言串口通信应用场景与控制器通信与传感器通信与仪器仪表通信与智能家居设备通信 常见协议ModbusCAN&#xff08;Controller Area Network&#xff…

C# 西门子PLC上位机开发环境搭建

一、安装软件 1. TIA_Portal_STEP7 15 博途&#xff0c;西门子的自动化开发软件 2. SIMATIC_S7PLCSIM_V15_1 西门子的仿真软件 3. NetToPLCsim C#程序是不能和仿真通信的&#xff0c;只有利用此软件&#xff0c;C#程序才能连接到仿真 二、配置软件 1. 博途 点击 创建新…

java上位机开发(网络编程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的网络编程&#xff0c;一般就是指UDP、TCP编程。传统的方法就是用api或者sdk直接编程&#xff0c;这种方法对于简单的协议是可以的。但是对于…

上位机开发(详细设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 所谓软件详细设计,它的上面对应的是架构设计,下面对应的是程序开发。架构设计有可能涉及多个软件,比如既可能涉及上位机这端,也可能涉及到mcu这端。详细设计的话,一般要落实到…

android ble 上位机,BLE的Android上位机开发(下)

原标题&#xff1a;BLE的Android上位机开发(下) ELLO! 大家好&#xff01;马上就更新下篇了呢~哈哈&#xff01;(上篇的地址&#xff1a;BLE的Android上位机开发(上))废话不多说了&#xff0c;先上主角吧&#xff01;代码如下&#xff01; [Java] 纯文本查看复制代码 ? 01 02 …

java上位机开发(java基础)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 java基础就是把java环境安装好&#xff0c;把基础程序构建起来。至少说让开发的同学来说有一点信心。从这一点来说&#xff0c;就算编写一个“Hell…

上位机开发的意义

上位机开发的意义 常见的上位机定义为一台可以发出特定操控命令的计算机&#xff0c; 通过操作预先设定好的命令&#xff0c;将命令传递给下位机&#xff0c;通过下位机来控制设备完成各项操作。此定义着重于强调控制指令的发送&#xff0c;实际上除了发送控制命令&#xff0c…

Qt之上位机开发实战(三)

UDP编程 udp相对于tcp来说相对简单&#xff0c;udp不分客户端和服务器&#xff0c;只需要使用一个QUdpSocket类&#xff0c;首先完成布局 Pro文件下加QT core gui network&#xff0c;.h文件下加#include <QUdpSocket> .h文件public下创建对象 QUdpSocket *udpSocket;…

C# | 上位机开发新手指南(三)框架

上位机开发新手指南&#xff08;三&#xff09;框架 文章目录 上位机开发新手指南&#xff08;三&#xff09;框架.NETWinFormsWPFUnity3D CQTMFC 其他语言LabVIEW .NET WinForms 在上位机开发中&#xff0c;Windows Forms是使用最广泛的C#框架之一。Windows Forms是.NET Fra…

哈喽上位机(上位机开发指南)

哈喽&#xff0c;上位机&#xff01; -------上位机开发指南 作者&#xff1a;Robert Zhang本博客以一个程序猿的角度解答了: - 有关上位机开发的疑惑 - 上机软件开发需要学习哪些知识 - 开发一个完整商业软件所需的技术与实现方法 - 怎样美化软件&#xff0c;那些漂亮的软件…

C#上位机开发常遇问题

C#上位机开发常遇问题 C#引用C动态库/静态库静态库动态库 unsafe和fixed关键字的应用unsafefixed Path类的使用写在结尾 最近完成了一个小项目的开发&#xff0c;在开发中遇到了一些问题&#xff0c;我感觉这些问题其他人在开发的时候也会遇到&#xff0c;所以我在这边总结一下…

C# 三菱PLC上位机开发环境搭建

一、安装软件 用到两个三菱的软件&#xff1a; 1. MX Component&#xff08;下载地址 也可以直接在官网上搜索&#xff0c;注意MX后面有空格&#xff09; 用于连接PLC 2. GX Works2&#xff08;下载地址 用GX Works3也行&#xff09; 这个软件主要是电气做PLC编程&#xf…

USB上位机开发

上位机开发采用图形化界面&#xff0c;使用C#语言进行开发。调用C编写的Dll动态库&#xff0c;实现与STM32进行USB通信的目的。 首先&#xff0c;编写Dll动态库。 开发环境采用VS2017&#xff0c;语言C 将lusb0_usb.h和libusb.lib文件拷贝到工程目录下。 libusb-win32-bin-…

Matlab上位机开发

Matlab上位机开发 1 了解上位机1.1 上位机的作用1.2 常用上位机开发方式1.2.1 Windows上位机&#xff08;基于串口通信&#xff09;1.2.2 Android上位机&#xff08;基于网络通信&#xff09; 1.3 教程概况1.3.1 C#上位机开发教程1.3.2 IoT App开发1.3.3 Matlab上位机开发 2 He…

C# | 上位机开发新手指南(一)概述

C#上位机开发新手指南&#xff08;一&#xff09;概述 文章目录 C#上位机开发新手指南&#xff08;一&#xff09;概述前言学习C#编程基础熟悉上位机开发相关知识选择合适的开发环境熟练掌握C#编程技巧掌握常用控件的使用方法学习与硬件通讯的方法最后 前言 C#&#xff0c;是微…

上位机开发流程

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;虚心受教。 文章目录 前言一、上位机是什么&#xff1f;二、开发步骤1.了解需求2.分析需求3.设计软件模块4.测试软件5.交付及维护软件 总结&#xff1a; 前言 没有人可以真正理解另一个…

上位机开发(怎么开发上位机)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 要开发上位机,主要还是看具体的用途是什么。比如说,是不是负责烧入固件;是不是调制参数;是不是监控;是不是系统控制、是不是仿真等等。当然,不管是什么样的上位机开发,有一些…