【数据库系统概论】第三章:SQL

2023-11-07

B站视频
B站第一章
参考资料
图片来自视频链接和参考资料。

本章目录:

  • SQL特点
  • SQL基本概念
  • SQL的基本语法

SQL特点

SQL包括:数据查询、数据操作、数据定义、数据控制
它是一个非过程语言。

什么是非过程性语言?
我们在逻辑和物理模型里讲了层次、网状、关系模型。
其中层次模型和网状模型的查询是要有过程的,而关系模型不需要过程——这就是非过程性语言。

SQL特点:

  • 综合统一:把定义、修改、删除、连接、安全性、完整性、事务控制、动态SQL等统一起来
  • 高度非过程化:层次模型和网状模型是过程化的,关系模型是非过程化的
  • 面向集合的操作方式
  • 以同一种语法结构提供多种使用方式:既可以独立,也可以嵌入到Java或C++中
  • 语言简洁,易学易用

SQL基本概念

在这里插入图片描述
在这里插入图片描述
这一章先将前三行的语法,数据控制是安全性里面的。

一些概念:

  • 基本表:二维表
  • 存储文件:存在数据库里的文件
  • 视图:一个虚表,从一个或多个基本表中导出来的表,视图不是真正的表,他的数据都是在基本表中

外模式:视图与部分基本表
模式:基本表
内模式:存储文件
在这里插入图片描述

SQL

包括:

  1. 数据定义
  2. 数据查询
  3. 数据更新:修改和删除
  4. 视图

1.数据定义

在这里插入图片描述
定义模式CREATE SCHEMA <模式名> AUTHORIZATION <用户名>

为用户WANG定义一个学生-课程模式S-T:(这里用户可以理解为一个账户)

  • CREATE 定义
  • SCEMA模式
CREATE SCHEMA "S-T" AUTHORIZATION WANG;

删除模式DROP SCHEMA <模式名> <CASCADE|RESTRICT>

CASCADE(级联)
删除模式的同时把该模式下所有的数据库对象全部删除
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则停止执行该语句。

基本表的定义,修改,删除
定义格式:

CREATE TABLE <表名>(
      <列名> <数据类型>[ <列级完整性约束条件> ]
      [<列名> <数据类型>[ <列级完整性约束条件>] ]
       ………
      [<表级完整性约束条件> ]
 );

举个定义的例子:
学生表:

CREATE TABLE Student( /*定义一个表名为Student的表*/
Sno(CHAR(9)) PRIMARY KAY,
/*第一列是Sno,是属性(列名),CHAR是数据类型,长度为9. PRIMARY KAY表示设置为主码,逗号分隔*/
Sname CHAR(20) UNIQUE,/*第二列是Sname,设置UNIQUE表示不允许重复*/
Ssex CHAR(2),/*中文'男''女'占两个字节*/
Sdept CHAR(20)
);

课程表:

CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,/*列级完整性约数条件,Cno是主码*/
Cname CHAR(40) NOT NULL,/*Cname不能为空*/
Cpno CHAR(4),/*含义是先修课*/
Ccredit SMALLINT,
FOREIGN KEY(Cpno)REFERENCES Course(Cno)
/*表级完整性约束条件,Cpno是外码,被参照的表是Course,被参照的列是Cno*/
);

一些数据类型:
在这里插入图片描述
修改基本表
格式:

ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ]

如:向Student表增加“入学时间”列,其数据类型为日期型。

ALTER TABLE Student ADD S_entrance DATE;
/*向Student表   增加列,列名为S_entrance  数据类型为DATE*/

如:将年龄的数据类型由字符型(假设原来的数据类型是字符型)为整数

ALTER TABLE Student ALTER COLUMN Sage INT;
/*选择表Student      选择列Sage   让它的数据类型为INT*/

如:增加课程名称必须取唯一值的约束条件

ALTER TABLE Course ADD UNIQUE(Sname);
/**选择表Course 令Sname这列属性UNIQUE**/

删除基本表
格式:

DROP TABLE <表名>RESTRICT| CASCADE;

RESTRICT:删除表是有限制的。

  • 欲删除的基本表不能被其他表的约束所引用
  • 如果存在依赖该表的对象,则此表不能被删除

CASCADE:删除该表没有限制。

  • 在删除基本表的同时,相关的依赖对象一起删除

索引的建立和删除
索引就是为了加快查询的速度。

建立索引:

CREATE UNIQUE INDEX Stusno ON Student(Sno);/*这里Stusno就是索引名*/

修改索引名:

ALTER INDEX SCno RENAME SCSno;

删除索引:

DROP INDEX Stusname;

数据字典
数据字典是DBMS内部的系统表,它记录了数据库中所有的定义信息

2.数据查询(重点)

数据查询部分是围绕这三个表展开的:
在这里插入图片描述
简单查询
查询学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept 
FROM student;
/*这里查的是列*/

查询全体学生的详细记录。

SELECT *
FROM Student;

查全体学生的姓名及其出生年份。这里假定目前年份是2014年。

SELECT Sname,2014-Sage/*可以有算术表达式*/
FROM Student;

得到的表:

Sname 2014-Sage
李勇 1994
刘晨 1995
王敏 1996
张立 1995

给列进行重命名:把Sname改为NAME,把BIRTH那一列全填满’Year of Birth:',把2014-Sage改为BIRTHDAY,让Sdept内的内容全都变为小写并把它这列改名为DEPARTMENT:

SELECT Sname NAME,
'Year of Birth:' BIRTH,
2014-Sage BIRTHDAY,
LOWER(Sdept) DEPARTMENT/*LOWER是一个函数*/
FROM Student;
/*前面是原来的名字,后面是改后的名字*/

得到的表:
在这里插入图片描述

去掉列的重复值:

SELECT DISTINCT Sno
FROM SC;

原表:
在这里插入图片描述
去重后:
在这里插入图片描述
条件查询
在这里插入图片描述
查询计算机科学系的全体学生的名单:

SELECT Sname
FROM Student
WHERE Sdept='CS';
/*查姓名 在Student表里 条件是Sdept列的值为CS*/

查询所有年龄在20岁以下的学生姓名及年龄:

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

查询所有年龄在20-23之间的学生姓名及年龄:

SELECT Sname,Sage
FROM Student
WHERE Sage BEWTEEN 20 AND 23;

查询CS系,MA系,IS系学生的姓名和性别:

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

LIKEA模糊匹配
在这里插入图片描述
查询所有姓刘的学生的姓名、学号和性别:

SELECT Sname,Sno,Ssex
FROM student
WHERE Sname LIkE '刘%';/*以刘开头的字符串*/

查询姓”欧阳“且全名为三个汉字的学生的姓名:

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';/*必须是三个字了*/

查询所有不姓刘的学生的姓名、学号和性别:

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE'刘%'; 

查询DB_Design课程的课程号和学分:当需要匹配的字符串里有_时,在前面加一个转义字符\

SELECT Cno,Ccredit
FROM Course
WHERE Sname LiKE 'DB\_Design' ESCAPE '\';
/*用escape '\'表示那是一个转义字符*/

涉及空值问题
谓词:

  • IS NULL
  • IS NOT NULL
  • IS不能用=代替

查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

查询所有有成绩的学生学号和课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

多重条件查询
逻辑运算符:

  • AND和 OR来联结多个查询条件
  • AND的优先级高于OR
  • 可以用括号改变优先级

可用来实现多种其他谓词:
[NOT] IN
[NOT] BETWEEN … AND …

AND 两个条件都满足
OR 只要满足一个就行

查询计算机系年龄在20岁以下的学生姓名:

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

查询结果进行排序
ORDER BY

  • 从高到低 即降序DESC
  • 从低到高 即升序 啥都不加,或者加ASC

当排序含空值时,把空值当作无穷大了。即从高到低的话就最先显示,从低到高就最后显示。

查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列:

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列:

SELECT *
FROM Student
ORDER BY Sdept , Sage DESC; 
/*先对系号Sdept进行升序排序,所以它是第一关键字
再对年龄降序排列,它是第二关键字*/

聚集函数
用来统计的。

计数:

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

计算总和:

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

计算平均值:

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

最大最小值:

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

在这里插入图片描述
查询学生总人数:

SELECT COUNT(*)
FROM Student;

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

SELECT COUNT(DISTINCT Sno)/*把课程号去重,查询选修了这些课的人数*/
FROM SC;

计算选修1号课程的学生平均成绩:

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

