第三章 关系数据库标准语言 SQL

article/2025/9/26 12:51:01

第三章 关系数据库标准语言 SQL

文章目录

  • 第三章 关系数据库标准语言 SQL
    • 3.1 SQL 概述
      • 3.1.1 SQL 的特点
    • 3.2 学生-课程数据库
    • 3.3 数据定义
      • 3.3.2 基本表的创建、删除与修改
        • 1. 基本表的创建
        • 2. 数据类型
        • 3. 插入数据
        • 4. 修改数据
          • (1) 修改某一个元组的值
          • (2) 修改多个元组的值
          • (3) 带子查询的修改语句(后面就讲子查询)
        • 5. 删除数据
      • (1)删除某一个元组的值
      • (2) 删除多个元组的值
      • (3) 带子查询的删除语句(后面就讲子查询)
    • 3.4 数据查询
      • 3.4.1 单表查询
        • 1. 选中表中的若干列
          • (1)查询指定列(属性)
          • (2)查询全部列—— *
          • (3)重命名列名(属性)
        • 2. 选择表中的若干元组
          • (1)去重关键字—— DISTINCT
          • (2)比较
          • (3)确定范围
          • (4) 确定集合
          • (5) 字符匹配
          • (6)涉及空值的查询
          • (7) 多重条件查询
        • 3. ORDERB子句
        • 4. 聚变函数
        • 5. GROUP BY 语句
      • 3.4.2 连接查询——多表查询
        • 1. 等值与非等值连接
        • 2. 自身连接——给自己取别名,代表各自信息
        • 3. 外连接
        • 4. 多表连接
      • 3.4.3 嵌套查询
        • 1. 带有IN谓词的子查询
        • 2. 带有比较运算守甘子查询
        • 3. 带有ANY(SOME)或ALL谓词的子查询
        • 4. 带有EXISTS谓词的子查询
    • 3.5 视图
      • 3.5.1 视图的作用
      • 3.5.2 视图的用法

概述:了解数据库表单的查找、删除、添加、修改

3.1 SQL 概述

3.1.1 SQL 的特点

1. 综合统一
1. 高度非过程化
1. 面向集合的操作方式
1. 以同一种语法结构提供多种使用方式
1. 语言简洁. 易学易用

了解即可

3.2 学生-课程数据库

这里给出navicat的三个表:Student、Course、Sc

请添加图片描述

Student

请添加图片描述

