导图社区 关系数据库标准语言SQL
关系数据库标准语言SQL知识梳理,包括1SQL概述、数据定义、数据查询、数据更新、空值的处理等等。
编辑于2022-11-20 14:58:31 河南关系数据库标准语言SQL
3.1SQL概述
3.1.1 SQL的产生与发展
SQL是在1974由Boyce和Chamberlin提出,在IBM公司研制的关系数据库管理系统原型System R上实现。1987年,国际标准化组织(ISO)也通过这一标准。目前,没有一个数据库系统能够支持SQL标准的所有概念和特性。同时,许多软件厂商对SQL基本命令集还进行了不同程度的扩充和修改,又可以支持标准以外的一些功能特性。
3.1.2 SQL的特点
SQL集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能于一体。
1.综合统一
(1)模式数据定义语言(Schema Data Definition Language,模式DDL) (2)外模式数据定义语言(Subschema Data Definition Language,外模式DDL或子模式DDL)。 (3)数据存储有关的描述语言(Data Storage Description Language,DSDL)。 (4)数据操纵语言(Data Manipulation Language,DML)。 它们分别用于定义模式、外模式、内模式和进行数据的存取与处置。 SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体 · 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库。 · 对数据库中的数据进行查询和更新 · 数据库重建和维护。 · 数据库安全性、完整性控制,以及事务控制。 · 嵌入式SQL和动态SQL定义。
2.高度非过程化
SQL进行数据操作时,无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。
3.面向集合的操作方式
SQL采用集合操作方式
4.以同一种语法结构提供多种使用方式
SQL既是独立的语言,又是嵌入式语言
5.语言简洁,易学易用
SQL功能极强,由于设计巧妙,语言十分简洁,易于学习和使用。
3.1.3 SQL的基本概念
基本表和视图一样,都是关系。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。存储文件的逻辑结构组成了关系数据库的内模式。视图是从一个或几个基本表导出的表。数据库中只存放视图的定义而不存放视图对应的数据。视图是一个虚表。用户可以在视图上再定义视图。
3.2 学生-课程数据库
3.3数据定义
关系数据库系统支持三级模式,其模式、外模式和内模式中的基本对象有模式、表、视图和索引。一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。
3.3.1 模式的定义与删除
1.定义模式
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>; 要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的CREATE SCHEMA的权限。 例3.2 CREATE SCHEMA AUTHORIZATION WANG; 定义模式实际上定义了一个命名空间。 目前,在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。也就是说用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。即 CREATE SCHEMA<模式名>AUTHORIATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>];
2.删除模式
在SQL中,删除模式语句如下: DROP SCHEMA<模式名><CASCADE>|RESTRICT>; 其中CASCADE和RESTRICT两者必选其一。选择了CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;选择了RESTRICT(限制),表示如果该模式中没有任何已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属的对象时才能执行DROP SCHEMA语句。
3.3.2 基本表的定义、删除与修改
1.定义基本表
SQL语言使用CREATE TABLE语句定义基本表,其基本格式如下: CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件] . [,<列名><数据结构>[列级完整性约束条件]] . ··· . [,<表级完整性约束条件>]); 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中。完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。 例3.5 建立一个“学生”表Student。 CREATE TABLE Student (Sno CHAR(9)PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/ Sname CHAR(20)UNIQUE, /*Sname取唯一值*/ Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) ); 例3.6 建立一个“课程”表Course。 CREATA TABLE Course (Cno CHAR(4) PRIMARY KEY, /*列级完整性约束条件,Cno是主码*/ Cname CHAR(40)NOTNULL, /*列级完整性约束条件,Cname不能取空值*/Cpno CHAR(4), /*Cpno的含义是先修课*/ Ccredit SMALLINT, FOREIGN KEY(Cpno)REFERENCES Course(Cno) /*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/ ); 本例说明参照表和被参照表可以是同一个表。 例3.7 建立学生选课表SC。 CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY(Sno,Cno), /*主码由两个属性构成,必须作为表级完整性进行定义*/ FOREIGN KEY(Sno)REFERENCES Student(Sno), /*表级完整性约束条件,Sno是外码,被参照物是Student*/ FOREIGN KEY(Cno)REFERENCES Course(Cno) /*表级完整性约束条件,Cno是外码,被参照物是Course*/);
2.数据类型
每一个属性来自一个域,它的取值必须是域中的值。
3.模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。
4.修改基本表
随着应用环境和应用需求的变化,有时需要修改已建立好的基本表。SQL语言用ALTER TABLE语句修改基本表,其一般格式为 ALTER TABLE<表名> [ADD[COLUMN]<新列名><数据类型>[完整性约束]] [ADD<表级完整性约束>] [DROP[COLUMN]<列名>[CASCADE |RESTRICT]] [DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]] [ALTER COLUMN<列名><数据结构>];
5.删除基本表
当某个基本表不再需要时,可以使用DROP TABLE语句删除它。其一般格式为: DROP TABLE<表名>[RESTRICT|CASCADE]; 若选择RESTRICT,则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。 若选择CASCADE,则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。基本表定义一旦被删除,不仅表中的数据和此表的定义将被删除,而且此表上建立的索引、触发器等对象一般也都将被删除。如果欲删除的基本表被其他基本表所引用,则这些表也可能被删除。
3.3.3 索引的建立与删除
索引不是越多越好。 因为索引自身需要维护,并占有一定的资源,一般在经常用于检索的字段上建立索引。 索引虽然能够加速数据库查询,但不是越多越好,要根据实际应用的需要有选择地创建索引。用户不能显式地选择索引。 1.建立索引 CREATE[UNIQUE][CLUSTER]INDEX<索引名> ON<表名>(<列名>[<次序>][,<列名>[<次序>]]···); UNQUE表明次索引的每一个索引值只对应唯一的数据记录。 2.修改索引 ALTER INDEX<旧索引名>RENAME TO<新索引名>; 3.删除索引 DROP INDEX<索引名>;
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典中的相关信息。
3.4 数据查询 数据查询是数据库的核心操作 SELECT [ALL|DISINCT] <目标列表达式> [,<目标列表达式>] ··· FROM <表名或视图名> [,<表名或视图名>··· ] | (<SELECT语句>) [AS] <别名> [WHERE<条件表达式>] [GROUP BY <列名1> [HAVING <条件表达式> ] ] [ORDER BY <列名2> [ASC | DESC] ];
数据查询是数据库的核心操作。
3.4.1 单表查询
1.选择表中的若干列 查询指定列 SELECT Sno,Sname FROM Student; SELECT Sname,Sno,Sdept FROM Student; 各个列的先后顺序可以与表中的顺序不一致 查询全部列 如果列的显示顺序与其在基表中的顺序相同,也可以简单的将<目标列表达式>指定为*。 SELECT* FROM Student; 等价于 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式。 用户可以通过指定的别名来改变查询结果的列标题。 2.选择表中的若干元组 1.消除取值重复的行 (用DISTINCT消除) 2.查询满足条件的元组(查询满足指定条件的元组可以通过WHERE子句实现) (1)比较大小 (2) 确定范围 BETWEEN后是范围的下限(即低值),AND是范围的上限(即高值) (3)确定集合 (4)字符匹配 %(百分号)代表任意长度(长度可以为0)的字符串。 例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb、addgb、ab等都满足该匹配串。 _(下横线)代表任意单个字符。 (5)涉及控制的查询 (6)多重条件查询 逻辑运算符AND和OR可用来连接多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。 3.ORDER BY子句 用户可以用ORDER BY子句对查询结果按照一个或多个属性的升序(ASC)或降序 (DESC)排列,默认值为升序。 对于空值,排序 时显示的次序由具体系统实现来决定。 4.聚集函数 COUNT(*) 统计元组个数 COUNT( [DISTINCT|ALL] <列名>) 统计一列中值的个数 SUM( [DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须是数值型) AVG( [DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须是数值型) MAX( [DISTINCT|ALL] <列名>) 求一列值的最大值 MIN( [DISTINCT|ALL] <列名>) 求一列值的最小值 如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。 5.GROUP BY子句 分组后聚集函数将作用于每一个组,即每一组都有一个函数值。 WHERE子句与HAVING短语的区别在于作用对象不同。
3.4.2 连接查询
1. 1.等值与非等值连接查询 连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为 [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2> 还可用以下形式: [<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3> 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。 SELECT子句与WHERE子句中的属性名前都加上了表名前缀,这是为了避免混淆。 2.自身连接 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接 3.外连接 4.多表连接 连接操作除了可以是两表连接、一个是与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。
3.4.3 嵌套查询
一个SELECT-FROM-WHERE语句称为查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)。
3.4.4 集合查询
1. 集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。
3.4.5 基于派生表的查询
1. 子查询不仅可以出现在WHERE字句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象。
3.4.6 SELECT语句的一般格式
1. SELECT [ALL|DISTINCT] <目标列表达式> [别名] [,<目标列表达式> [别名]] ··· FROM <表名或视名> [别名] [,<表名或视图名> [别名]] ··· |(<SELECT语句>)[AS] <别名> [WHERE <条件表达式>] [GROUP BY <列名1> [HAVING<条件表达式>]] [ORDER BY <列名2> [ASC|DESC]];
3.5 数据更新
3.5.1插入数据
1.插入元组 INSERT INTO<表名>[(<属性列1>[,<属性列2>]···)] VALUES(<常量1>[,<常量2>]···); 2.插入子查询结果 INSECT INTO<表名>[(<属性列1>[,<属性列2>]···)] 子查询;
3.5.2 修改数据
UPDATE<表名> SET<列名>=<表达式>[,<列名>=<表达式>]···)] [WHERE<条件>];
3.5.3 删除数据
DELETE FROM<表名> [WHERE<条件>];
3.6 空值的处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。(NULL≠0) · 该属性应该有一个值,但目前不知它的具体值。 · 该属性不应该有值。 · 由于某种原因不便于填写。
3.7 视图
3.7.1 定义视图
1.建立视图 CREATE VIEW<视图名>[(<列名>[,<列名>]···)] AS<子查询> [WHERE CHECK OPTION]; 2.删除视图 DROP VIEW<视图名>[CASCADE];
3.7.2 查询视图
关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(view resolution)。
3.7.3 更新视图
更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。
3.7.4 视图的作用
1.视图能够简化用户的操作。 2.视图使用户能以多种角度看待同一数据。 3.视图对重构数据库提供了一定程度的逻辑独立性。 4.视图能够对机密数据提供安全保护。 5.适当利用视图可以更清晰地表达查询。
结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言,也是一个通用的、功能性极强的关系数据库语言。