【数据库概论】3.2 SQL的查询、更新和删除语句

news2024/11/26 18:24:33

一、 数据查询

SQL提供SELECT语句用于查询,一般格式为:
在这里插入图片描述
根据WHERE子句条件表达式从FROM子句指定的基本表、视图中找出满足条件的元组
GROUP BY语句则用作将结果按照<列名1>的值进行分组,该属性列值相等的元组为一个组;ORDER BY用作将结果表按照<列名2>的值升序或者降序排序输出。

3.4.1 单表查询

select子句中的目标列表达式不仅可以使表中属性列,也可以是表达式,比如:

SELECT Sname, 2014-Sage
FROM Student

可以使用DISTINCT消除取值重复的行,比如:
查询全体学生的年龄集合(不允许有重复值)

SELECT DISTINCT Sage FROM Student

使用通配符*可以查询全体记录,例如:
查询全部学生的详细记录

SELECT * FROM STUDENT

使用WHERE子句实现条件查找,常见的查询条件如表所示:
在这里插入图片描述

1.确定范围

确定范围使用BETWEEN… AND… 和NOT BETWEEN …AND …,前者是范围下限,后者是范围上限

2.集合查找

提供集合,查询符合集合元素的项,比如:

SELECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN (‘CS’,"MA)

NOT IN:不在集合汇总 IN:在集合中

3.字符匹配(模糊查询)

使用LIKE可以用来实现模糊查询,语法如下:

[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]

其含义是查找制定属性列与<匹配串>匹配的元组。其中有两种通配符:

  • %代表任意长度的字符串,比如a%b表示a开头b结尾的字符串,包括ab,asfqb等
  • _代表任意单个字符,比如a_b表示a开头b结尾的三元素字符串

另外如果用户查询的字段本来就含有通配符,则西药使用ESCAPE字段对通配符进行转义了。比如:

SELECT Cno FROM Course
WHERE Cname LIKE ‘DB\_Design’ ESCAPE ‘\’

上述例子指的是,'\'是换码字符,在\后的_不算做通配符

4.多重条件查询

在WHERE后的判断语句,可以使用AND或者OR来连接多个查询条件。括号的优先级最高,其次是AND,最后是OR

5.ORDER BY子句

用户可以使用ORDER BY子句对查询结果按照一个或者多个属性升序或者降序排序。比如:
查询选修了三号课程的学生学号及其成绩,分数降序排列

SELECT Sno,Grade
FROM SC
WHERE Cno=‘3’
ORDER BY Grade DESC

6.聚集函数
同时,为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,如下:
在这里插入图片描述
如果指定了DISTINCT短语,那么将会跳过重复值
当聚集函数遇到空值的时候,除了CONUT(*)之外,都跳过空值而非处理。
TIP:WHERE子句中是不能使用聚集函数的,只能用于SELECT和GROUP BY中的HAVING子句中。
使用例子如下:
1.查询学生总人数

SELECT COUNT(*) FROM Student

2.查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno) FROM SC

3.计算选修一号课的学生成绩

SELECT AVG(Grade) FROM SC WHERE Cno=‘1’

7.GROUP BY子句

GROUP BY子句将查询结果按某一列或者多列的值分组,值相等的为一组。对于查询结果分组的目的是细化聚集函数的作用对象。如果没有对查询结果分组,则聚集函数会作用于整个查询结果,分组后聚集函数将会作用于每一个组。而HAVING语句则是用于对组进行筛选,比如:

1.查询选修了三门课以上的学生学号

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3

SC表是学生-课程表,里面存储着学生的选课信息,由于一个学生可能会选择多门课,那么SC表中,同一个学生会有多个记录。上述的SQL语句中GROUP BY指明了组单元为学生学号Sno,他会将SC表中同一学号的所有记录都是作为一个组。HAVING语句指明了,只有在SC表中存在3条记录以上的学生才会在最终结果中输出。

我们再看多点例子,比如:
2.求各个课程号以及相应的选课人数

SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno

该例子将SC表中的课程号Cno相同的视作为一个组,而COUNT(*)则负责统计同一Cno的相同的记录的数量

3.4.2 连接查询

前面的查询都是针对一个表进行的,如果一个查询同时涉及两个及以上的表,则称之为连接查询

1.等值与非等值连接

连接查询到WHERE子句中用来连接两个表的条件称之为连接条件或者连接谓词,一般格式是:

