数据库 关系数据库标准语言SQL(一)
数据库 关系数据库标准语言SQL(一)
一、SQL的特点
-
功能综合且风格统一
SQL语言集数据定义语言、数据操纵语言和数据控制语言的功能于一体,语言风格统一。
-
数据操纵高度非过程化
-
面向集合的操作方式
-
以统一的语法结构提供多种使用方式
-
语言简洁且易学易用
| \(\text{SQL}\) 功能 | 动词 |
|---|---|
| 数据定义 | \(\text{CREATE,\ DROP,\ ALTER}\) |
| 数据查询 | \(\text{SELECT}\) |
| 数据操纵 | \(\text{INSERT,\ UPDATE,\ DELETE}\) |
| 数据控制 | \(\text{GRANT,\ REVOKE}\) |
二、数据定义
(1)数据的定义和删除
1. 定义模式
CREATE SCHEMA [<模式名>] AUTHORIZATION <用户名>;
例1
为用户 WANG 定义一个 “学生选课” 模式 \(S-C-SC\)。
CREATE SCHEMA "S-C-SC" AUTHORIZATION WANG;
例2
未指定模式名的模式定义示例。
CREATE SCHEMA AUTHORIZATION WANG;
没有定义指定的 <模式名>,所以 <模式名> 隐含为用户名 "WANG"。
定义模式实际上定义了一个命名空间,在这个空间可以进一步定义该模式包含的数据库对象,如基本表、视图、索引等。
例3
为用户 ZHANG 创建一个模式 \(\text{Test}\) ,并且在起重工定义一个表 \(\text{Tab1}\)。
CREATE SCHEMA Test AUTHORIZATION Zhang
CREATE TABLE Tab1( Col1 SMALLINT,
Col2 INT,
Col3 CHAR(20),
Col4 NUMERIC(10, 3),
Col5 DECIMAL(5, 2)
);
2. 删除模式
DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
其中 \(\text{CASCADE}\) 和 \(\text{RESTRICT}\) 必选其一。
\(\text{CASCADE}\) 是级联,表示在删除模式的同时把该模式中所有数据库对象全部删除。
\(\text{RESTRICT}\) 是限制,表示如果定义了数据库对象(如表、视图等),则删除语句拒绝执行;只有什么对象都没定义才执行。
例4
删除 例3 中建立的模式 \(\text{Test}\)。
DROP SCHEMA Test CASCADE;
这语句删除了 \(\text{Test}\),也删除了在该模式中定义的表 \(\text{Tab1}\)。
(2)基本表的定义、删除与修改
1. 定义基本表
CREATE TABLE <表名> ( <列名> <数据类型> [列级完整性约束]
[, <列名> <数据类型> [列级完整性约束]]
...
[, <表级完整性约束>]);
建表的同时,通常可以定义与该表相关的完整性约束,则会写完整性约束被存入系统的数据字典中。
以 “学生选课” 数据库为例讲解 \(\text{SQL}\) 语句。
首先定义 “学生选课” 模式 \(S-C-SC\),该模式包含以下三个表。
“学生” 表:\(\text{Student (}\underline {\text {Sno}}\text{, Sname, Ssex, Sbirthdate, Smajor)}\)。
“课程” 表:\(\text {Course (}\underline {\text{Cno}}\text{, Cname, Ccredit, Cpno)}\)。
“学生选课” 表:\(\text{SC (} \underline{\text{Sno, Cno}}\text{, Grade, Semester, Teachingclass}\)。
关系的主码用下划线表示。
例5
建立一个 “学生” 表
CREATE TABLE Student
( Sno CHAR(8) PRIMARY KEY, /* 列级完整性约束条件,Sno是主码 */
Sname VARCHAR(20) UNIQUE, /* Sname取唯一值 */
Ssex CHAR(6),
Sbirthdate Date,
Smajor VARCHAR(40)
);
例6
建立一个 “课程” 表
CREATE TABLE Course
( Cno CHAR(5) PRIMARY KEY, /* 列级完整性约束条件,Cno是主码 */
Cname VARCHAR(40) NOT NULL, /* 列级完整性约束条件,Cname不能为空 */
Ccredit SMALLINT,
Cpno CHAR(5),
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
/* 表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno */
);
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno
例7
建立 “学生选课” 表
CREATE TABLE SC
( Sno CHAR(8),
Cno CHAR(5),
Grade SMALLINT,
Semester CHAR(5),
Teachingclass CHAR(8),
PRIMARY KEY (Sno, Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义 */
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表级完整性约束,Sno是外码,被参照表是Student */
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表级完整性约束,Cno是外码,被参照表是Course */
)
PRIMARY KEY (Sno, Cno)
主码由两个属性构成,必须作为表级完整性进行定义
FOREIGN KEY (Sno) REFERENCES Student(Sno)
表级完整性约束,Sno是外码,被参照表是Student
FOREIGN KEY (Cno) REFERENCES Course(Cno)
表级完整性约束,Cno是外码,被参照表是Course
2. 数据类型
这里列几种常见的数据类型。
| 数据类型 | 含义 |
|---|---|
| \(\text{CHAR(n), CHARACTER(n)}\) | 长度为 \(n\) 的定长字符串 |
| \(\text{VARCHAR(n), CHARACTERVARYING(n)}\) | 最大长度为 \(n\) 的变长字符串 |
| \(\text{CLOB}\) | 字符串大对象 |
| \(\text{BLOB}\) | 二进制大对象 |
| \(\text{INT, INTEGER}\) | 整数(4字节) |
| \(\text{SMALLINT}\) | 短整数(2字节) |
| \(\text{BIGINT}\) | 大整数(8字节) |
| \(\text{NUMERIC(p, d)}\) | 定点数,由 \(p\) 位数字组成,小数点后有 \(d\) 位数字 |
| \(\text{DECIMAL(p, d), DEC(p, d)}\) | 同 \(\text{NUMERIC(p, d)}\) 类似,但精度不受 \(p\) 和 \(d\) 控制 |
| \(\text{REAL}\) | 单精度浮点数 |
| \(\text{DOUBLE PRECISION}\) | 双精度浮点数 |
| \(\text{FLOAT(n)}\) | 可选精度的浮点数,精度至少为 \(n\) 位数字 |
| \(\text{BOOLEAN}\) | 逻辑布尔量 |
| \(\text{DATE}\) | 日期,格式为 \(YYYY-MM-DD\) |
| \(\text{TIME}\) | 时间,格式为 \(HH : MM : SS\) |
| \(\text{TIMESTAMP}\) | 时间戳类型 |
| \(\text{INTERVAL}\) | 时间间隔类型 |
3. 修改基本表
ALTER TABLE <表名>
[ADD[COLUMN] <新列名><数据类型>[完整性约束]]
[ADD<表级完整性约束>]
[DROP[COLUMN] <列名>[CASCADE | RESTRICT]]
[DROP CONSTRAINT <完整性约束名>[CASCADE | RESTRICT]]
[RENAME COLUMN <列名> TO <新列名>]
[ALTER COLUMN <列名> TYPE <数据类型>]
- $\text{ADD} $ 子句用于增加新列、新的列级完整性约束和新的表级完整性约束。
- \(\text{DROP COLUMN}\) 子句用于删除表中的列,如果制定了 \(\text{CASCADE}\) 短语,则自动删除引用该列的所有对象。
- \(\text{DROP CONSTRAINT}\) 子句用于删除指定的完整性约束。
- \(\text{RENAME COLUMN}\) 子句用于修改列名。
- $\text{ALTER COLUMN} $ 子句用于修改列的数据类型。
4. 删除基本表
DROP TABLE <表名> [CASCADE | RESTRICT]

浙公网安备 33010602011771号