查询选修2号课程的学生最高分数:

SELECT MAX(Grade)
FROM SC
WHERE Cno='2';

查询学生201215012选修课程的总学分数:

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

由SC表的学号Sno可以找到课程号Cno,但找不到学分,要根据课程号找学分,则需要Course表:
在这里插入图片描述
所以这里的条件是:WHERE Sno='201215012' AND SC.Cno=Course.Cno;

GROUP BY

假设一个学校有几千人,我们把他们分为多个班,这样就可以求出每个班的平均分,这就是group by.

HAVINGWHERE的区别:

  • HAVING用于组,从中选出满足条件的
  • 可以理解为:HAVING是对GROUP BY 分类汇总的筛选
  • WHERE用于基表或视图,从中选出满足条件的元组(其实就是一行)

求各个课程号及相应的选课人数:

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

查询选修了2门以上课程的学生学号:

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

多表连接查询
假设现在有两个表:
在这里插入图片描述
如果我们直接:

SELECT *
FROM A,B

我们会得到这两个表的笛卡尔积
在这里插入图片描述
而真正有意义的只有绿色部分:
在这里插入图片描述
所以,我们如果想得到有意义的表:

SELECT *
FROM A,B
WHERE A.学号=B.学号;

在这里插入图片描述
这里学号重复了,我们可以不像上面那样写,而是:

SELECT 学号,姓名,班级,课程,成绩
FROM A,B
WHERE A.学号=B.学号

在这里插入图片描述

左外连接与右外连接

左外连接格式:

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

右外连接只需要把LEFT OUTER 改成RIGHT OUTER即可。

嵌套查询

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块的WHERE子句HAVING短语的条件中的查询称为嵌套查询
  • 限制:不能使用ORDER BY 子句

选择2号课程的学生姓名:

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

括号里面是一个嵌套查询,它查到的是一个集合:Cno是2的Sno集合。
外面的查询是要查名字,其名字对应的Sno要在这个集合里。

在这里插入图片描述
存在EXISTS
在关系代数中我们可以用除法来查找某一全体。

查询选修了所有课程的学生姓名:(这里包含所有,所以要用存在语句)

  1. 有这样一个学生,对于任意Course中的课,该学生都选了
  2. 将上一句话等价转换
  3. 有这样一个学生,不存在Course中的课,该学生没选
  4. 接下来转化成代码:
  5. 有这样一个学生:SELECT Sname FROM Student
  6. 不存在:NOT EXISTS
  7. Course中的课:SELECT Cno FROM Course
  8. 该同学没选(SC对应选课表):NOT EXISTS(SELECT * FROM SC)

即:

SELECT Sname FROM Student /*选一个学生*/
WHERE NOT EXISTS /*不存在*/
	(
	SELECT * FROM Course /*课程表里的课*/
	WHERE NOT EXISTS
		(
		SELECT * FROM SC /*有没选的*/
		WHERE Sno=Student.Sno AND Cno=Course.Cno;
		)
	)

查询所有选修了1号课程的学生姓名:

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

集合查询
并集UNION
交集INTERSECTION
差集EXCEPT
在这里插入图片描述

3.数据更新

数据插入

INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage) 
/*这里指明插入的分别是什么*/
VALUES('201215128','陈冬','男','IS',18);

INSERT
INTO Student
/*不指明插入的是什么,则就是按照表中列的顺序*/
VALUES('201215128','陈冬','男',18'IS');

可以把SELECT的查询结果插入表。

修改语句

将学生201215121的年龄改为22岁:

UPDATE Student
SET Sage=22
WHERE Sno='201215121';

将所有学生的年龄增加1岁:

UPDATE Student
SET Sage=Sage+1;

将计算机科学系全体学生的成绩置零:

UPDATE SC
SET GRADE=0
WHERE Sno in
			(
			SELECT Sno
			FROM Student
			WHERE Student.Sno=SC.Sno and Sdept='CS';
			)

删除语句
删除学号为201215128的学生记录:

DELETE
FROM Student
WHERE Sno='201215128';

4.视图

视图是一种虚表,它真正的数据存在基本表上。

CREATE VIEW <视图名>[<列名>[,<列名>]...]
AS <子查询>
[WITH CHECK OPTION];

