Structured Query Language 基础(一)
关系数据库标准语言SQL
结构化查询语言(Structured Query Language)是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。
SQL的特点
SQL集数据查询、数据操纵、数据定义、数据控制功能于一体,主要特点包括:
综合统一:SQL集DDL、DCL、DML的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。
高度非过程化:过程化语言完成某项请求必须指定存取路径,而SQL只需要提出做什么而无须指明怎么做,无须了解存取路径。
面向集合的操作方式:非关系数据模型采用的是面向记录的操作方式、操作对象是一条记录。而SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入.删除、更新操作的对象也可以是元组的集合。
以同一种语法结构提供多种使用方式:SQL既是独立的语言,又是嵌入式语言。
语言简洁、易学易用:
SQL功能 | 动词 |
---|---|
数据查询 | Select |
数据定义 | Create、Drop、Alter |
数据操纵 | Insert、Update、Delete |
数据控制 | Grant、Revoke |
SQL基本概念
学习关系数据库管理系统中的SQL首先要了解关系数据库的三级模式结构,如下图所示:
外模式包括若干视图和部分基本表.用户可以用SQL对基本表和视图进行查询等操作,基本表和视图一样都是关系。基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本表,视图是从一个或几个基本表导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图。
模式包括若干基本表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。
内模式则包括若干存储文件。存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构对最终用户是隐蔽的。
下面将以学生-课程数据库为例介绍SQL的数据定义、数据操纵、数据查询和数据控制语句。
学生一课程数据库中包括以下三个表:
学生表:Student (Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
选课表:SC(Sno,Cno,Grade)
数据定义
SQL的数据定义功能包括模式定义、表定义、视图和索引的定义,如表所示:
操作对象\方式 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
基本表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
注意:SQL标准不提供修改模式定义和修改视图定义的操作,如需修改需要先将其删除后重建。
模式的定义与删除
在SQL中,模式定义语句如下:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
注意:创建模式的用户必须拥有数据库管理员权限或是获得了数据库管理员授予的create schema权限。若没有指定模式名则隐含为用户名。
例如:为用户WANG定义一个学生_课程模式S_T
CREATE SCHEMA S_T AUTHORIZATION WANG
目前,用户在创建模式时可同时在模式定义中进一步创建基本表、视图,定义授权。
例如:为用户YUE创建个模式TEST并定义一个表TAB1
CREATE SCHEMA TEST AUTHORIZATION YUE
CREATE TABLE TAB1(
COL1 INT,
COL2 CHAR(20),
COL3 SMALLINT,
COL4 NUMERIC(6,3)
);
在SQL中,模式删除语句如下:
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
注意:CASCADE和RESTRICT两者必选其一。
CASCADE级联表示在删除模式的同时把该模式下所有数据库对象全部删除
RESTRICT限制表示若该模式下定义了下属的数据库对象则拒绝删除语句的执行
例如:级联删除模式S_T
DROP SCHEMA S_T CASCADE;
基本表的定义、修改与删除
创建一个模式就建立了一个数据库的命名空间,一个框架。然后就是要在这个空间中定义数据库对象,例如数据库基本表。
定义基本表
SQL语言使用CREATE TABLE语句定义基本表。
注意:建表的同时,通常还可以定义与该表有关的完整性约束条件,这些约束条件被存入系统的数据字典中。
若完整性约束条件涉及该表的多个属性列则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
例如:建立一个学生表Student
CREATE TABLE Student( --创建Student数据表
Sno CHAR(9) PRIMARY KEY, --创建属性列Sno 字符型最大值9 设置为主键 列级完整性约束
Sname CHAR(20) UNIQUE, --创建属性列Sname 字符型最大值20 设置为唯一性
Ssex CHAR(2), --创建属性列Ssex 字符型最大值2
Sage SMALLINT, --创建属性列Sage 短整型
Sdept CHAR(20) --创建属性列Sdept 字符型最大值20
);
例如:建立一个课程表Course
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) --设置表级完整性约束,将Cpno设置为外键 参照数据表Course中的Cno列 同时说明参照表与被参照表可以为同一表
);
例如:建立一个选课表SC
CREATE TABLE SC(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), --主键由两个属性构成,必须作为表级完整性进行定义
FOREIGN KEY(Sno) REFERENCES Student(Sno), --将Sno设置为外键 参照数据表Student中的Sno列
FOREIGN KEY(Cno) REFERENCES Course(Cno) --将Cno设置为外键 参照数据表Course中的Cno列
);
每一个基本表都属于一个模式,一个模式包含多个基本表,当定义基本表时,有三种方法定义他所属的模式。
方法一在表名中显示给出模式名,“模式名”.“表名”
CREATE TABLE "S_T".Student(···);
方法二在创建模式语同中同时创建表
CREATE SCHEMA TEST AUTHORIZATION YUE
CREATE TABLE TAB1(
COL1 INT,
COL2 CHAR(20),
COL3 SMALLINT,
COL4 NUMERIC(6,3)
);
方法三设置所属的模式,这样在创建表时表名中不必给出模式名。
当用户创建基本表或其他数据库对象时若没有指定模式,系统根据搜索路径来确定该对象所属的模式。
显示当前搜索路径的语句:
SHOW search_path
数据库管理员也可以设置搜索路径:
SET search_path TO "S_T",PUBLIC;
然后定义基本表。
修改基本表
SQL 语言使用ALTER TABLE语句修改基本表,一般格式如下:
ALTER TABLE <表名>
[ADD [COLUMN]<新列名><数据类型>[完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE | RESTRICT]]
[DROP CONSTRAINT <完整性约束名>[CASCADE | RESTRICT]]
[ALTER COLUMN <列名><数据类型>];
注意
- ADD子句用来增加新列、新的列级完整性约束条件、表级完整性约束条件。
- DROP COLUMN 子句用来删除表中的列。
- DROP CONSTRAINT 子句用来删除指定的完整性约束条件。
- ALTER COLUMN 子句用来修改原有的列定义,包括修改列名以及数据类型。
例如:添加新列S_time 数据类型为日期型
ALTER TABLE Student --修改数据表Student
ADD S_time DATE; --添加新列S_time 数据类型为日期型
例如:修改Sage列属性 数据类型为INT
ALTER TABLE Student --修改数据表Student
ALTER COLUMN Sage INT; --修改Sage列属性 数据类型为INT
例如:增加唯一性给Cname列
ALTER TABLE Course --修改数据表Course
ADD UNIQUE(Cname) --增加唯一性给Cname列
删除基本表
SQL 语言使用DROP TABLE语句删除基本表,一般格式如下:
DROP TABLE <表名> [CASCADE|RESTRICT];
默认情况为RESTRICT。
拓展:如果我们仅仅需要删除表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 语句:
TRUNCATE TABLE table_name
索引的建立、修改与删除
建立索引
SQL语言使用CREATE INDEX语句定义基本表。一般格式如下:
CREATE [UNIQUE][CLUSTER] INDEX<索引名>
ON <表名>(<列名>[次序][,<列名>[次序]]···)·;
注意
- 索引可以建立在该表的一列或多列上,各列名之间使用逗号分开。
- 每个列名后面还可以指定索引值的排列次序。可选ASC(升序)或DESC(降序),默认为ASC(升序)。
- UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
- CLUSTER表示要建立的索引为聚簇索引。
例如:基于Student数据表的Sno列创建唯一索引Stusno
CREATE UNIQUE INDEX Stusno --创建唯一索引Stusno
ON Student(Sno); --基于Student数据表的Sno列
修改索引
对于已经创建的索引可以修改其名称:
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
SQL 语言使用DROP INDEX语句删除索引,一般格式如下:
DROP INDEX <索引名> ;