数据库是“按照数据结构来组织、存储和管理数据的仓库”。那么数据库如何存储数据?
表是数据库最基本的逻辑结构,一切数据都存放在表中,其他的数据库对象(索引、视图、同义词等)都是为了方便地操作表中的数据。这个表就是我们在生活中常见的二维表,由行和列组成。Oracle数据库是由若干个表组成。
编号 | 姓名 | 召唤师分类 | 颜值 | 身高 | 体重 | 出生日期 | 备注 |
---|---|---|---|---|---|---|---|
01 | 程咬金 | 坦克 | 赛潘安 | 180 | 90.5 | 2000-01-01 01:12:35 | 很肉,大招可回血,峡谷中的搅屎棍 |
02 | 妲己 | 法师 | 祸国殃民 | 170 | 50.5 | 1998-03-03 10:50:33 | 爆发高,草丛三婊之一,在草丛令人闻风丧胆 |
03 | 亚瑟 | 战士 | 帅气 | 185 | 70.6 | 1990-03-03 10:54:33 | 图标上的那个男人,谁也无法撼动他的地位 |
(1)表的结构是由列组成,习惯上把列也称之为字段,字段的基本属性如下:
1)字段名:字段的名称。
2)数据类型:该字段存放数据的类型和长度。
3)是否允许空值:该字段是否为必填,如果不是必填,表示可以为空。
(2)列的数据类型,表的每一个列都有它的数据类型,常用的数据类型,就是上篇文章所写的:
1)字符串类型:char 和 varchar2
2)数字类型:number( L, P) ,L 表示数字的长度,P表示精度也就是小数点后面的位数;P为 0 时,表示整数。
3)时间、日期类型:data
4)clob 类型:存放单字节字符串或多字节字符数据,如文本文件、XML文件
5)blob 类型:存放非结构化的二进制数据,如图片、音频、视频、office文档等
6)rowid 类型:存放表中记录在数据库中的物理地址
表中的数据是由行组成的,每一行就是一条数据,也称之为记录,数据越多,记录就越多。
Oracle数据库用 create table + 表名命令来创建表,建表语法如下
create table 表名
(
字段名1 数据类型 null or not null,
字段名2 数据类型 null or not null,
字段名3 数据类型 null or not null,
.......
字段名n 数据类型 null or not null,
);
表名是标识符,从语法来说表名只要符合Oracle的规定就行了,但一般来说使用的表名尽量让使得可读性比较好,尽量有意义。
create table t_girl
(
id char(4) not null, -- 编号
name varchar2(30) not null, -- 姓名
yz varchar2(30) null, -- 颜值
sc varchar2(20) null, -- 身材
weight number(4,1) not null, -- 体重
height number(3) not null, -- 身高
birthdat date not null , -- 生日
memo varchar2(300) null , -- 备注
primary key(id)
);
1)在Oracle数据库的SQL命令中,关键字、表名和字段名都不区分大小写,CREATE和create没有区别,表名T_GIRL和t_girl也没有区别,字段名ID和id也没有区别;
2)两根短线“–”是说明文字,就像C/C++语言中的“//”。
主键一般指主关键字。主关键字(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。
在生活中很多数据具有唯一的特性,例如身份证号码,在国家人口基本信息表中,一定不会存在多个人用同一个身份证号码的情况,再例如手机号码、QQ号码、银行帐号等等,还有学生管理系统,学生的年级、班级和学号三个字段组合起来是唯一的标识。
如果表中一个字段或多个字段组合起来的值是唯一的,就可以作为表的主键,在创建或修改表时用primay key关键字来指定主键。一个表只能有一个主键,而且组成主键的每个字段值都不能为空。
主键的作用:
1)体现数据结构设计的合理性。
2)提升数据操作的速度。
3)保证数据的完整性,在表中添加或修改记录时,数据库会检查该记录主键的值,不允许与其它记录主键的值重复,这种做法有个专业的名词:主键约束。
例如超女基本信息表,编号的字段名是id,在超女选秀活动中,每个超女的编号肯定是唯一的,不可能存在两个编号相同的超女,否则会引起混乱,我们可以把id字段设置为T_GIRL表的主键,后面的工作交给数据库,如果试图往表中插入多条id相同的记录,数据库将拒绝。
例如:
表格中已经有 ID为 010101 的记录
我再插入一条ID为 010101 的记录,会报错
指定表的主建有两种方法。
create table Tt_girl
(
id char(4) not null, -- 编号
name varchar2(30) not null, -- 姓名
yz varchar2(20) null, -- 颜值
sc varchar2(20) null, -- 身材
weight number(4,1) not null, -- 体重
height number(3) not null, -- 身高
birthday date not null, -- 出生时间
memo varchar2(1000) null, -- 备注
primary key(id) -- 指定id为表的主键
);
alter table 表名 add constraint 主键名 primary key(字段名1,字段名2,......字段名n);
例如:
alter table T_GIRL add constraint PK_GIRL primary key(id);
在Oracle数据库中,虽然主键不是必需的,但是最好为每个表都设置一个主键,不管是单字段主键还是多字段主键(复合主键),它的存在代表了表结构的完整性,主键还可以用于其他表的外键关联。
用 insert into 命令向表中插入记录
insert into 表名(字段名1,字段名2,..... 字段名n) values(字段名1的值,字段名2的值,..... 字段名n的值);
注意:表名后面的字段名列表与values 后面字段值列表必须一一对应。一个萝卜对应一个坑,别填错了。
例如:
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0101','西施','漂亮',to_date('2000-01-01 01:12:35','yyyy-mm-dd hh24:mi:ss'),
'火辣',48.5,170,'这是一个非常漂亮姑娘,老公是夫差,男朋友是范蠡。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0102','貂禅','漂亮',to_date('1997-08-02 12:20:38','yyyy-mm-dd hh24:mi:ss'),
'苗条',45.2,168,'王允真不是男人,干不过董卓就把美人往火坑里推,千古罪人啊。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0103','妲已','漂亮',to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss'),
'火辣',53.6,172,'如果商真的因我而亡,您们男人做什么去了?');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0104','芙蓉姐姐','猪扒',to_date('1980-05-05 10:11:55','yyyy-mm-dd hh24:mi:ss'),
'膘肥体壮',85.8,166,'如果不努力学习技术,将来就会娶个芙蓉姐姐,哼哼。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0105','神密猫女',null,to_date('1989-12-08 12:10:35','yyyy-mm-dd hh24:mi:ss'),
null,48.5,171,'不知道是什么人,她脸上有一个%符号,很神密。');
在insert 语句中,字段的值如果是字符串,要yoga单引号包含起来,日期字段要用 to_date 函数转换,数组直接书写。
插入数据的SQL语句还有一种写法,如下:
insert into 表名 values(字段1的值,字段2的值,....字段n的值);
这种写法省略了字段名列表,但是这种写法一定不能出现程序中,因为只要表结构发生了改变,或字段的位置改变,SQL语句就会出错。
select 字段名1,字段名2,…字段名n from 表名 where 条件1 and 条件2 …条件n;
从指定的表中查询满足条件的记录的指定字段名。这个查询只展示那些满足条件的记录的字段
select * from 表名 where 条件1 and 条件2 …条件n;
从表中查询所有满足条件的记录
关键字不区分大小,但是字段中的值区分大小写。
查询条件为 job=‘SALESMAN’,job为字段名关键字可以不区分大小写
常见排序:
select * from 表名 order by 排序遵循字段名1 排序规则1,排序遵循字段名2 排序规则2;
缺省是升序,降序是 desc;
(1)单一排序遵循字段名
例如:
select * from emp order by deptno;
按照 deptno 升序排序
(2)多排序遵循字段名
这是先按第一个字段名排序,然后第一个字段名相同的记录按第二个字段名排序
to_char() j将日期类型数据转换为字符串型数据,并且可以灵活选择多种形式。
1) select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual; – 转换为字符串的格式,并且可以灵活使用 to_char()这个函数,指定时间格式
2)select to_char(sysdate,‘yyyy-mm-dd hh24’) from dual;
3)select to_char(sysdate,‘yyyy-mm-dd hh24:mi’) from dual;
用 update 命令修改表中的记录,语法如下:
update 表名 set 字段名1=值1,字段名2=值2,…字段名n=值n where 条件1 and 条件2 … 条件n;
在set关键字之后把需要修改的字段名和新的值一一列出来。
(1)修改一条记录的某个字段值
(2)where关键字后面是条件表达式,如果没有条件表达式,就会更新表中全部的记录。
delete命令用于删除表中的记录,语法如下:
(1)删除符合条件的一条记录delete from 表名 where 条件1 and 条件2 … 条件n;
where关键字后面是条件表达式,如果没有条件表达式,就删除表中全部的记录。
(2)一次删除多条记录
delete from 表名 where 字段1 in(记录1对应的字段1的值,记录2对应的字段1的值,…记录n对应的字段1的值);
执行了 delete t_girl where id in(‘1’,‘2’);
语法:
alter table 表名 add 字段名 数据类型 其他选项;
(1)原始的表的字段
(2)执行 alter table t_girl add address varchar2(50);
语法:
alter table 表名 modify 字段名 数据类型 其它选项;
修改字段属性的时候要注意一个问题,如果表中已存在数据,修改可能会失败,包括但不限于以下的情况:
1)把字段由null改为not null时,表中记录存在null的情况。
2)把字段的取值范围由较大(例如number(10))改较小(例如number(5)),表中记录存在大于较小取值范围的情况,例如已经存在123456的值,如果把数据类型改为number(5),无法存放123456。
3)把字段的数据类型时,表中存在记录并且新旧数据类型不兼容的情况。例如原来的数据类型是varchar2(10),表中存在记录的值是’freecplus’,如果要修改为number(10),Oracle无法把’freecplus’转换为number(10)。
语法:
alter table 表名 rename column 列名 to 新列名;
语法:
alter table 表名 dorp column 字段名;
语法:
alter table 表名 rename to 新表名;
语法:
drop table 表名;