Course表
![请添加图片描述](https://img-blog.csdnimg.cn/fb82f46e342c41e09788c9aeb12c996a.png)
Sc表

3.3 数据定义

3.3.2 基本表的创建、删除与修改

1. 基本表的创建

基本格式:CREATE TABLE <表名> (<列名><数据类型> [列级完整性约束条件]

[,<列名><数据类型> [列级完整性约束条件]]

[,<表级完整性约束条件>])

简而言之:CREATE TABLE + 表名 + 列名(也就是属性) + 列级完整性约束条件

CREATE TABLE student (/*student表*/Sno CHAR ( 9 ) PRIMARY KEY,/*PRIMARY KEY 主键*/Sname CHAR ( 20 ) UNIQUE,/*UNIQUE 唯一*/Ssex CHAR ( 2 ),Sage SMALLINT,Sdept CHAR ( 20 ) 
);
CREATE TABLE Course (/*Course表*/Cno CHAR ( 4 ) PRIMARY KEY,Cname CHAR ( 40 ) NOT NULL,Cpno CHAR ( 4 ) Ccredit SMALLINT,FOREIGN KEY ( Cpno ) REFERENCES Course ( Cno ) 
);
CREATE TABLE SC ( /*Sc表*/Sno CHAR ( 9 ),Cno CHAR ( 4 ),Grade SMALLINT,PRIMARY KEY ( Sno, Cno ),FOREIGN KEY ( Sno ) REFERENCES student ( Sno ),FOREIGN KEY ( Cno ) REFERENCES Course ( Cno ) 
);

2. 数据类型

请添加图片描述
请添加图片描述

数据类型

3. 插入数据

基本格式:INSERT

lNTO<表名> [(<属性列 I>[,<属性列 2>] ···)]

VALUES(<常量l>[,<常量>]…);

简而言之:INSERT + lNTO + 表名 + VALUES()

这里就把上述三个表的数据插入

/*插入数据,student表的数据,可以全部选中直接执行*/
INSERT INTO `student` VALUES('201215121','李勇','男','20','CS');
INSERT INTO `student` VALUES('201215123','王敏','女','18','MA');
INSERT INTO `student` VALUES('201215122','刘晨','女','19','CS');
INSERT INTO `student` VALUES('202115125','张立','男','19','IS');/*由于有外键的约束后面两个表不能一下全部选中执行,需要按顺序一条一条执行,后面会给出原因*/
INSERT INTO `course` VALUES ('1','数据库', '5', '4');/*执行的第5条指令*/
INSERT INTO `course` VALUES ('2', '数学', NULL, '2');/*执行的第1条指令*/
INSERT INTO `course` VALUES ('3', '信息系统','1', '4');/*执行的第6条指令*/
INSERT INTO `course` VALUES ('4', '操作系统', '6', '3');/*执行的第1条指令*/
INSERT INTO `course` VALUES ('5', '数据结构', '7', '4');/*执行的第4条指令*/
INSERT INTO `course` VALUES ('6', '数据处理', NULL, '2');/*执行的第2条指令*/
INSERT INTO `course` VALUES ('7', 'PASCAL语言', '6', '4');/*执行的第3条指令*//*这个表要求前两个表数据全部插入完成,才能插入*/
INSERT INTO `sc`(Sno,Cno, Grade) VALUES ('201215121', '1', '92');
INSERT INTO `sc` VALUES ('201215121', '2', '85');
INSERT INTO `sc` VALUES ('201215121', '3', '88');
INSERT INTO `sc` VALUES ('201215122', '2', '90');
INSERT INTO `sc` VALUES ('201215122', '3', '80');

这里先给出外键的定义,帮助大家理解为什么,插入是这个顺序。后续会精讲

外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

简而言之:只要只要被作为外键的数据,一定要先存在再能插入

4. 修改数据

基本格式:UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]…

[WHERE<条件>];

(1) 修改某一个元组的值
UPDATE student
SET Sage=22
WHERE Sno='201215121';
(2) 修改多个元组的值
UPDATE student
SET Sage=Sage+1;
(3) 带子查询的修改语句(后面就讲子查询)
UPDATE sc
SET Grade=0
WHERE Sno IN(SELECT SnoFROM studentWHERE Sdept='CS';);

5. 删除数据

基本格式:DELETE
FROM<表名>
[WHERE<条件>]

(1)删除某一个元组的值

(2) 删除多个元组的值

(3) 带子查询的删除语句(后面就讲子查询)

3.4 数据查询

基本格式: SELECT [ALL I DISTINCT]<目标列表达式>[,<目标列表达式>J…

FROM<表名或视图名>[,<表名或视图名>···] I (<SELECT语句>)[AS]<别名>

[WHERE<条件表达式>]

[GROUP BY<列名I>[HAVING<条件表达式>]]

[ORDER BY<列名2>[ASC I DESC]]

简而言之:SELECT + FROM + WHERE + GROUP BY (聚合函数)+ ORDER BY (排序方式)

3.4.1 单表查询

1. 选中表中的若干列

(1)查询指定列(属性)
SELECT Sno,Sname/*查询指定列*/
FROM student;/*查询student表*/
(2)查询全部列—— *
SELECT * /*查询全部列*/
FROM student;/*查询student表*/
(3)重命名列名(属性)
SELECT Sname NAME, 'year of birth' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept)
FROM student;

简而言之: 选出目标列(属性)

2. 选择表中的若干元组

请添加图片描述

常用的查询条件
(1)去重关键字—— DISTINCT

DISTINCT:该查询结果里包含了许多重复的行。如想去掉结果表中的重复行,必须指定 DISTINCT:

