欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关系数据库标准语言SQL数据类型及数据操作介绍

程序员文章站 2022-06-21 21:03:10
一般分为关系型数据和nosql数据库, 关系型数据库一般使sql操作,sql对大小写不敏感。 sql的数据类型 sql支持许多内置的数据类型,并且允许用户定义新的域(数据)类型。 char(n):定...

一般分为关系型数据和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仅当不存在依赖于该约束的数据库对象才可以删除该约束。
删除基本表
当不需要某个基本表时,可以将其删除。语句格式为:
drop table <表名> {cascade | restrict}
其中cascade表示级联删除,依赖于表的数据对象(最常见的是视图)也将一同删除。restrict表示受限删除,如果基于该表定义有视图或者有其他表引用该表(如check,foreign key等约束),或者该表有触发器。存储过程或函数等,则不能删除。
删除基本表将导致存放在表中的数据和表定义都将被彻底删除。

例:
drop table student restrict;
添加
insert语句有两种使用形式,一种是向基本表中插入单个元组;另一种是将查询的结果(多个元组)插入基本表。

1)插入单个元组
语句格式为:
insert into t[(a1, .... ,ak)] values (c1,....,ck);
其中t通常是基本表,也可以是视图,ai是t的属性,ci是常量。
(a1, .... ,ak)缺省时,values子句必须按基本表属性的定义次序提供新元素每个属性上的值。否则,(a1, .... ,ak)中属性的次序可以是任意次序,并且可以仅列举基本表的部分属性。此时,value子句中的常量与属性个数是相等的,并且常量对应相对位置上的属性,新元组取缺省值(如果定义了缺省值的话)或空值为null。

eg.

insert 表名 (栏位名称) values (栏位值)

insert stu_info (stu_no, stu_name, gender, birthday)
values('20171217123', '张三', 1, '2017‐12‐14');

insert stu_info (stu_no, stu_name, birthday)
values ('20171217123', '张三', '2017‐12‐14');

2)插入查询结果

语句格式为
insert into t[(a1, .... ,ak)] <查询表达式>
其中查询表达式通常是一个select语句。该表达式对查询表达式求值,并将结果元组插入到基本表中。

设存放就餐卡登记信息关系cardinf具有如下模式:
cardinf(card-no, name, banlance)
其中属性分别是持卡人编号,name为持卡人姓名,balance为卡中余额。假设现为教师办理一个就餐卡,直接使用教师号作为持卡人编号,并预存100元。
insert into cardinf(card-no, name, banlance)
select tno, tname, 100.00
from teachers;

注意:常量100.00出现在select子句中。这使得查询结果的每个元组的第三列均取常量值100.00。
查询

模糊查询
like表达式允许我们表示模糊查询,一般格式是:
<匹配值> [not] like <模式> [escape'<换码字符>']

其中<匹配值>和<模式>都是字符串表达式,它们的值是可以比较的。通常,<匹配值>是属性,<模式>是给定的字符串常量。<模式>中允许使用通配符。有两种通配符:“_”(下划线)可以与任意单个字符匹配,而"%"可以与零个或多个任意字符匹配。escape'<换码字符>'通常是escape'\'。它定义‘\’为转义字符,将紧随其后的一个字符转义。如果<模式>中的_或%紧跟在\之后,则这个_或%就失去了通配符的意义,而取其字面意义。
当<匹配值>与<模式>匹配时,则like表达式的值为真,否则,值为假。

eg.

select sno, sname
from student
where sname like '李__';   /*有两个下划线,因为一个汉字占两个字符位置*/

select *
from courses
where cname like 'c\_%' escape '\';        /* 定义"\"为转义字符,“_" 被转义 */
null 查询
sql允许元组在某些属性上取空值(null)。空值代表未知的值,不能与其他值进行比较。null表达式允许我们判断给定的值是否为空值。null表达式常见的形式如下:

<值表达式> | <子查询> is [not] null
通常<值表达式>是属性。

eg.

select sno, cno
from sc
where grade is null;
删除
使用delete语句删除表中的某些记录,语句格式为:
delete from t [where <删除条件>]

其中t通常为基本表,但也可以是某些视图,<删除条件>与select语句中的查询条件类似。
delete语句的功能是从指定的表t中删除满足<删除条件>的所有元组。where子句缺省时,则删除表t中全部元组(剩下一个空表t)。

删除所有学生的记录:
delete from students;

删除学号为200624010的学生记录可以用:
delete from students where sno='200624010';

尽管delete语句只能从一个表删除元组,但是删除条件可以涉及到多个表
例如删除计算机系所有学生的选课记录(sc是学生选课关系表)
我们可以先得到计算机系所有学生的学号
delete from sc
where sno in
(
select sno
from students
where speciality='计算机');
修改
使用update语句可以修改表中某些元组指定属性上的值。格式为:
update t
set a1=e1,...,ak=ek
[where <修改条件>]

其中t通常为基本表,但也可以是某些视图;a1,...ak是t的属性,而e1,...ek是表达式;<修改条件>与select语句中的查询条件类似
该语句的功能是:修改表t满足<修改条件>的元组。更具体的说,对于表t中没个满足<修改条件>的元组t,求表达式ei的值,并将它赋予元组t的属性ai。where子句缺省时,则修改表t中全部元组。

update语句只能修改一个表的元组。但是,修改条件中可以包含涉及其他表的子查询。
例如:将微积分课程成绩低于60分的所有学生的微积分课程成绩提高5分。
先得到微积分课程的课程号,再修改微积分成绩
update sc
set grade=grade+5
where grade < 60 and cno in
(select cno
from courses
where cname='微积分'
);

sql函数

查看表的数据条数
格式:select count(参数) from 表名;
参数可以是栏位(列)的序列号,从零开始,也可以是栏位的名称。最好选择主键作为参数,查询速度快。

eg.
select count(0) from 表名;
select count(栏位名) from 表名;
求和函数

sum(栏位名)

查询最大值 查询最小值 查询并去除重复值 查询并使用逻辑运算 数据排序
order by 栏位名 asc; (升序(default),默认情况可以不写asc)
order by 栏位名 desc; (降序)