3.1 表定义
3.1.1 SQL语言概览
简介:
- SQL(Structured Query Language,结构化查询语言),SQL最早的版本
是由IBM开发的,它最初叫做Sequel(Structured English QUEry
Language),在20世纪70年代早期作为System R项目的一部分。
发展历史:
- SQL-86:1986年ANSI和ISO发布了第一个SQL标准。
- SQL-89:ANSI发布的一个SQL扩充版本。
- SQL-92:目前大多数商业RDBMS支持此标准,支持SQL标准符合度的四个等级。
- SQL-99:SQL-92的扩充版本,现在部分商业数据库系统支持此标准,支持SQL标准符合度的四个等级。
SQL的四个标准符合度等级:
- Entry level SQL(入门级)
- Transitional SQL (过渡级)
- Intermediate SQL(中间级)
- Full SQL(完全级)
- 目前,没有DBMS产品全部实现了SQL标准符合度的四个等级。
SQL语言的组成部分:
① DDL (Data definition Language) 数据定义语言
如:
- 表:create table,alter table,drop table
- 索引:create index,drop index
- 视图:create view,drop view
- 触发器:create trigger,drop trigger
…
② DML (Data manipulation Language) 数据操纵语言
如:
- 选择:select … from
- 插入、删除、更新:insert, delete, update
③ DCL (Data-control Language) 数据控制语言
如:
- 确认、取消:grant,revoke
3.1.2 SQL数据定义
使用数据定义语言(DDL)定义关系集合:
CREATE TABLE instructor(
ID char(5), --定长字符串
name varchar(20) not null, --可变长字符串,完整性约束:不为空
dept_name varchar(20),
salary numeric(8,2), --有两位有效数字的八位浮点数
primary key(ID)); --指定主键为ID
SQL的DDL语言可用于定义每个关系的信息:
- 每个关系模式。
- 每个属性的取值类型。
- 完整性约束。
- 每个关系维护的索引集合。
- 每个关系的安全性和权限信息。
- 每个关系在磁盘上的物理存储结构。
基本类型:
类型 | 说明 |
---|---|
char(n) | 固定长度字符串,用户指定长度n。 |
varchar(n) | 可变长度的字符串,用户指定最大长度。 |
int | 整数类型(和机器相关的整数类型的子集),等价于全程integer。 |
smallint | 小整数类型(和机器相关的整数类型的子集)。 |
numeric(p,d) | 定点数,精度由用户指定。这个数有p位数字,其中d位数字在小数点右边。 |
real,double precision | 浮点数与双精度浮点数,精度与机器相关。 |
float(n) | 精度至少为n位的浮点数。 |
null | 每种类型都可以包含一个特殊值,即空值。可以声明属性值不为空,禁止加入空值。 |
date | 日期,含年、月、日,如 ‘2015-3-20’。 |
time | 时间,含小时、分钟、秒,如‘ 08:15:30’或‘ 08:15:30.75’。 |
timestamp | 日期 + 时间,如‘2015-3-20 08:15:30.75’。 |
SQL中各类数据库通用的函数举例:
函数 | 说明 |
---|---|
abs() | 绝对值 |
exp() | 指数 |
round() | 四舍五入 |
… | … |
SQL支持的完整性约束举例:
约束 | 说明 |
---|---|
not null | 一个属性上的not null约束表明在该属性上不允许空值。 |
primary key(A1,…,Am) | 声明表示属性A1, …, An构成关系的主码。主码属性必须非空且唯一。主码属性在SQL_92标准中无需指明 not null,但是在SQL_89中需要明确指明。 |
foreign key (A1, …, Am) references | 声明表示关系中任意元组在属性上(A1, …, Am)上的取值必须对应于关系s中某元组的主码属性上的取值。 |
check(P) | P是谓词条件 |
… | … |
例如,声明ID为instructor的主码,并确保salary的值为非负:
/*方法一*/
CREATE TABLE instructor(
ID char(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key(ID), --声明ID为instructor的主码
check (salary>=0)); --条件:salary>=0
/*方法二*/
CREATE TABLE instructor2(
ID char(5) primary key, --直接声明主码
name varchar(20),
dept_name varchar(20),
salary numeric(8,2),
check (salary>=0));
命令举例:
命令 | 说明 | 举例 |
---|---|---|
drop table | 从数据库中删除关于被去掉关系的所有信息。 | DROP TABLE instructor2; |
alter table | 为已有关系增加属性。 | ALTER TABLE instructor add birthday date; |
alter table drop | 从关系中去掉属性,很多数据库系统并不支持此操作 | ALTER TABLE r DROP A |
alter table modify | 修改关系中的属性。 | ALTER TABLE instructor MODIFY (ID char(10)); |
(完)