SELECT DISTINCT Sno
FROM sc;
(2)比较
/*查询计算机科学系全体学生的名单*/
SELECT Sname, Sdept
FROM student
WHERE Sdept = 'CS';
(3)确定范围
/*查询年龄在20~23岁(包括20岁和23岁) 之间的学生的姓名、系别和年龄*/
SELECT Sname, Sdept, Sage
FROM student
WHERE Sage BETWEEN 20 and 23;
/*这里也可以用比较
WHERE Sage >= 20 and Sage <=23;
*/
(4) 确定集合
/*查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别*/
SELECT Sname, Ssex, Sdept
FROM student
WHERE Sdept IN('CS', 'MA', 'IS');
(5) 字符匹配

谓词 LIKE:

基本语法:[NOT] LIKE’<匹配串>' [ESCAPE '<换码字符>' ]

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

    例如 a%b 表示以 a 开头, 以b 结尾的任意长度 的字符串。如 acb 、addgb 、 ab 等都满足该匹配串。

  • -(下横线)代表任意单个字符。
    例如 a_b 表示以 a 开头, 以 b 结尾的长度 为3的任意字符串。如 acb 、 afb 等都满足该匹配串。

/* % 的应用*/
SELECT Sname,Sno,Ssex
FROM student
WHERE Sname LIKE '刘%';
/*_的应用*/
SELECT Sname,Sno,Ssex
FROM student
WHERE Sname LIKE '张_';
(6)涉及空值的查询
/*某些学生选修课程后没有参加考试, 所以有选课记录, 但没有考试成绩。 查询缺少成绩的学生的学号和相应的课程号。*/
SELECT Sno,Cno
FROM sc
WHERE Grade IS NULL;
(7) 多重条件查询
/*查询计算机科学系年龄在20岁以下的学生姓名AND*/
SELECT Sname,Sno,Ssex
FROM student
WHERE Sdept = 'CS' AND Sage < 20;
/*查询计算机科学系年龄或者20岁以下的学生姓名。OR*/
SELECT Sname,Sno,Ssex
FROM student
WHERE Sdept = 'CS' OR Sage < 20;

3. ORDERB子句

/*ASC升序*/
SELECT Sno,Grade
FROM sc
WHERE cno='3'
ORDER BY Grade ASC;
/*DESC降序*/
SELECT Sno,Grade
FROM sc
WHERE cno='3'
ORDER BY Grade DESC;

4. 聚变函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VgyGrkb-1666405040528)(D:\大学四年经历\数据库\图片质料\聚变函数.png)]

/*查询学生总人数  ALL*/
SELECT COUNT(Sno)
FROM sc;

注: WHERE子句中是不能用聚集函数作为条件表达式的。 聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。

5. GROUP BY 语句

定义:对查询结果分组的目的是为了细化聚集函数的作用对象。 分组后聚集函数将作用千每个组,即每 组都有 个函数值。

/*求各个课程号及相应的选课人数。*/
SELECT Cno,COUNT(Sno)
from sc
GROUP BY Cno;

简而言之:GROUP BY 语句是对选中的列(属性)每一个元组,用聚变函数。不用GROUP BY 语句是对选中的列(属性)用聚变函数。

/*从中选择满足条件的元组。HAVING短语作用于组, 从中选择满足条件的组。*/
SELECT Cno,COUNT(Sno)
from sc
GROUP BY Cno
HAVING AVG(Grade) >= 90;

3.4.2 连接查询——多表查询

1. 等值与非等值连接

连接查询的WERE子句中用来连接两个表的条件称为连接条件或连接谓词, 其一般格式为

[<表名I>.]<列名1><比较运符符> [<表名2>]<列名2>
其中比较运算符主要有= 、 > 、 <、 >=、 <=、!= (或<>)等。

/*查询每个学生及其选修课程的情况。*/
SELECT student.*,sc.*
FROM student,sc
WHERE student.Sno=sc.Sno;

2. 自身连接——给自己取别名,代表各自信息

