目录
3.1 SQL查询语言概览
SQL(Structured Query Language, 结构化查询语言)
SQL语言有几个部分:
- 数据定义语言(Data-Definition Language, DDL)——create/drop/alter/desc
- 数据操纵语言(Data-Manipulation Language, DML)——select/update/insert/delete
- 数据控制语言(Data-Control Language, DCL)——commit/rollback/grant/rewoke
- 完整性(integrity)
- 视图定义(view definition)
- 事务控制(transaction control)
- 嵌入式SQL(embedded SQL)和动态SQL(dynamic SQL)
- 授权(authorization)
3.2 SQL数据定义
数据库中的关系集合是用数据定义语言(DDL)定义的。SQL DDL不仅能够定义关系的集合,还能够定义有关每个关系的信息,包括:
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 为每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
3.2.1 基本类型
SQL标准支持多种固有类型:
- char(n):具有用户指定长度n的固定长度的字符串。也可以使用全称character。
- varchar(n):具有用户指定的最大长度n的可变长度的字符串。等价的全称形式是character varying。
- int:整数(依赖于机器的整数的有限子集),等价的全称形式是integer。
- smallint:小整数(依赖于机器的整数类型的子集)。
- numeric(p, d):具有用户指定精度的定点数。这个数有p位数字(加上一个符号位),并且小数点右边有p位中的d位数字。
- real, double precision:浮点数与双精度浮点数,精度依赖于机器。
- float(n):精度至少为n位数字的浮点数。
每种类型都可能包含一个被称作空(null)值的特殊值。(null值的存在不总是好的)
3.2.2 基本模式定义
我们通过使用create table命令来定义SQL关系。
create table命令的通用形式是:
create table r
(A_1 D_1,
A_2 D_2,
…,
A_n D_n,
<完整性约束_1>,
…,
<完整性约束_k>);
其中r是关系名,每一个\(A_i\)是关系r的模式中的一个属性名,\(D_i\)是属性\(A_i\)的域;也就是说,\(D_i\)指定了属性\(A_i\)的类型以及可选的约束,用于限制所允许的\(A_i\)取值的集合。
典型的约束有以下三种:
- primary key(\(A_{j1}\), \(A_{j2}\), …, \(A_{jm}\)):主码声明表示属性\(A_{j1}\), \(A_{j2}\), …, \(A_{jm}\)构成关系的主码。主码属性必须是非空且唯一的。
- foreign key (\(A_{k1}\), \(A_{k2}\), …, \(A_{kn}\)) references s:外码声明表示关系中任意元组在属性(\(A_{k1}\), \(A_{k2}\), …, \(A_{kn}\))上的取值必须对应于关系s中某元组在主码属性上的取值。(包括MySQL在内的一些数据库系统需要显式列出被引用表s中的被引用属性)
- not null:一个属性上的非空约束表明在该属性上不允许存在空值。
如果要从SQL数据库中去掉一个关系,我们使用drop table命令。drop table命令从数据库中删除关于被去掉关系的所有信息。drop table命令的格式为:
drop table r;
命令drop table r;是比delete from r;更强的语句。
后者保留关系r,但删除r中的所有元组。前者不仅删除r中的所有元组,还删除r的模式。一旦r被去掉,除非用create table命令重新创建r,否则没有元组可以插入r中。
如果要为已有关系增加属性,我们使用alter table命令。关系中的所有元组在新属性上的取值将被赋为null。alter table命令的格式为:
alter table r add A D;
其中r是现有关系的名称,A是待添加属性的名称,D是待添加属性的类型。
同理,如果要从关系去掉属性,我们可以使用如下命令:
alter table r drop A;
其中r是现有关系的名称,A是关系的一个属性的名称。(很多数据库系统并不支持去掉属性,尽管它们允许去掉整张表)
3.3 SQL查询的基本结构
SQL查询的基本结构由三个子句构成:select、from和where。查询以在from子句中列出的关系作为其输入,在这些关系上进行where和select子句中指定的运算,然后产生一个关系作为结果。
3.3.1 单关系查询
select A
from r;
在某些情况下如果想强行去除重复,可以在select后插入关键字distinct:
select distinct A
from r;
SQL同样允许使用关键字all来显式指名不去除重复:
select all A
from r;
select子句还可带含有+、-、*、/运算符的算数表达式,运算对象可以是常数或元组的属性(不导致r关系发生任何改变):
select A * 1.1
from r;
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组:
select A
from r
where condition1 and/or/not condition2…;
3.3.2 多关系查询
类似的,我们给出一个典型的SQL查询:
select A_1, A_2, …, A_n
from r_1, r_2, …, r_m
where P;
每个\(A_i\)代表一个属性,每个\(r_i\)代表一个关系。P是一个谓词。如果省略where子句,则谓词P为真。
标签:关系,元组,概念,SQL,table,数据库系统,select,属性 From: https://www.cnblogs.com/kirin-dev/p/Database-System-Concepts_Chapter-3.html