关于WITH CHECK OPTION
在这里插入图片描述
举个例子:

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;

这一段代码产生的视图是专业为IS的,包含学生学号、姓名、年龄的视图。但我们在对这个视图进行操作的时候可能对专业为‘MA’的学生数据给改变了——它是不属于试图范围的。
因此我们可以加一句WITH CHECK OPTION,来防止上面说到的情况。

在这里插入图片描述
删除视图
DROP VIEW<视图>[CASCADE];
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据库系统概论】第三章:SQL 的相关文章

  • # 子网掩码

    子网掩码 1 概念简介 子网掩码又叫网络掩码 地址掩码 是一个32位地址 用于屏蔽IP地址的一部分以区别网络号和主机号 并说明该IP地址是在局域网上 还是在远程网上 子网掩码不能单独存在 它必须结合IP地址一起使用 定义规则 子网掩码的设定
  • 机器学习数学基础(一):机器学习与数学分析

    机器学习数学基础 一 机器学习 概念 什么是机器学习 什么是学习 内涵与外延 流程 重点知识 Code 机器学习与数学分析 极限 导数 幂指函数 离散加和 连续积分 泰勒公式 应用 方向导数 梯度 特殊函数 函数 凸函数 一阶可微 二阶可微
  • 怎么复制Vmware虚拟机文件到其他的机器、别的硬盘目录

    Vmware虚拟机安装完之后有的时候需要挪动 备份虚拟机文件 比如 从公司电脑复制到家里电脑 或者将已安装好的虚拟机拷贝给同事使用 或者原来磁盘空间满了需要换一个磁盘等等 Vmware提供了相应的迁移和复制分发机制 避免了我们再次安装虚拟机
  • tensorRT模型性能测试

    目录 前言 1 模型训练 1 1 模型 1 2 数据集 1 3 xml2yolo 1 4 yolo2json 1 5 json2yolo 1 6 训练 2 TRT模型转换 2 1 YOLOv5 ONNX导出 2 2 YOLOv6 ONNX导