[<TABLE NAME1>.]<COL NAME1><比较运算符>[<TABLE NAME2>.]<COL NAME>

也可以使用BETWEEN…AND…字段。其中当连接运算符为=的时候为等值连接,使用>或者<的时候则是非等值连接

连接谓词中的列名称称为连接字段,连接条件中各个连接字段类型必须是可比的,但是名字不需要相同

比如:
查询每个学生以及其选修课程的状况

SELECT Student.*, SC.*
FROM Student, SC
Where Student.Sno=SC.Sno

在上述例子中,关系型数据库管理系统执行连接操作会首先在表Student中找到第一个元组,然后从头扫描SC表,逐一比较两者的Sno,这其实和嵌套循环连接算法思想相似,而这样的效率是比较低下的。

如果建立索引,可以缩短连接查询的时间。还是上述的例子,如果在SC表Sno上建立了索引的话,就不用每次全表扫描SC了,而是根据Student表中元组的Sno值通过索引找到相应的SC元组。这是索引加快查找速度的实例。

在第二章中我们提到了等值连接和自然连接,在语句中奖目标列中重复的属性列去掉则为自然连接

2.自身连接

连接操作不仅可以在两个表之间执行,也可以是一个表与自己进行连接,称为表的自身连接。他和单表查询的区别在于单表查询是单个表查询的,而自身连接是两个相同的表比较。示例如下:
在这里插入图片描述
在这里插入图片描述

3.外连接

在一般的连接操作中,只有满足连接条件的数组才能输出,如果有的行没有数据的话,会不出现在连接结果中(被舍弃),这是就是悬浮数组。但是有时候我们会希望将悬浮数组保存在结果关系内,而在对应的空属性上填上NULL。外连接示例如下:

SELECT Student.Sno, Sname,Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)

左外连接列出左边关系中所有的元组,右外连接列出右边关系所有的元组。在上述例子中,Student中所有的行都会被查出,即使其在SC中是空值,也不会被置为悬浮数组,而是使用NULL进行填充。

4.多表连接

连接操作支持多个表的连接,称为多表连接,示例如下:

SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course
WHERE Student.Sno=SC.Sno AND SC.Sno=Course.Sno

3.4.3 嵌套查询

在SQL中,一个SELECT-FROM-WHERE语句称之为一个查询快,将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询称为嵌套查询,栗子如下:

SELECT Sname FROM Student
WHERE Sno IN (
SELECT Sno FROM SC
WHERE Cno=‘2’);

上例中,查询了选了课程号为2的学生的姓名。上层查询块称为外层查询或者父查询,下层查询块称之为内层查询或者子查询。在子查询中禁止使用ORDER BY,排序只能对最终输出结果排序。

嵌套查询使得用户可以用多个简单查询构成复杂查询,从而增强SQL的查询能力。以层层嵌套的方式构造程序是SQL中结构化的含义所在。

1. 带有IN谓词的子查询
此种情况中,子查询的结果往往是一个集合,因此谓词IN是嵌套查询中最常用的谓词
比如:
查询和刘晨在同一个系学习的学生

SELECT * FROM Student
WHERE Sdept IN (
	SELECT Sdept
	FROM Student
	WHERE Sname="刘晨")

有一些嵌套查询可以用连接运算代替,有些是不可以代替的。如果子查询的查询条件不依赖父查询,这类子查询称为不相关子查询;如果子查询的查询条件依赖于父查询,则称为相关子查询。如本例中,可以改写为等值连接写法:

SELECT S1.Sno, S1,Sname, S1.Sdept
FROM Student S1, Student S2
WHERE S1.Sdept=S2.dept AND S2.Sname='刘晨'

因此是不相关子查询。

2.带有比较运算符的子查询
带有比较运算符是指父查询和子查询之间使用比较运算符进行连接,使用比较运算符意味着子查询返回值只可以是单个值,不可以是多个值的集合。比如上述的例子“查询和刘晨在同一个系学习的学生”可以改造成比较运算符子查询:

SELECT * FROM Student
WHERE Sdept = (
	SELECT Sdept
	FROM Student
	WHERE Sname="刘晨")

3.带有ANY(SOME)或者ALL谓词的子查询
子查询返回单值的时候可以使用比较运算符,但是返回多值的时候可以使用ANY/SOME或者ALL,其语义如下:
在这里插入图片描述
比如,查询非计算机系中比计算机系中任一学生年龄都小的学生

