1. 数据库语言
数据结构化语言 (Structured Query Language,SQL),在关系数据库中最普遍使用的语言,是一种通用的、功能强大的关系数据库标准语言。
主要功能:数据查询 (Data Query)、数据操纵 (Data Manipulation)、数据定义 (Data Definition)、数据控制 (Data Control)
基本表:实际存储在数据库中的表;
视图:由若干个基本表或其它视图导出的表,是一个虚表;
SQL 用户:可以是应用程序,也可以是终端用户;
任何一个数据库系统都应向用户提供一种数据库语言,其中包括数据定义语言和数据操纵语言;SQL 语言是集数据定义和数据操纵为一体的典型数据库语言。数据库语言与数据模型密切相关,基于不同的数据模型,数据库语言也不同。
数据定义语言 (Data Definition Language,DDL) :用来定义数据库模式,包括数据库模式定义、数据存储结构和存取方法定义,数据库模式的修改和删除功能。
数据操纵语言 (Data Manipulation Language,DML) :用来表示用户对数据库的操作请求,通常数据操纵语言 DML 能进行的操纵有插入、删除、修改、查询数据库中的信息,简称增删改查。
SQL 可以作为独立语言在终端以交互的方式使用,也可以作为程序设计的子语言使用,即嵌入到高级语言中使用,这种方式下使用的 SQL 称为嵌入式 SQL ,嵌入式 SQL 的高级语言称为宿主语言。
在 DBMS 中,对宿主型数据库语言 SQL 采用两种方法处理:第一种方法是采用预编译;第二种方法是修改和扩充主语言,使之能处理 SQL 语句。
2. SQL 概述
2.1 SQL 的特点
综合统一。非关系模型的数据语言分为模式定义语言和数据操纵语言,其缺点是当要修改模式时,必须停止现有数据库的运行,转储数据,修改模式编译后再重装数据库。SQL 集数据定义、数据操纵和数据控制功能于一体,语言风格统一,可独立完成数据库生命周期的所有活动。
高度非过程化。当进行数据操作时,只要指出“做什么”,无须指出“怎么做”,存储路径对用户来说是透明的,提高了数据的独立性。
面向集合的操纵方式。非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而 SQL 语言采用面向集合的操作方式,其操作对象、查找结果可以是元组的集合。
两种使用方式。第一种方式,用户可以在终端输入 SQL 命令,对数据库进行运行操作,称为自含式语言;第二种方式,将 SQL 语言嵌入到高级程序中 (Python等),称为嵌入式语言。
语言简洁、易学易用。
数据查询:SELECT ,该动词是 SQL 中用得最多的动词。
数据定义:CREATE、DROP、ALTER,用于创建新表、修改表和删除表。
数据操作:INSERT、UODATE、DELETE,用于数据的插入、修改和删除。
数据控制:GRANT、REVORK,用于数据库对象访问的权限授予和回收。
2.2 SQL 语言支持三级模式结构
SQL 语言支持关系数据库的三级模式结构 (外模式、模式、内模式),其中,视图对应外模式、基本表对应模式、存储文件对应内模式。
2.3 SQL 的基本组成
数据定义语言。SQL DDL 提供定义关系模式和视图、删除关系和视图、修改关系模式的命令。
交互式数据操作语言。SQL DML 提供查询、插入、删除和修改的命令。
事务控制 (Transaction Control)。SQL 提供定义事务开始和结束的命令。
嵌入式 SQL 和动态 SQL ( Embedded SQL and Dynamic SQL )。用于嵌入到某种通用的高级语言 (C、C++、Java、Python、PL/I、COBOL 和 VB 等) 中混合编程。其中,SQL 负责操作数据库,高级语言负责控制程序流程。
完整性 ( Integrity )。SQL DDL 包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。
权限管理 ( Authorization )。SQL DDL 中包括说明关系和视图的访问权限。
3. 数据定义
3.1 数据类型
SQL 支持的内部基本类型如下:
3.2 创建表
语句格式:
CREATE TABLE <表名> ( <列名> <数据类型> [列级完整性约束条件] [,<列名> <数据类型> [列级完整性约束条件] ... [,<表级完整性约束条件>] );
列级完整性约束有 NULL (空) 和 UNIQUE (取值唯一) ,如 NOT NULL UNIQUE 表示取值唯一,不能取空值。
示例1. 建立一个供应商、零件数据库。其中关系供应商 S(Sno,Sname,Status,City) 属性名分别表示供应商代码、供应商名、供应商状态和供应商所在城市;关系零件 P(Pno,Pname,Color,Weight,City) 属性名分别表示零件号、零件名、颜色、重量及产地。该数据库要满足如下要求:
(1)供应商代码不能为空,且值是唯一的,供应商的名也是唯一的。
(2)零件号不能为空,且值是唯一的;零件名不能为空。
(3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。
分析:(1)表示 Sno 非空唯一约束,Sname 唯一约束;(2)表示 Pno 非空唯一约束,Pname 非空约束;(3)表示供应商和零件之间是多对多的联系,在关系数据库中,多对多联系必须生成一个关系模式,而该模式的码是该联系两端实体的码加上联系的属性构成的,若该联系名为SP,那么关系模式为SP(Sno, Pno,Qty),另外供应商和零件分别要建立一个关系模式。
CREATE TABLE S ( Sno CHAR(5) NOT NULL UNIQUE ,Sname CHAR(30) UNIQUE ,Status CHAR(8) ,City CHAR(20) ,PRIMARY KEY(Sno) ); CREATE TABLE P ( Pno CHAR(6) ,Pname CHAR(30) NOT NULL ,Color CHAR(8) ,Weight NUMERIC(6,2) ,City CHAR(20) ,PRIMARY KEY(Pno) ); CREATE TABLE SP ( Sno CHAR(5) NOT NULL UNIQUE ,Pno CHAR(6) NOT NULL UNIQUE ,Qty NUMERIC(9) ,PRIMARY KEY(Sno,Pno) ,FOREIGN KEY(Sno) REFERENCES S(Sno) ,FOREIGN KEY(Pno) REFERENCES P(Pno) );
PRIMARY KEY(Pno) 已经定义了 Pno 为主码,所以 Pno CHAR(6) NOT NULL UNIQUE 语句中的 NOT NULL UNIQUE 可以省略。
3.3 修改和删除表
修改表语法格式:
ALTER TABLE <表名> [ADD COLUMN <新列名> <数据类型> [完整性约束条件] [DROP COLUMN <列名>] [DROP [CONSTRAINT]<完整性约束名>] [MODIFY <列名> <数据类型>];
删除表语法格式:
DROP TABLE <表名>;
示例2. 向“ 供应商” 表S 增加Zap “ 邮政编码”;将 Status 字段改为整型;删除供应商表。
# 向“ 供应商” 表S 增加Zap “ 邮政编码” ALTER TABLE S ADD Zap CHAR(6); # 将 Status 字段改为整型 ALTER TABLE S MODIFY Status INT; # 删除供应商表 DROP TABLE S;
3.4 创建和删除索引
数据库中的索引与书籍中的目录页面类似,利用目录页面可以快速查找信息,在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。数据库中的索引是某个表中一列或者若干列的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引作用如下:
- 通过创建唯一索引,可以保证数据记录的唯一性。
- 可以大大加快数据检索速度。
- 可以加快表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
- 在使用 ORDER BY 和 GROUP BY 子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
- 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。
索引分为聚集索引和非聚集索引。聚集索引时指索引项的顺序与表中记录的物理顺序一致的索引。
创建索引语法格式:
CREATE [UNIQUE] [CLUSTER|NONCLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]);
参数说明如下:
- 次序:可选择 ASC (升序) 或 DESC (降序) ,默认值为 ASC。
- UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录。
- CLUSTER:表明要建立的索引是聚集索引,意为索引项的顺序是与表中记录的物理顺序一致的索引组织,默认。
- NONCLUSTER:表示建立的索引是非聚集索引。
删除索引语法格式:
DROP INDEX <索引名> ON <表名>;
示例3. 假设供应销售数据库中有供应商S、零件P、工程项目J、供销情况SPJ 关系,希望建立4个索引。其中,供应商S中Sno按升序建立索引;零件P中Pno按升序建立索引;工程项目J中Jno按升序建立索引;供销情况SPJ中Sno按升序,Pno按降序,Jno按升序建立索引。删除其中一个索引。
CREATE UNIQUE INDEX SNS-O ON S(Sno); CREATE UNIQUE INDEX P-PNO NO P(Pno); CREATE UNIQUE INDEX J-JNO ON J(Jno); CREATE UNIQUE INDEX SPJ-NO ON SPJ(Sno ASC, Pno DESC, JNO ASC); DROP INDEX SNS-O ON SNS-O;
3.5 创建和删除视图
视图是从一个或者多个基本表或视图中导出的表,其结构和数据是建立在对表的查询基础上的;视图不是真实存在的基本表,而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图的优点和作用如下:
可以使视图集中数据、简化和定制不同用户对数据库的不同数据要求。
可以屏蔽数据的复杂性,用户不必了解数据库的结构,就可以方便地使用和管理数据,简化数据权限管理和重新组织数据以便输出到其他应用程序中。
可以使用户只关心他感兴趣的某些特定数据和所负责的特定任务,而那些不需要的或者无用的数据则不在视图中显示。
大大地简化了用户对数据的操作。
可以让不同的用户以不同的方式看到不同或者相同的数据集。
在某些情况下,由于表中数据量太大,因此在表的设计时常将表进行水平或者垂直分割,但表的结构的变化对应用程序产生不良的影响。
提供了一个简单而有效的安全机制。
创建视图语法格式:
CREATE VIEW 视图名(列表名) AS SELECT 查询子句 [WITH CHECK OPTION];
视图的创建,必须遵循如下规定:
(1)子查询可以是任意复杂的 SELECT 语句,但通常不允许含有 ORDER BY 子句和 DISTINCT 短语。
(2)WITH CHECK OPTION 表示对 UPDATE,INSTER,DELETE 操作时保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
(3)组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由 SELECT 子查询目标列的主属性组成。
删除视图语法格式:
DROP VIEW 视图名;
示例4. 若学生关系模式为 Student(Sno,Sname,Sage,Sex,SD,Email,Tel),建立“计算机系”(CS表示计算机系)学生的视图,并要求进行修改、插入操作时保证该视图只有计算机系的学生。
CREATE VIEW CS_STUDENT AS SELECT Sno,Sname,Sage,Sex FROM Student WHERE SD = 'CS' WITH CHECK OPTION; DROP VIEW CS_STUDENT;
4. 完整性约束
数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据库中数据是正确的,避免非法的更新。数据库完整性重点需要掌握的内容有:完整性约束条件的分类、完整性控制应具备的功能。
完整性约束类别大概分为实体完整性约束、参照完整性约束、自定义完整性约束三类。
实体完整性约束:非空值约束(NOT NULL)、默认值(DEFAULT)、唯一性约束(UNIQUE、UNIQUE(列名))、主键约束(PRIMARY KEY 、PRIMARY KEY(列名))。
参照完整性约束:外键约束(REFERENCES 表名(列)、FOREIGN KEY(列名) REFERENCES 表名(列))。
自定义完整性约束:约束表达式(CHECK)。
其中,非空值约束和默认值只有列级完整性约束;唯一性约束、主键约束、外键约束、CHECK 有表级和列级完整性约束。
4.1 主键 ( Primary Key ) 约束
完整性约束条件作用的对象有关系、元祖、列三种,又分静态和动态,共分为六类:
在关系中只能有一个主键。声明主键有两种方法:
- 将 PRIMARY KEY 保留字加在属性类型之后(列级完整性约束)。
- 在属性列表中引入新元素,该元素包含保留字 PRMARY KEY和利用圆括号括起形成该键的属性或属性组列表(表级完整性约束)。
当主键有多个属性时必须用方法2,表级完整性约束。
示例5. 学生关系Students(Sno,Sname,Sex,Sdept,Sage)的主键是Sno,在创建学生关系时可使用PRIMARYKEY进行实体完整性约束。创建学生表的SQL语句如下:
CREATE TABLE Students ( Sno CHAR(8) ,Sname CHAR(10) ,Sex CHAR(1) ,Sdept CHAR(20) ,Sage NUMBER(3) ,PRIMARY KEY(Sno) );
4.2 外键(Foreign Key)约束
参照完整性定义语法如下:
FOREIGN KEY (属性名) REFERENCES 表名(属性名) [ON DELETE [CASCADE|SET NULL]
关键字说明:FOREIGN KEY 定义哪些列为外码;REFERENCES 指明外码对应于哪个表的主码;ON DELETE CASCADE
指明删除被参照关系的元组时,同时删除参照关系中的元组;SET NULL 表示置为空值方式。
示例6. 对于示例5学生选课关系SC(Sno, Cno, Grade)中,学号Sno 参照关系Students, 课程号Cno 参照关系C。因此完整的语句为:
CREATE TABLE SC ( Sno CHAR(8) ,Cno CHAR(4) ,Grade NUMBER(3) ,PRIMARY KEY(Sno) ,PRIMARY KEY(Cno) ,FOREIGN KEY Sno REFERENCES Students(Sno) ,FOREIGN KEY Cno REFERENCES C(Cno) );
4.3 属性值上的约束
属性值上的约束可以通过 NOT NULL、UNIQUE 和 CHECK 进行:
NOT NULL:在 SQL 中,NULL 值是所有域的成员,也是每个属性默认的合法值。但是,根据用户要求有些属性不允许取空值,此时可用“NOT NULL”进行约束。例如,银行的账户关系Account(Account-no, branch-name, balance)不允许余额balance取空值,此时可用“balance numeric(12,2) not null” 进行约束,即禁止在该属性上插入一个空值。
UNIQUE:唯一标识数据库表中的每条记录。
CHECK:CHECK 子句可用于保证属性值满足指定的条件,条件与 where 类似。例如,银行关系 Branch (branch-name,branch-city,assets) 要求资产 assets 不能为负值 ,此时可用“CHECK (assets >=0)”进行约束。
示例7. 学生关系Students(Sno,Sname,Sex,Sdept,Sage),假设用户要求学生姓名不能为空,男生的年龄为1525岁,女生的年龄为1523岁。那么可使用如下语句创建表:
CREATE TABLE Students ( Sno CHAR(8) ,Sname CHAR(10) NOT NULL ,Sex CHAR(1) ,Sdept CHAR(20) ,Sage NUMBER(3) ,PRIMARY KEY(Sno) ,CHECK (Sage >= 15 AND ((Sex = 'M' AND Sage <= 25) OR (Sex = 'F' AND Sage <= 23)) );
4.4 全局约束
全局约束是指一些比较复杂的完整性约束,这些约束涉及多个属性间的联系或多个不同关系间的联系。
基于元组的检查子句和断言两种情况:
(1)基于元组的检查子句:这种约束是对单个关系的元组值加以约束。方法是在关系定义中的任何地方加上关键字 CHECK 和约束条件。
例如,年龄在16至20岁之间,可用 CHECK(Sage>=16 AND Sage<=20) 检测。
(2)基于断言的语法格式
格式
CREATE ASSERTION <断言名> CHECK(<条件>)
示例8. 教学数据库的模式Students、SC、C中创建一个约束ASSE-SC1:不允许男同学选修“张勇”老师的课。
CREATE ASSERTION ASSE_SC1 CHECK (NOT EXISTS (SELECT * FROM SC WHERE Cno IN (SELECT Cno FROM C WHERE TEACHER = '张勇') AND Sno IN (SELECT Sno FROM Students WHERE SEX = 'M')));
示例9. 教学数据库的模式Students、SC、C中创建 一个约束ASSE_SC2;每门课最多允许50名男同学选修。
CREATE ASSERTION ASSE_SC2 CHECK (50>=ALL(SELECT COUNT(SC.Sno) FROM Students,SC WHERE Students.Sno = SC.Sno AND SEX = 'M' GROUP BY Cno));
爆肝!一看就懂的《SQL 语言知识体系》【建议收藏】(中):https://developer.aliyun.com/article/1529602