随机推荐

  • 榜样访谈——曾钰倬:从讲座中收获经验

    先做一个简单的自我介绍吧 大家好 我是来自湖南农业大学计算机科学与技术专业的曾钰倬 现任CSDN高校俱乐部主席 你在计算机学习方面遇到最大的问题是什么 曾钰倬 学习时缺乏概念联系 或者没有与已有知识联系 新知识难于纳入个人的认知结构 导致了
  • 【计算机毕业设计】237校园招聘系统

    一 系统截图 需要演示视频可以私聊 摘要 随着信息技术在管理上越来越深入而广泛的应用 实现基于SSM框架的校园招聘系统的设计与实现在技术上已成熟 本文介绍了基于SSM框架的校园招聘系统的设计与实现的开发全过程 通过分析企业对于基于SSM框架
  • unity编程实践-HitUFO改进

    作业要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由该 round 的 ruler 控制 每个 trial 的飞碟有
  • 0706--用replace来替换用例中的字段,如手机号码或ID

    第第第 第43个视频讲解 coding utf 8 Time 2021 6 23 11 37 AUTHOR 菜菜同学 SOFTWARE lemon1 1 在EXCEL的用例中 mark规则 值 使用这个来表示当前字段需要进行替换 2 在用例
  • CH340串口驱动(包含各系统平台)

    CH340转串口芯片支持的平台驱动齐全 支持 Windows Linux Android MacOS WinCE 等操作系统 各平台下驱动官网链接和说明如下 各平台的安装与使用问题可参见其他博文 Windows驱动 下载链接 CH340 C
  • Spring学习笔记:基于XML文件和注解两种配置方式实现spring框架的IOC和DI

    首先打开IntelliJ IDEA 创建一个Maven项目spring lesson 删除src文件夹 只保留maven依赖对应的pom文件 这个项目作为父工程 在pom文件中增加
  • filco蓝牙键盘配对流程_无线化浪潮,几款最值得推荐的无线机械键盘

    在外设中相比于游戏鼠标和耳机 键盘对于无线的需求性是最弱的 毕竟键盘放在那一般比较固定 不会像鼠标在使用时线材的拖拽影响移动 耳机的连接线会增加重量 这些增加的重量全都要头部去承担 游戏间隙的内急需要取下等干扰 这也导致在无线化的普及度上键
  • Dev-c++函数的分文件编写

    首先创建一个文件侠 到时候创建的文件地址路径能一样 方便查找 c语言和c 语言雷同 2 新建 项目 3 c项目和c 项目 你用那个语言写就选那个 4 把创建的 文件2 dev 文件 保存在刚刚创建的文件下面 5 然后选择New Fie创建文
  • Lua基础之math(数学函数库)

    Lua5 1中数学库的所有函数如下表 math pi 为圆周率常量 3 14159265358979323846 abs 取绝对值 math abs 15 15 acos 反余弦函数 math acos 0 5 1 04719755 asi
  • 企业工作效率提升系统

    企业工作效率提升系统 自动化办公系统 项目介绍 框架介绍 部署流程 项目截图 小编联系方式 备注 系统名称 自动化办公系统 办公自动化 OA 是面向组织的日常运作和管理 员工及管理者使用频率最高的应用系统 极大提高公司的办公效率 项目介绍
  • hive窗口函数最全总结

    准备工作 一 窗口函数概况 1 1 窗口函数说明 1 2 窗口范围说明 1 2 1 窗口范围取值可选项 1 2 2 默认窗口范围含义 思考一 如何理解省略order by的情况 不能指定窗口范围 二 窗口函数分类和特性 2 1 窗口函数分类
  • C++算法之深度优先搜索算法

    深度优先搜索算法是图算法的一种 即DFS Depth First Search 其过程是对每个可能的分支路径深入直到不能再深入为止 下面会介绍深度优先搜索算法 目录 1 框架 2 过程 2 1 步骤 2 2 解释 3 例题 1 框架 voi
  • ROS知识点——生成点云,发布、订阅ROS点云话题

    文章目录 1 点云基本概念 1 1 点云结构公共字段 1 2 点云类型 1 3 ROS的PCL接口 1 4 pcl ros点云格式转换 2 创建点云并发布ROS点云话题 2 1 创建功能包 2 2 发布ROS点云话题 2 3 订阅ROS点云
  • 【MySQL】12-常见数据类型

    常见类型 原则 一 整型 特点 zerofill 默认无符号 二 小数 1 浮点型 2 定点型 三 字符型 1 较短 2 enum枚举型 3 set型 四 日期型 datetime 和 datestamp 区别
  • No suitable driver found for jdbc:mysql://localhost:3306/test?characterEncoding=UTF8连接不上MySQL解决方法

    No suitable driver found for jdbc mysql localhost 3306 test useUnicode true characterEncoding UTF 8 解决方法 困惑了两天的问题终于解决了 第
  • 还不懂mock测试?一篇文章带你熟悉mock

    每天进步一点点 关注我们哦 每天分享测试技术文章 本文章出自 码同学软件测试 码同学公众号 自动化软件测试 码同学抖音号 小码哥聊软件测试 Hello 大家好 今天小编给大家分享一个实现mock服务的工具moco 那么问题来了 什么是moc
  • 浅谈软件危机

    什么是软件危机 软件危机是计算机软件在它的开发和维护过程中所遇到的一系列严重问题 概括地说 主要包含两方面的问题 如何开发软件 怎样满足对软件日益增长的需求 如何维护数量不断膨胀的已有软件 危机实例 IBM OS 360 操作系统被认为是一
  • C++与Java比较(转)

    作为一名C 程序员 我们早已掌握了面向对象程序设计的基本概念 而且Java的语法无疑是非常熟悉的 事实上 Java本来就是从C 衍生出来的 然而 C 和Java之间仍存在一些显著的差异 可以这样说 这些差异代表着技术的极大进步 一旦我们弄清
  • VS2019 windows驱动开发环境配置

    配置Windows驱动开发环境 VS2019 下载VS2019 下载链接 https visualstudio microsoft com zh hans downloads 选择你所需要的开发环境和配置 确认下载完后 在你安装的WDK 的
  • 【数据库系统概论】第三章:SQL

    B站视频 B站第一章 参考资料 图片来自视频链接和参考资料 本章目录 SQL特点 SQL基本概念 SQL的基本语法 SQL特点 SQL包括 数据查询 数据操作 数据定义 数据控制 它是一个非过程语言 什么是非过程性语言 我们在逻辑和物理模型