《数据库系统概念》学习笔记
第三章 SQL
3.1 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包括定义对关系和视图的访问权限的命令。
3.2 SQL数据定义
3.2.1基本类型
SQL标准支持多种固有类型,包括:
- char(n):固定长度的字符串,用户指定长度为n。也可以用全称character。如果为该属性存入的字符串的长度小于n,该字符串后面会追加空格使其达到规定的长度。
- varchar(n):可变长度的字符串,用户指定最大长度n,等价于全称character varying。
- int:整数类型(和机器相关的整数的有限子集),等价于全称integer。
- smallint:小整数类型(和机器相关的整数类型的子集)。
- numeric(p,d):定点数,精度有用户指定。这个数有p位数字,其中d位数字在小数点右边。
- real, double precision:浮点数与双精度浮点数,精度与机器相关。
- float(n):精度至少为n为的浮点数。
值得注意的是:char类型和varchar类型即使存储相同的字符串它们之间相互比较的结果也不确定,建议始终使用varchar类型来避免此类问题。
3.2.2 基本模式定义
命令create table用来定义SQL关系,create table 命令的通用形式是:
create table r
(A1 D1,
A2 D2,
...
An Dn,
<完整性约束1>,
...
<完整性约束k>);
其中r是关系名,每个Ai是关系模式中的一个属性名,Di是属性Ai的域。
SQL支持许多不同的完整性约束,包括:
- primary key(A1, A2…):primary key声明表示属性(A1, A2…)构成关系的主码。主码属性必须非空且唯一。
- foreign key(A1, A2…)references: foreign key声明表示关系中任意元组在属性(A1, A2…)上的取值必须对应于关系s中某元组在主码属性上的取值。
- not null :一个属性上的not null 约束表明在该属性上不允许空值。
SQL禁止破坏完整性的任何数据库更新。
大学数据库的部分SQL数据定义:
create table department
(dept_name varcahr(20),
building varchar(15),
budget numeric(12,2),
primary key (dept_name));
create table course
(course_id varchar(7),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0),
primary key (course_id),
foreign key (dept_name) references department);
create table instructor
(ID varchar(5),
name varchar(20) not null,
dept_name varhar(20),
salary numeric(8,2),
primary key (ID),
foreign key (dept_name) references department);
create table section
(course_id varchar(8),
sec_id varchar(8),
semester varchar(6),
year numeric(4,0),
building varchar(15),
room_number varchar(7),
tiem_slot_id varcahr(4),
primary key (course_id,sec_id,semester,year),
foreign key (course_id