数据库系统概念——SQL
SQL查询语言概览
SQL语言有以下几个部分:
- 数据定义语言(Data-Definition Language, DDL):SQL DDL提供定义关系模式、删除关系以及修改关系模式的命令。
- 数据操纵语言(Data-Manipulation Language, DML):SQL DML提供从数据库中查询信息,以及在数据库中插入元组、删除元组、修改元组的能力。
- 完整性(integrity):SQL DDL包括定义完整性约束的命令,保存在数据库中的数据必须满足所定义的完整性约束。破坏完整性约束的更新是不允许的。
- 视图定义(view definition):SQL DDL包括定义视图的命令。
- 事务控制(transaction control):SQL包括定义事务的开始和结束的命令。
- 嵌入式SQL和动态SQL(embedded SQL and dynamic SQL):嵌入式和动态SQL定义SQL语句如何嵌入到通信编程语言,如C、C++和Java中。
- 授权(authorization):SQL DDL包括定义对关系和视图的访问权限的命令。
SQL数据定义
数据库中的关系集合必须由数据定义语言(DDL)指定给系统。
SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:
每个关系的模式。
每个属性的取值类型。
完整性约束。
每个关系维护的索引集合。
每个关系的安全性和权限信息。
每个关系在磁盘上的物理存储结构。
基本类型
SQL标准支持多种固有类型,包括:
- char(n) 固定长度字符串,用户指定长度n。也可以使用全称 character。
- varchar(n) 变化长度字符串,用户指定最大成对n,等价于全称 character varying。
- int 整数类型(和机器相关的整数的有限子集),等价于全称 integer。
- smallint 小整数类型(和机器相关的整数类型的子集)。
- numeric(p,d) 定点数,精度由用户指定。p位数字,其中d位在小数点右边。
- real, double precision 浮点数与双精度浮点数,精度与机器相关。
- float(n) 精度至少为n位的浮点数。
每种类型可包含一个被称作空值的特殊值。
基本模式定义
用 create table 命令定义SQL关系。
create table department
(dept_name varchar (20),
building varchar (15),
budget numeric (12,2),
primary key (dept_name));
create table 命令的通用形式是:
create table r
(A1 D1,
A2 D2,
. . . ,
An Dn,
<完整性约束1>,
. . . ,
<完整性约束k>);
SQL支持许多不同的完整性约束:
-
p r i m a r y k e y ( A j 1 , A j 2 , . . . , A j m ) primarykey(A_{j1},A_{j2},...,A_{jm}) primarykey(Aj1,Aj2,...,Ajm)
表示属性 A j 1 , A j 2 , . . . , A j m A_{j1},A_{j2},...,A_{jm} Aj1,Aj2,...,Ajm构成关系的主码。
主码属性必须非空且唯一。
主码的声明是可选的。 -
f o r e i g n k e y ( A j 1 , A j 2 , . . . , A j m ) r e f e r e n c e s foreignkey (A_{j1},A_{j2},...,A_{jm}) references foreignkey(Aj1,Aj2,...,Ajm)references
foreign key声明表示关系中任意元组在属性 A j 1 , A j 2 , . . . , A j m A_{j1},A_{j2},...,A_{jm} Aj1,Aj2,...,Ajm上的取值必须对应于关系s中某元组在主码属性上的取值。 -
not null
一个属性上的not null约束表明在该属性上不允许空值。
// 向关系插入数据
insert into instructor
// 值的顺序应遵循对应属性在关系模式中列出的顺序
values (10211, ’Smith’, ’Biology’, 66000);
// 从student关系中删除所有元组
delete from student;
// 比delete from r;更强
// 不仅删除r的所有元组,还删除r的模式。
// 此后,除非用create table命令重建r,否则没有元组可以插入r。
drop table r;
// r是现有关系的名字
// A是待添加属性的名字
// D是待添加属性的域
// 关系中所有元组在新属性上的取值被设为null
alter table r add A D;
// 从关系r中去掉属性A
alter table r drop A;
SQL查询的基本结构
SQL查询的基本结构由三个子句构成:select、 from 和 where。
查询的输入是在from子句中列出的关系。
在这些关系上进行where和select子句中指定的运算,然后产生一个关系作为结果。
单关系查询
简单查询的例子:“找出所有教师的名字”
select name
from instructor;
结果是属性名为name的单个属性构成的关系
找出所有教师所在的系名:
select dept_