SELECTF FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND 
WHERE FIRST.Cpno=SECOND.Cno; 

3. 外连接

SELECT student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM student left outer JOIN sc on (student.Sno=sc.Sno)

这个概念在前面讲过,不多赘述。简而言之,左外——不包含右边集合独有的部分

4. 多表连接

连接操作除了可以是两表连接、 一个表与其自身连接外, 还可以是两个以上的表进行 连接, 后者通常称为多表连接。

3.4.3 嵌套查询

定义:在SQL语言中, 一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)。

/*查询学生表中在sc表中学号为2的学生姓名*/
SELECT Sname
FROM student
WHERE Sno IN (SELECT SnoFROM sc	WHERE Cno='2');

1. 带有IN谓词的子查询

SELECT Sno,Sname,Sdept
FROM student
WHERE Sdept IN(SELECT SdeptFROM studentWHERE Sname='刘晨');

2. 带有比较运算守甘子查询

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

4. 带有EXISTS谓词的子查询

EXISTS 代表存在量词,带有 EXISTS 谓词的了查询不返回任何数据, 只产生逻辑真“ true ” 或逻辑假值 “ false”。

子查询为真执行父查询,否则不执行

SELECT Sname
FROM student
WHERE NOT EXISTS(SELECT*FROM scWHERE sno=student.sno AND Cno='1');

3.5 视图

基本格式:CREATE VIEW<视图名> [(<列名> [,<列名>]…)J

AS<子查询>
[WITH CHECK OPTION]

3.5.1 视图的作用

  • 视图能够件简化用户的操作
  • 视图使用户能够以多种角度看待同一数据
  • 视图对重构数据库提供了一定程度的逻辑性

3.5.2 视图的用法

与查询无异,不多赘述

在我看来,视图就是用来,装查询结果的。


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

相关文章

(九)密度聚类、层次聚类和轮廓系数[机器学习代码实现]

机器学习课程总结&#xff0c;本系列文章以代码和注释为主。 理论部分搬至博客上比较耗费时间&#xff0c;所以缺少理论部分。但是也欢迎大家一起探讨学习。 如果需要理论部分的讲义&#xff0c;可私信&#xff08;个人觉的讲的很好很全&#xff09;。 文章目录 问题需…

Oracle 数据库中的 索引、约束、视图

约束&#xff1a;就是指对插入数据的各种限制&#xff0c;约束既可在建表的时候直接声明&#xff0c;也可以为已经建好的表添加约束。 视图&#xff1a;就是一个封装了各种复杂查询的语句&#xff0c;就称之为视图。 索引&#xff1a;是一种用于提升查询效率的数据库对象。通过…

数据库原理与应用(SQL)——2、关系数据库(E-R图、关系模式、关系运算、关系代数)

目录 关系 关系运算 元组、域关系演算表达式 题目 关系代数表达式——例 元组演算表达式——例 域演算表达式——例 关系数据库是以二维表形式组织数据&#xff0c;应用数学方法处理数据库组织的方法。目前关系数据库系统在数据管理中已占据了主导地位。 关系 关系&…

Oracle约束 SQL语句分类 集合运算 索引 相关知识点讲解

ORACLE 约束&#xff1a; 数据库用来确保数据满足业务的手段&#xff0c;强制数据符合某些特定条件或者规范才可以插入 主键约束&#xff1a; primary key PK唯一约束&#xff1a;unique非空约束&#xff1a;not null外键约束&#xff1a;foreign key FK检查约束&#xff1a;…

SQL对数据进行统计、常用集合函数

学生表&#xff1a; 1、统计记录个数 1&#xff09; count&#xff08;【all】*&#xff09;【as 列别名】 返回表中的记录数 执行&#xff1a;SELECT COUNT (* ) FROM 学生表 结果为&#xff1a; 执行&#xff1a;SELECT COUNT (* ) as 学生总人数 FROM 学生表…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表&#xff0c;选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

样本轮廓系数(原理、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;所以我在这边总结一下…