SELECT Sname, Sage FROM Student
WHERE Sage<ANY(
		SELECT Sage FROM Student
		WHERE Sdept='CS')

4.带有EXISTS谓词的子查询

EXISTS谓词代表∃,表示存在。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑值true或者false。例子如下:

SELECT Sname
FROM Student
WHERE EXISTS
(SELECT * FROM SC
WHERE Sno=Student.Sno AND Cno=‘1’);

使用了EXISTS后,如果内层查询为空,则外层的WHERE子句返回真,否则返回假

EXISTS的子查询目标列表达式一般为*,因为EXISTS只做存在性判断,选择哪个列进行查询没有意义。除了EXISTS外还有NOT EXISTS谓词,作用相反。

3.4.4集合查询

SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可以进行集合操作。集合炒作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT

// 示例:UNION并操作查询计算机系统年龄小于19的学生
SELECT * FROM Student
WHERE Sdept=‘CS’
UNION
SELECT * FROM Student
WHERE Sage<=19

3.4.5 基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时候子查询生成临时派生表,例如:

SELECT Sno,Cno
FROM SC,(SELECT Sno,Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno=Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade

其中的子句的子查询生成一个派生表Avg_sc。该表有两个属性,主查询将SC表和Avg_sc比按照学号进行连接,选出课程成绩大于平均成绩的课程号

3.5 数据更新

1.插入数据

SQL的数据插入语句INSERT可以插入一个元组(单个插入)或者插入一个子查询(一次插入多个)

元组插入示例:

INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES (‘114514’,‘John’,‘m’,‘CS’,18)

此外,子查询可以嵌套在insert语句中以生成要插入的批量数据,其格式如下:

INSERT INTO <表名>(属性列)
子查询

子查询插入示例:

// 将高于平均年龄的学生批量插入到Depte_age表中
INSERT INTO Dept_age(Sdept, Avg_age)
SELECT Sdept,AVG(Sage) FROM Student
GROUP BY Sdept

2.修改数据

修改操作又称为更新操作,使用UPDATE关键字,示例:

UPDATE Student SET Sage=22
WHERE Sno=‘114514’

3.删除数据

删除某一元组

DELETE FROM Student
WHERE Sno=‘114514’

将某个表内容全部删除

DELETE FROM SC

此时表会变为空表,但是表仍然存在

3.6 空值的处理

空值指的是“不知道”或“不存在”或“无意义”的值。一般使用NULL指定。空值的判断一般在WHERE中使用IS NULL和IS NOT NULL。同时也可以在定义列的时候指定是否可以取空值,在列约束条件处使用not null对列加以限制。空值和其他值的算数运算结果也为空,然后空值与其他值的比较运算结果为UNKNOWN。

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

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

相关文章

Essential C++第五章习题

目录 5.1 5.2 5.3 5.4 5.1 C代码&#xff1a; //Stack.h#include<vector> #include<string> #include<iostream> using namespace std;#pragma once#ifndef _STACK_H_ #define _STACK_H_typedef string elemType;class Stack { public://基类的析构函数…

【JavaSE专栏5】Java 基本数据类型和取值范围

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Mine Goose Duck 0.2版本发布

本次我增加了模组的1.16.5和1.18.2的适用版本&#xff0c;新增了一些职业和装扮 1.新职业 1.冒险家 你不会死于摔伤、溺水、火烧、冰冻。 2.工程师 你可以修改888范围内红石设备的状态。 3.模仿者 怪物认为你是他们的一员。 4.加拿大鹅 你会自动报警并召唤警车。 5.…

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP)

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP&#xff09; Wasserstein GAN with Gradient Penalty (WGAN-GP) 我们在训练对抗神经网络的时候总是出现各种各样的问题。比如说模式奔溃 (mode collapse)和 梯度消失&#xff08;vanishing gradient&#xff09;的问题。 比如说…

在linux下安装docker

文章目录 目录 文章目录 前言 一、docker 二、使用步骤 1.环境准备 2.安装 三、配置阿里云镜像加速 四、卸载 总结 前言 一、docker 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomc…

【攻坚克难】详解k8s持久化存储数据pv、pvc存储问题

问题 如图:pod中的容器,创建一个包含文件的目录,重启pod或系统重启后,此目录及其文件都会丢失,如何保证其不会丢失? 图 1 创建包含文件的目录 方法 分析:用pv、pvc为k8s持久化存储数据是最好的选择,可解决上述问题。流程:pv → pvc → pod把创建的目录挂载到pvc上步…

