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

【数据库原理】数据增删改查,DML、单表查询、多表连接查询

DML数据操纵语言,处理对象是数据本身。
DDL数据定义语言,处理对象是数据表的结构。

数据库中数据处理主要包括增删改查。查询属于重点部分。
假设数据库中有表:

student(sno,sname,sex,class);	#学生(学号,姓名,性别,班级);学号为主键
course(cno,cname,teacher);	#课程(课程号,课程名,教师);课程号为主键
sc(sno,cno,score);	#学习(学号,课程号,分数);学号和课程号为主键

1. 增加(INSERT)
向一个表格中插入一条数据。注意非空且无默认值的属性,必须插入数据。
语句格式:

 INSERT INTO <表名> [(<列名>)]
 VALUES (<数据>);

(1) 插入单条数据:

INSERT INTO student
VALUES ('20240101','张三','男','2024级计算机科学与技术1班');

(2)插入多条数据:

INSERT INTO course
VALUES ('C01','数据库管理','teacher1'),
	   ('C02','数据结构','teacher2'),
	   ('C03','C语言程序基础','teacher3');

(3)插入子查询结果
把平均成绩大于80分的学生的学号和平均成绩存入另一个的基本表stud_good(sno,avg_score)中。

INSERT INTO stud_good(sno,avg_score)
SELECT sno,AVG(score)
FROM sc
GROUP BY sno
HAVING AVG(scors)>80;

2. 删除(DELETE)

删除现有表或视图中的一行或多行记录。
语句格式:

 DELTET FROM <表名> [WHERE <条件表达式>];

(1)删除单条数据

DELETE FROM student
WHERE sno='20240101';

(2)删除多条数据
删除计算机科学与技术1班所有学生的成绩

DELETE FROM sc
WHERE sno IN (SELECT sno
			  FROM student
		      WHERE class='计算机科学与技术1班')

4. 修改(UDPATE)

修改数据表中的单个数据或多条数据。通过设置条件进行选定修改的数据。
语句格式:

UPDATE <表名>
SET <列名1>=<表达式1> [,<列名2>=<表达式2>]
[WHERE <条件表达式>];

举个栗子
将计算机科学与技术1班学生成绩全部置0。

UPDATE sc
SET score=0
WHERE sno IN (SELECT sno
			  FROM student
			  WHERE class='计算机科学与技术1班')

5. 查询(SELECT)

查询语句较多,第一类是单表查询,条件书写比较简单。第二类是多表查询,需要进行连接操作。

(1)单表查询
语法格式:

SELECT [ALL|DISTINCT] <列名1> [AS <显示列名>]
FROM <表名|视图名> [LIMIT [M,] N]
[WHERE <条件表达式>];

ALL和DISTINCT设置显示全部信息,或去重后的信息。
列名必须有,AS后跟显示列名。比如sno表示学号,使用AS后列名显示‘学号’,但是内容是sno中的信息。*表示数据表的全部列。
LIMIT设置结果的前N行,或从M行开始的前N行。
WHERE设置查询满足条件的记录。
注意:数字类型数据可直接写,除此之外的都需要用单引号‘’。

WHERE条件语句运算符

查询条件运算符含义
比较运算符=、<、>、<=、>=、!=、!<、!>数据大小多少
逻辑运算符AND、OR、NOT逻辑或、与、非
范围运算符BETWEEN AND、NOT BETWEEN AND数据是否在某一范围内
字符匹配符LIKE、NOT LIKE字符串是否满足某种格式,通配符:%匹配任意多个字符、_匹配单个字符
列表运算符IN、NOT IN是否在某一查询结果的列表中
空值IS NULL、 IS NOT NULL数据是否为空值

聚集函数----统计数据
COUNT、AVG、SUM、MAX、MIN

分组筛选----按照某一列进行分组

[GOURP BY 列名清单 [HAVING 条件表达式]]

通常结合聚集函数进行使用,比如统计个数,统计平均数。举个栗子,查询超过35人的班级的人数。

SELECT class,COUNT(*) AS 人数
FROM student
GROUP BY class
HAVING COUNT(*)>35;

注意:WHERE条件查询和HAVING条件查询的区别。WHERE作用于被查询的表,HAVING作用于结果组,选择满足条件的组。

结果排序----按照某规则进行排序
对查询结果按照某一列进行排序,ASC表示升序,DESC表示降序。多列排序亦可。

ORDER BY <列名1> [ASC|DESC] [,列名2] [ASC|DESC]

举个栗子,查询全体学生的信息,查询结构按班级进行升序排序,同一个班级内,按照学号进行降序排序。

SELECT *
FROM student
ORDER BY class ASC, sno DESC;

(2)多表连接查询

