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

一般分为关系型数据和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; (降序)

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