数据库
数据库一般分为关系型数据和NoSql数据库, 关系型数据库一般使SQL操作,SQL对大小写不敏感。
SQL的数据类型
SQL支持许多内置的数据类型,并且允许用户定义新的域(数据)类型。
char(n):定长字符串,长度n由用户指定。省略(n)时,长度为1。全称为character。
varchar(n):变长字符串,最大长度n由用户指定。全称是character varying。定长和变长的区别主要表现在前者需要固定长度的空间,二后者占用的空间在最大长度范围内是可以改变的。
bit(n):定长二进位串,长度n由用户指定。省略n时,长度为1。
bit varying(n):变长二进位串,最大长度n由用户指定。
int:整数,其值域依赖于具体的实现,全称是integer。
smallint:小整数,其值域依赖于具体的实现,但是小于int的值域。
numeric(p, d):p位有效数字的定点数,其中小数点右边占d位。
dec(p, d):p位有效数字的定点数,其中小数点右边占d位。全称是decimal。
float(n):精度至少为n位数字的浮点数,其值域依赖于实现。
real:实数,其值域依赖于实现。
double precision:双精度实数,精度依赖于实现,但精度比real高。
date:日期,包括年、月、日,格式为YYYY-MM-DD。
time:时间,包括时、分、秒,格式为HH:MM:SS。time(n)可以表示比秒更小的单位,秒后取n位
timestamp:时间戳,是data和time的结合体,包括年、月、日、时、分、秒。timestamp(n)可以表示比秒更小的单位,秒后取n位。
interval:时间间隔。SQL允许对date、time和interval类型的值进行运算。例如,如果x和y都是date类型,则x-y为interval类型,其值为x和y之间的天数。在date或time类型的值上加减一个interval类型的值得到新的date或time类型的值。
数据库操作:
- 查看当前数据库服务器有哪些数据库: show databases;
- 使用当前数据库服务器下的某一个数据库:use 数据库名称;
- 创建数据库:create database 数据库名称;
- 删除数据库:drop database 数据库名称
数据表操作
- 创建数据表:
create table <表名> (<列定义>...<列定义> [<表约束定义>...<表约束定义>]);
<表名>:标识符,是对定义的基本表命名
<列定义>:定义每个属性(列)的名称、类型、缺省值和列上的约束条件,格式是:
<列名> <类型> [default<缺省值>] <列约束定义>,...,<列约束定义>
列约束定义格式:
[constraint <约束名>] <列约束>
其中可选短语“constraint <约束名>”为列约束的命名。常用的列约束包括:
1)not null:不允许该列取空值,不加此限制时,该列可以取空值。
2)primary key:知名该列时主码(主键),其值非空、唯一。
3)unique:该列上的值必须唯一。这相当于说明该列为候选码。
4)check(<条件>):指明该列的值必须满足的条件,其中<条件>是一个涉及该列的布尔表达式。
表约束定义格式:
[constraint <约束名>] <表约束>
其中可选短语“constraint <约束名>”为表约束的命名。常用的表约束包括:
1)primary key(A1, A2,...Ak):说明属性列A1...Ak构成该表的主码(主键)。当主码只包含一个属性时,也可以用列定义约束定义主码。
2)unique(A1, A2,...Ak):说明这些属性列上的值必须唯一,这相当于说明A1,...,Ak构成该表的候选码。当候选码只包含一个属性时,也可以用列约束定义候选码。
3)check(A1,...,Ak):说明该表上的一个完整性约束条件。通常,<条件>是一个涉及到该表一个或多个列的布尔表达式。
外码比较复杂,它具有如下形式:
foreign key(A1,...,Ak) references <外表名> (<外表主码>)
[<参照触发动作>]
它说明属性时A1,...,Ak是表的外码,<外表名>给出被参照关系的表名,<外表主码>给出被参照关系的主码,而<参照触发动作>说明违反参照完整性时需要采取的措施。
eg:创建教师表Teachers
creat table Teachers
(
Tno char(7) not null primary key,
Tname char(10) not null,
Sex char(2) check(Sex='男' or Sex='女'),
Birthday date,
Title char(6),
Dno char(4),
foreign key (Dno) references Departments (Dno)
);
这里,我们定义Tno为Teachers的主码,Tname不能为空,而用check短语限定Sex的值只能是“男”或“女”。最后一行定义Dno为关系Teachers的外码,它参照Departments的主码Dno。
eg:创建选课表SC
create table SC
(
Sno char(9),
Cno char(5),
Grade smallint check(Grade>=0 and Grade<=100),
primary key(Sno, Cno),
foreign key(Sno) references Students (Sno),
foreign key(Cno) references Courses (Cno)
);
- 修改数据表
(1)向数据表中添加新列
alter table <表名> add [column] <列定义>
例:向Courses中增加一个新列Pno,表示课程的先行课程号
alter table Courses add Pno char(5);
(2)对于已经存在的列,只允许修改或删除列的缺省值,语句形式为
alter table <表名> alter [column] <列名> {
set default <缺省值> | drop default}
例:在Students的Sex列设置缺省值“女”可以减少大约一半学生性别的输入。可以使用如下语句:
alter table Students alter Sex set default '女';
而删除Sex上的缺省值可以用:
alter table Students alter Sex drop default;
(3)删除已经存在的列
alter table <表名> drop [column] <列名> {
cascade | restrict}
其中cascade表示级联,删除将成功,并且依赖于该列的数据库对象(如涉及到该列的视图)也一并删除。restrict表示受限,仅当没有依赖于该列的数据库对象时删除才成功。
例:删除Courses中的Pno列可以用:
alter table Courses drop Pno;
(4)添加表约束
alter table <表名> add <表约束定义>
其中表约束定义与创建基本表相同。
(5)删除表约束
alter table <表名> drop constraint <约束名> {
cascade | restrict}
其中被删除的约束名一定是命名的约束,给出约束名。cascade导致删除约束并且同时删除依赖于该约束的数据库对象。而restrict仅当不存在依赖于该约束的数据库对象才可以删除该约束。