路由 OSPF 优化(FA地址、路由汇总、路由过滤、区域认证、接口认证)

1.2.0 路由 OSPF 优化&#xff08;FA地址、路由汇总、路由过滤、区域认证、接口认证&#xff09; 一、FA地址 该文章介绍的FA地址说辞简单易懂&#xff1a;路由协议系列之六&#xff1a;OSPF FA地址 产生条件 ASBR在其连接外部网络的接口&#xff08;外部路由的出接口&#xf…

CS61A 2022 fall HW 01: Functions, Control

CS61A 2022 fall HW 01: Functions, Control 文章目录CS61A 2022 fall HW 01: Functions, ControlQ1: A Plus Abs BQ2: Two of ThreeQ3: Largest FactorQ4: HailstoneHW01对应的是Textbook的1.1和1.2 Q1: A Plus Abs B 题目&#xff1a; Fill in the blanks in the following f…

Java | 解决并发修改异常问题【CurrentModificationException】

今日碰到Java中的一个异常&#xff0c;名为CurrentModificationException&#xff0c;从属于RunTimeException运行时异常&#xff0c;故作此记录 异常解析 首先来说明一下什么是【并发修改异常】❓ 因为迭代器依赖集合而存在&#xff0c;因为当你在操作集合中元素的时候&#…

springboot中restful风格请求的使用

springboot中restful风格请求的使用restful风格springboot中的使用1.创建html表单页面2.在yml配置文件中开启rest表单支持3.编写controller层及对应映射处理4.启动服务&#xff0c;逐个访问restful风格 Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#…

【手写 Vue2.x 源码】第四十二篇 - 组件部分 - 组件挂载流程简述

一&#xff0c;前言 上篇&#xff0c;组件部分-生成组件的真实节点&#xff1b; 本篇&#xff0c;组件部分-组件挂载流程分析&#xff1b; 二&#xff0c;组件挂载流程分析 1&#xff0c;示例 全局组件&#xff1a;my-button&#xff0c;name&#xff1a;‘全局组件’&…

什么是软件架构中的ASRs(架构需求文档)?

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件工程》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 专栏地址 软件工程专栏地址 专栏系列文章 软件工程复习01&#xff1a;软件工程概述 软件工程复习02&#xf…

十大经典排序算法(动态演示+代码)-快速排序与希尔排序

快速排序 1.什么是快速排序 我们知道排序有很多种&#xff0c;常见的如希尔排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;而快速排序也是排序家族中的一员。因为其在大多数情况下有着优秀的综合性能&#xff0c;快速排序的快速也算是实至…

结构型模式-享元模式

1.概述 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2.结构 享元&#xff08;Flyweight &#xff09;模式中存在以下两种状态&#xff1a; 内…

信息论复习—信源编码的基本方法

目录 信源编码的目的&#xff1a;提高传输效率 离散信源&#xff1a; 离散信源的分类&#xff1a; 离散无记忆信源 (DMS: Discrete Memoryless Source&#xff09;&#xff1a; 离散无记忆信源的特点&#xff1a; 离散无记忆信源编码与译码&#xff1a; 等长编码的编码速…

Day869.索引(下) -MySQL实战

索引&#xff08;下&#xff09; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于索引&#xff08;下&#xff09;的内容。 先来看一下这个问题&#xff1a; 下面这个表 T 中&#xff0c;如果执行 select * from T where k between 3 and 5&#xff0c;需要执行几次…

【Java|golang】1828. 统计一个圆中点的数目

给你一个数组 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries &#xff0c;其中 queries[j] [xj, yj, rj] &#xff0c;表示一个圆心在 (xj, yj) 且半径为 rj 的圆。 对…

git 操作整理

git操作整理 git 配置 git config --global user.name “yuluo” git config --global user.email “1481556636qq.com” git config --global color.ui auto 启用命令行着色输出 git 操作 暂存区 git init . 初始化git仓库 git status 看仓库状态 git add index.html…

【C++】C++11简介 | 列表初始化 | 声明 | 范围for

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;C11简介&…

安装配置Ecplise插件PyDev 8.3.0

参考&#xff1a;安装Eclipse&#xff1a;https://baijiahao.baidu.com/s?id1751992697661111503&wfrspider&forpcEclipse安装PyDev&#xff1a;https://baijiahao.baidu.com/s?id1746725485069671146&wfrspider&forpc方法一&#xff1a;失败打开eclipse&…