多表连接查询,在查询的时候涉及到两个或以上的表格。通常分为交叉连接、内连接、自连接和外连接。外连接分为左连接、右连接和全外连接。

交叉连接:笛卡尔连接
两个表做笛卡尔积运算,分别连接,A表有M个数据,B表有N个数据,交叉连接后有MN条记录。

语法格式:

SELECT [ALL|DISTINCT] [别名.]<选项1> [AS <显示列名>]
FROM <表名1> [别名1], <表名2> [别名2];

内连接:交叉连接中选取满足条件的记录

语法格式:

SELECT [ALL|DISTINCT] [别名.]<选项1> [AS <显示列名>]
FROM <表名1> [别名1], <表名2> [别名2]
WHERE <连接条件表达式> [AND  <条件表达式>];
SELECT [ALL|DISTINCT] [别名.]<选项1> [AS <显示列名>]
FROM <表名1> [别名1] INNER JOIN <表名2> [别名2] ON <连接条件表达式>
WHERE <条件表达式>;

两种格式都是可以使用的,连接条件表达式,一般可以设置两个表中的某些数据必须相同,比如学号相同。
条件表达式,可以加以限制其他的,比如成绩高于80分。

自连接

连接操作一般选用两个不同的表格,对于一个表格可以和自身连接,自连接在逻辑上看成两个表。注意必须设置别名。
语法格式:

SELECT [ALL|DISTINCT] [别名.]<选项1> [AS <显示列名>]
FROM <表名1> [别名1], <表名1> [别名2]
WHERE <连接条件表达式> [AND  <条件表达式>];

举个栗子:查询同时选修了C01和C04课程学生的学号

SELECT A.sno
FROM sc A, sc B
WHERE A.sno=B.sno
AND A.cno='C01'
AND B.cno='C04';

外连接

自然连接中,只有在两个表中匹配的行才在结果中显示,在外连接中可以置限制其中一个表格或者两个表格都不加限制。

语法格式:

SELECT [ALL|DISTINCT] [别名.]<选项1> [AS <显示列名>]
FROM <表名1> [别名1] LEFT|RIGHT|FULL [OUTER] JOIN <表名1> [别名2]
ON <表名1.1>=<表名2.2>;

(3)嵌套查询

一个SELECT FROM WHERE语句为一个查询块。将一个查询块嵌套在另一个查询WHERE子句中或HAVING子句中。

嵌套子查询:嵌套子查询的执行不溢利阿语外部嵌套。首先执行子查询,结果不显示出来,作为外层查询的条件来使用。子查询只执行一次,即可作为外层父查询的条件。

举个栗子:查询没有选秀高等数学的学生学号和姓名

SELECT sno,sname
FROM student
WHERE sno NOT IN (SELECT sno
				  FROM sc
				  WHERE cno IN (SELECT cno
				  				FROM course
			  					WHERE cname='高等数学');

相关子查询:子查询的执行依赖于父查询。
执行过程:
①子查询为父查询的每一个元组(行)执行一次,父查询将子查询引用列的值传递给子查询。
②如果子查询的任何行与其匹配,则父查询取该行存入结果中
③回到①,直到处理完外部表的每一行。

举个栗子:查询所有选修了C01课程的学生姓名

SELECT sname
FROM student
WHERE EXISTS (SELECT *
			  FROM sc
			  WHERE sno=student.sno
			  AND cno='01');

http://www.kler.cn/a/450971.html

相关文章:

  • vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)
  • 2.利用docker进行gitlab服务器迁移
  • 教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解
  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
  • 我的 2024 年终总结
  • 国自然面上项目分享|基于人工智能和病理组学的早癌筛查算法研究|基金申请·24-12-24
  • Windbg常用命令
  • 如何在 Ubuntu 上安装 Minecraft 服务器 [Java 和 Bedrock]
  • 前端在WebSocket中加入Token
  • React基础知识(总结回顾一)
  • WebSSH:基于Go实现的高效Web SSH客户端指南
  • ReentrantLock底层原理、源码解析
  • 共享无人系统,从出行到生活全面覆盖
  • python环境中阻止相关库的自动更新
  • 迁移学习 详解及应用示例
  • 36 Opencv SURF 关键点检测
  • Nexa AI发布OmniAudio-2.6B:一款快速的音频语言模型,专为边缘部署设计
  • 【记录——解除网课自动暂停】的“魔法“
  • IntelliJ IDEA中设置激活的profile
  • Centos下的OpenSSH服务器和客户端
  • 【算法篇】——数据结构中常见八大排序算法的过程原理详解
  • 深入解析 Apache APISIX
  • 14-zookeeper环境搭建
  • 解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题--数据可视化大屏
  • C语言项目 天天酷跑(上篇)
  • day53 第十一章:图论part04