| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【期末不挂科】第三章 关系数据库标准语言 SQL -> 正文阅读 |
|
[大数据]【期末不挂科】第三章 关系数据库标准语言 SQL |
3.1 SQL 概述3.1.1 SQL 的产生与发展
3.1.2 SQL的特点
3.1.3 SQL的基本概念支持SQL的关系数据库管理系统同样支持关系数据库三级模式结构。
3.2 学生-课程数据库第一步就是先要建立一个课程数据库, 举例三张表
3.3 数据定义
3.3.1 模式的定义与删除1.定义模式在SQL中,模式定义语句如下:
2.删除模式在SQL中,删除模式语句如下:
其中Cascade 和 restrict 两者必须选起义。选择了cascade(级联),表示在删除模式的同时把该模式中所有 3.3.2 基本表的定义、删除与修改1.定义基本表SQL 语言使用 Create table语句定义基本表,其基本格式如下:
建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由关系数据库管理系统自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则可以定义在列级也可以定义在表级。 例如,建立一个“学生”表Student。
系统执行该CREATE TABLE语句后,就在数据库中建立一个新的空“学生”表Student,并将有关“学生”表的定义及有关约束条件存放在数据字典中。 2.数据类型关系模型中一个很重要的概念是域。每一个属性来自一个域,它的取值必须是域中的值。 在SQL标准支持多种数据类型,以下列出常用几种数据类型。
3.模式与表每一个基本表都属于某一个模式,一个面试包含多个基本表。当定义基本表时一般可以有三种方法定义它所属的模式。 例如,定义一个学生-课程模式S-T。现在要在S-T中定义Student、Cource、SC等基本表。 方法一,在表名中明显地给出模式名。
方法二,在创建模式语句中同时创建表 当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径(search path)来确定该对象所属的模式。 4.修改基本表随着应用环境和应用需求的变换,有时需要修改已建立好的基本表。SQL 语言用ALTER RABLE语句修改基本表,其一般格式为
其中<表名>是要修改的基本表,ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件。DROP COLUMN 子句用于删除表中的列,如果指定了CASCADE短语,则自动删除引用了该列的其他对象,比如视图:如果指定了RESTRICT短语,则如果该列被其他对象引用,RDBMS将拒绝删除该列。DROP CONSTRAINT子句用于删除指定的完整性约束条件。ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型。 5.删除基本表当某个基本表不再需要时,可以使用DROP TABLE语句删除它。其一般格式为:
若选择RESTRICT,则该表的删除是有限制条件的。删除的基本条件表不能被其他表的约束所引用(如 CHECK,FOREIGN KEY 等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。 3.3.3 索引的建立与删除当表的数据量比较大时,查询操作会比较耗时。建立索引是加快查询速度的有效手段。数据库索引类似于图书后面的索引,能快速定位到需要查询的内容。用户可以根据应用环境的需要再基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。 数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列(hash)索引、位图索引等。 建立与删除索引由数据库管理员或表的属主(owner),即建立表的人,负责完成。关系数据库管理系统在执行查询时会自动选择合适的索引作为存取路径,用户不能显式地选择索引。 1.建立索引建立索引使用CREATE INDEX语句,格式为:
其中,<表名>是建立索引的基本表的名字。索引可以建立在改表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC(升序)或DESC(降序),默认值为ASC。 2.修改索引对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX语句。格式为:
3.删除索引索引一经建立就由系统使用和维护,不需用户干预。建立索引是为了减少查询操作的时间,但如果数据增、删、改频繁,系统会花费许多时间来维护索引,从而降低了查询效率。 删除索引使用DROP INDEX语句,格式为:
3.3.4 数据字典数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。 3.4 数据查询数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,改语句具有灵活的使用方式和丰富的功能。 3.4.1 单表查询单表查询是指仅涉及一个表的查询。 1.选择表中的若干列选择表中的全部或部分列即关系代数的投影运算。
2.选择表中的若干元组
3.ORDER BY子句用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认为升序。 例如,查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序。
或相反,默认升序。 4.聚集函数为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,主要有:
如果指定DISTINCT 短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT 短语或指定ALL 短语(ALL为默认值),则表示不取消重复值。 5.GROUP BY子句GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一组,即每一组都有一个函数值。 例如,求各个课程号及相应的选课人数
查询结果假定为: 如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。 例如,查询选修了三门以上课程的学生学号。
3.4.2 连接查询若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接拆线呢、外连接查询和复合条件连接查询等。 1.等值与非等值连接查询连接查询的 where 子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为
其中比较运算符主要有=、>、<、>=、<=、!=(或<>)等。
当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。 例如,查询每个学生及其选修课程的情况。 学生情况在Student表中,学生选课情况在SC表中,所以这次查询涉及了两张表。这两张表之间的联系是通过公共属性Sno实现的。
查询结果: 2.自身连接连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。 例如,查询每一门课的间接先修课(即先修课的先修课) 比如说我要先学数据库但是学数据库之前就要先学数据结构,但是我要去学数据结构就要先学 PASCAL 语言。这就是间接先修课。 为此,要为 Course 表取两个别名,一个是FIRST,另一个是 SECOND。 完成该查询的 SQL 语句为
结果为: 3.外连接假设有这样的两个表格:Student与 SC表 Student为所有的学生,而SC表为学生的选课表,我们可以知道王敏和张力没有选课,当使用Student.Sno=Sc.Sno的条件时,我们会发现无法出现王敏和张立的信息 为此,此时可以这样使用:
结果为: 4.多表连接连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。 例如,查询每个学生的学号、姓名、选修的课程名及成绩。本查询涉及三个表,完成该查询的SQL语句如下:
关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。 3.4.3 嵌套查询在SQL 语言中,一个 SELECT-FROM-WHERE语句称为一个查询块嵌套在另一个查询块的WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询(nested query)。 例如:
1.带有IN谓词的子查询在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最经常使用的谓词。 例如,查询与“王林”同一个系学习的学生的所有信息 一般我们的思路是先拿到“王林”的系名,在从系里查找一起学习的学生的所有信息,所以需要两步骤:
但是这样看明显很麻烦而且还要多次查询比较耗时占用资源,所以我们使用 IN 谓词嵌套查询:
2.带有比较运算符的子查询带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=或<>等比较运算 其使用方法和 IN 一致。
3.带有ANY(SOME)或ALL谓词的子查询子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。而使用ANY或ALL谓词时则必须同时使用比较运算符。其语义为:
例如,查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄
结果如下: 4.带有EXISTS谓词的子查询exists谓词代表存在量词。带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。可以利用exists来判断 属性与关系表之间的属于关系,关 话不多说,第一眼我也没看懂,来个例子看下也许就明白了。 例如,查询所有选修了 1 号课程的学生姓名。 思路:在Student中依次取每个元组的Sno值,用此值去检查 SC 表。若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其 Cno=‘1’,则取此Student.Sname送入结果表。SQL 语句是
使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE 子句返回真值,否则返回假值。 3.4.4 集合查询SELECT 语句的查询结果是元组的集合,所以多个SELECT 语句的结果可进行集合操作。集合操作主要包括并操作UNION、交操作 INTERSECT 和差操作 EXCEPT。 这一小节非常有意思,主要就是集合的并集,交集,差集三个语法,能看到我的文章的同学一定知道数学里的三种意思。 话不多说,看个实例,查询计算机科学系的学生性别为男的学生。 首先我们要查找两个集合
二计算机科学系的学生
之后我们用 INTERSECT进行合并
这样我们就能查到计算机科学系的学生性别为男的学生了。 3.4.5 基于派生表的查询子查询不仅可以出现在WHERE子句中,还可以出现在 FROM 子句中,这时子查询生成的临时派生素(derived table)成为主查询的查询对象。大眼一看我也不懂。举例我们分析一下 例如,找出每个学生超过他自己选修课程平均成绩的课程号。 SQL语句为:
通过 3.5 数据更新数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。在SQL中有相应的三类语句。 3.5.1 插入数据SQL 的数据插入语句 INSERT 通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。 1.插入元组插入元组的 INSERT 语句格式为:
这么看可能不是很懂,再看一个实例你就明白了 例如,将一个新学生元组(学号201215128,姓名:陈东,性别:男,所在系:计科系,年龄:18岁)插入到 Student 表中。 SQL 语句为:
2.插入子查询结果这个设计非常方便,我们可以先从数据库查询一个集合,把这个查询语句当作插入的子查询,这样可以用查询出的结果映射在要插入的属性字段中。 插入子查询结果的 INSERT 语句格式为
例如,对每一个系,求学生的平均年龄,并把结果存入数据库。 SQL语句为:
3.5.2 修改数据修改操作又称更新操作。我们用 UPDATE 和 SET 来进行修改操作。 1.修改某一个元组的值例如,将学生201215121的年龄改为22岁。
2.修改多个元组的值例如,将所有学生的年龄增加1岁。
3.带子查询的修改语句这种修改方式和插入操作一致也是嵌套的方式。 例如,将计算机科学系全体学生的成绩置零。
3.5.3 删除数据删除操作和插入修改基本相差不多,当然了既然是删除就要更为严谨一点。一般我们用 DELETE语句 进行删除操作,这里强调一点,DELETE 语句删除的是表中的数据,而不是表种的属性(字段)。 1.删除某一个元组的值例如,删除学号为201215121的学生记录。
2.删除多个元组的值例如,删除所有的学生选课记录
这个语句可以使 SC 表成为空表,删除了SC的所有元组。 3.带子查询的删除语句删除操作当然也可以使用嵌套方法进行指定删除。 例如,删除计算机科学系所有学生的选课记录
3.6 空值的处理空值定义:空值就是“不知道”或“不存在”或“无意义”的值。 SQL 语言中允许某些元组的某些属性在一定情况下取空值。一般情况如下:
所以,空值是一个很特殊的值,含有不确定性,对关系运算带来了特殊的问题,需要以下特殊处理方式。 1.空值的产生例如,向 SC 表插入一个元组,学生号是“201215121”,课程号是“1”,成绩为空。
或者在插入的时候不填任何,默认也是空值。 2.空值的判断判断也给属性的值是否为空值,用 IS NULL 或 IS NOT NULL来表示。 例如,从Student表中找出漏填了数据的学生信息。
3.空值的约束条件属性定义(或者域定义)中有 NOT NULL 约束条件的不能取空值,加了 UNIQUE 限制的属性不能取空值,码属性不能取空值。 4.空值的算术运算、比较运算和逻辑运算空值与另一个值(包括另一个空值)的算术的结果为空值,空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN,有了 UNKNOWN 后,传统的逻辑运算中二值(true,false 逻辑就扩展成了三值逻辑。AND、OR、NOT的真值表如表所示,其中T表示true,F就表示 false,U表示 unknown。 在查询语句中,只有使 WHERE 和 HAVING子句中的选择条件为 TRUE 的元组才被选出作为输出结果。 例如,找出选修 1 号课程的不及格的学生。
选出的学生是那些参加了考试(Grade 属性为非空值)而不及格的学生,不包括的学生。因为前者使条件 Grade<60 的值为 true,后者使条件的值为 UNKNOWN。 3.7 视图1.视图是什么?视图(View)并不在数据库中实际存在,而是一种虚拟表,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。 2.视图和表什么区别和联系?参考:https://blog.csdn.net/duoyu779553/article/details/86579296 3.7.1 定义视图1.建立视图SQL语言用CREATE VIEW 命令建立视图,其一般格式为
其中,子查询可以是任意的SELECT语句,是否可以含有 ORDER BY 子句和 DISTINCT 短语,则取决于具体系统的实现。 例如,建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生。
由于在定义 IS_Student 视图时加上了 WITH CHECK OPTION 子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上 Sdept='IS’条件。 若一个视图是从的单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。 2.删除视图该语句的格式为:
例如,删除刚刚创建的view_emp_dep视图:
3.7.2 查询视图视图定义后,用户就可以像对基本表一样对视图进行查询了。 例如,在信息系学生的视图中找出年龄小于20岁的学生。
关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(view resolution)。 3.7.3 更新视图更新视图是指通过视图来插入、删除和修改数据。 由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作。 为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内基本表数据进行操作,可在定义视图时加上 WITH CHECK OPTION 子句。这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件拒绝执行该操作。 例如,将信息系学生视图IS_Student 中学号为“201215121”的学生姓名改为“刘辰”。
转换后的更新语句为
3.7.4 视图的作用
练习题
总结SQL 可以分为数据定义、数据查询、数据更新、数据控制四大部分。本章为重点建议多多练习,特别是增删改查实操部分。 创作不易,点个赞吧! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:34:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |