日期类型 *
date : 日期类型
在创建表格时, 可以指定字段的类型为date , 无需指定长度
创建表格:
表名: book15
列:
- id number类型 长度5
- name varchar2类型 长度100
- info varchar2类型 长度1000
- pubdate date类型
create table book15(
id number(5),--图书编号
name varchar2(100),--图书名称
info varchar2(1000),--图书的详情
pubdate date--图书的出版时间
);
向表格中插入日期类型数据 *
sysdate: 当前系统(本机电脑)时间 ,是一个系统封装好date类型数据
练习:
向上述的图书表格中插入如下数据:
编号 10001
书名: 董飞传奇
详情: 描述了董飞传奇的一生, 剧情没啥可看的!
出版日期: 系统时间
insert into book15 values(10001,'董飞传奇','描述了董飞波折离奇的一生 , 描述了董飞从东莞到东京的发家史 , 描述了董飞, 是如何从1000万人民币赚到1000万日元的过程 ~',sysdate);
使用to_char对日期进行格式化 ***
to_char(参数1,参数2);
类似Java中的SimpleDateFormat类
- 参数1. 日期类型的数据
- 参数2. 日期格式化的模版
在模板中的字符:
- yyyy : 四位年
- MM : 月份(英文环境下 显示为月份单词前三个字母)
- dd : 日
- hh : 12小时制的时
- hh24 : 24小时制的时
- mi : 分钟
- ss : 秒
- day : 星期几
- month : 月(这个格式指定的月份, 在英文环境下显示为月份完整单词)
- am : 在12小时制中, 中文显示上午/下午 | 英文显示am/pm
练习:
1. 查询book15中的数据(pubdate) ,要求id为10001
select pubdate from book15 where id=10001;
2. 查询book15中的数据(pubdate) ,要求id为10001 , 将日期文本显示为 年-月-日 时:分:秒
select to_char(pubdate,'yyyy-MM-dd am hh:mi:ss day') from book15 where id=10001;
select to_char(pubdate,'yyyy-MM-dd hh24:mi:ss day') from book15 where id=10001;
插入日期 *
如何插入一个过去时间
在oracle数据库中, 需要插入过去时间或未来时间 , 需要通过字符串插入 , 存在默认的可插入的日期字符串格式!
默认日期格式:
英文环境: dd-mon-yy
例如北京奥运会: 08-aug-2008
中文环境: 日-月-年
例如北京奥运会: 08-8月-2008
练习:
向上述的book15中插入如下数据:
编号 10002
书名: 高帆传奇人生
详情: 描述了高帆一帆风顺的一生, 直到遇到了宿敌董飞~
出版日期: 2017年 10月 17日
insert into book15 values(10002,'高帆传奇人生','描述了高帆一帆风顺的一生, 直到遇到了宿敌董飞~','17-10月-2017');
- 查询book15中的数据(pubdate) ,要求id为10002 , 将日期文本显示为 年-月-日 时:分:秒
select to_char(pubdate,'yyyy-MM-dd hh24:mi:ss') from book15 where id=10002;
插入一个更精确的日期时间 **
使用to_date函数 来插入日期
to_date(参数1,参数2) :
与to_char功能刚好相反
to_char是将一个日期类型的数据, 转换为具备指定格式的日期字符串
to_date是将一个具备指定格式的日期字符串, 转换为日期类型的数据
参数1. 具备参数2格式的字符串类型的 时间
参数2. 日期 时间格式模板
例如: 将2017年11月24日 10点59分转换为date类型
to_date('2017-11-24 10:59:00','yyyy-MM-dd hh24:mi:ss');
向上述的book15中插入如下数据:
编号 10003
书名: 旭东在肚皮的日子
详情: 描述了旭东, 自从学习了肚皮舞后, 一步一步走向人生巅峰, 赢取董飞的一生 ~
出版日期: 2017-10-17 11:11:11
insert into book15 values(10003,'旭东在肚皮的日子','描述了旭东, 自从学习了肚皮舞后, 一步一步走向人生巅峰, 赢取董飞的一生 ~',to_date('2017-10-17 11:11:11','yyyy-MM-dd hh24:mi:ss'));
插入完毕后, 通过select语句查询 并格式化(年-月-日 时:分:秒)显示
select to_char(pubdate,'yyyy-MM-dd hh24:mi:ss') from book15;
日期的设置 与 日期的取出 ***
我们一般 通过to_date将日期插入数据库
通过to_char将日期数据取出
日期(date)的调整 *
date类型的数据 可以进行算数运算 ! 运算后的结果依然是date类型的数据!
例如:
sysdate+1 : 当前时间加一天
sysdate-1 : 当前时间减一天
sysdate+(1/24): 一个小时后
可以将上述的一些案例中的运算 ,直接当作数据插入到表格中
案例:
求出当前时间10分钟后的date数据:
select to_char(sysdate+(10/60/24),'yyyy-MM-dd hh24:mi:ss') from dual;
练习:
求出当前时间减少1.5小时的date数据 并格式化显示!
select to_char(sysdate-(1.5/24),'yyyy-MM-dd hh24:mi:ss') from dual;
添加月份 *
add_months(参数1,参数2)
参数1. date类型的数据
参数2. number类型, 1表示添加1个月 , 2表示添加2个月 , -1表示减少一个月!
返回date类型的数据
练习: 求出当前日期+1个月+1天+1个小时+1分钟的时间
select to_char(add_months(sysdate,1)+1+(1/24)+(1/1440),'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(add_months(sysdate+1+(1/24)+(1/1440),1),'yyyy-mm-dd hh24:mi:ss') from dual;
截取日期
2000年 10月 1日 0时 0分 0秒
trunc(参数1,参数2): 截取日期
参数1. 截取的date数据
参数2. 要截取的日期单位 (模版中的单位) 可忽略不写, 默认dd
返回的是date类型的数据
截取时间到天 dd
select to_char(trunc(sysdate),‘yyyy-mm-dd hh24:mi:ss’) from dual;
截取到月 mm
select to_char(trunc(sysdate,‘mm’),‘yyyy-mm-dd hh24:mi:ss’) from dual;
截取到 小时hh
select to_char(trunc(sysdate,‘hh’),‘yyyy-mm-dd hh24:mi:ss’) from dual;
日期操作练习题: ***
求出当前月份的 最后一分钟0秒 表示的date数据
对当前月份+1 截取到月 , 减去一分钟
select to_char(trunc(add_months(sysdate,1),‘mm’)-(1/1440),‘yyyy-mm-dd hh24:mi:ss’) from dual;
求出下一个月的 第三天的倒数十分钟0秒 表示的date数据
对当前月份+1 截取到月 加上3天 减去10分钟
select to_char(trunc(add_months(sysdate,1),‘mm’)+3-(1/144),‘yyyy-mm-dd hh24:mi:ss’) from dual;
查询s_emp表格(id,last_name,start_date),按照start_date排序
select id,last_name,to_char(start_date,‘yyyy-mm-dd hh24:mi:ss’) from s_emp order by start_date;
查询s_emp表格(id,last_name,start_date),按照start_date排序 , 查询的条件为: 入职日期在1990年1月 到1990年12月
select id,last_name,to_char(start_date,‘yyyy-mm-dd hh24:mi:ss’) from s_emp where start_date>to_date(‘1990-1-1’,‘yyyy-mm-dd’) and start_date
约束 *****
数据库中数据的约束 ! 在数据插入时的一些限制 !
满足约束条件的 可以正常插入, 不满足的直接报错 !
约束的分类 和 作用 *****
主键约束(primary key)(pk): 一般是一行数据的唯一标识, 对于一个字段加了主键约束后,则这个字段不能为null,并且字段的值不可重复!
一个表格中只允许一个字段存在主键约束 ! 一般我们设置在id字段上!
可以简单理解为: 非空约束+唯一性约束
非空约束(not null)(nn): 字段的值 不能为null
唯一性约束(unique)(uk): 字段的值不能重复, 可以为null
检查约束(check)(ck): 字段的值必须符合检查条件
外键约束: 后期再说
约束的两种使用方式 *****
列级约束 *****
主键约束|非空约束|唯一约束:格式:
create table 表名(列名 数据类型(长度) 约束关键字);
创建一个表格 person15
字段:
id number类型 长度为5 约束为主键primary key
name varchar2类型 长度为10
age number类型 长度为3
先执行drop table person15;操作
drop table person15;
create table person15(
id number(5) primary key,
name varchar2(10),
age number(3)
);
尝试向表格中插入重复的id数据
insert into person15 values(10001,‘董飞’,18);
insert into person15 values(10001,‘董飞’,18);
commit;
约束的别名
唯一约束中抛出错误时 : SYSTEM.SYS_C007123 的含义
每定义一个约束 , oracle 都会为期生成一个不会重复的约束别名 , 但是不具备任何特殊的含义 (见名知意)!
我们其实可以在定义约束时 , 为一个约束的列 添加约束的别名 , 这个别名在后期出错调试时, 可以起到见名知意的效果 !
别名: 唯一 不可重复, 见名知意!
见名知意的规则: 表名_字段名_约束的简写
如何指定约束的别名:
格式: create table 表名(列名 数据类型(长度) constraint 约束别名 约束关键字);
练习: 重新编写上面的练习, 给id主键加别名
创建一个表格 person15
字段:
id number类型 长度为5 约束为主键primary key
name varchar2类型 长度为10
age number类型 长度为3
先执行drop table person15;操作
drop table person15;
create table person15(
id number(5) constraint person15_id_pk primary key,
name varchar2(10),
age number(3)
);
尝试向表格中插入重复的id数据
insert into person15 values(10001,‘董飞’,18);
insert into person15 values(10001,‘董飞’,18);
commit;
练习:
创建表格 person15 , 添加约束和别名
id number 长度5 主键 primary key
name varchar2类型 长度10 唯一 unique
age number 长度3 非空 not null
drop table person15;
create table person15(
id number(5) constraint person15_id_pk primary key,
name varchar2(10) constraint person15_name_uk unique,
age number(3) constraint person15_age_nn not null
);
尝试插入数据:
insert into person15 values(10001,‘董飞’,18);
insert into person15 values(10002,‘董飞2’,null);
检查约束
格式:
create table 表名(
列名 数据类型(长度) constraint 别名 check(检查条件)
);
案例:
create table tableName(
id number(5) constraint tablename_id_ck check(id>=10001)
);--表示id必须大于等于10001才可以插入数据
练习:
创建表格 person15 , 添加约束和别名
id number 长度5 主键 primary key
name varchar2类型 长度10 唯一 unique
age number 长度3 非空 not null
salary number类型 长度不定义 要求必须大于30000才可以插入
drop table person15;
create table person15(
id number(5) constraint person15_id_pk primary key,
name varchar2(10) constraint person15_name_uk unique,
age number(3) constraint person15_age_nn not null,
salary number constraint person15_salary_ck check(salary>30000)
);
尝试插入数据:
insert into person15 values(10001,'董飞',18,29999);
insert into person15 values(10002,'董飞2',null,30001);
列级约束 中单个列添加 多个约束 (了解)
语法:
create table 表名(
字段名 数据类型(长度) constraint 约束别名1 约束关键字1 constraint 约束别名2 约束关键字2 constraint 约束别名3 约束关键字3
);
案例:
create table person15(
salary number constraint person15_salary_ck check(salary>30000) constraint person15_salary_nn not null
--检查约束薪资大于30000 , 且 存在非空约束
);
不过不建议 单个字段 添加多个约束, 有可能会导致约束冲突
表级约束 ***
只有not null没有表级约束
表级约束与列级约束的区别:
1. 写法不同
2. 表级约束可以做联合约束 (一个约束依赖于两个字段)
格式:
普通表级约束: create table 表名(字段列表,constraint 别名 约束关键字(约束字段));
一次添加多个约束:
create table 表名(字段列表,
constraint 别名1 约束关键字1(约束字段),
constraint 别名2 约束关键字2(约束字段),
…
constraint 别名n 约束关键字n(约束字段)
);
练习:
创建user15表格 , 并通过表级约束 添加约束条件 !
字段:
id number类型 主键约束
name varchar2 长度100 唯一约束
info varchar2 长度1000
drop table user15;
create table user15(
id number,
name varchar2(100),
info varchar2(1000),
constraint user15_id_pk primary key(id),
constraint user15_name_uk unique(name)
);
联合约束 *
联合主键 :
主键: 非空+唯一
联合主键: 多个字段的数据 非空+唯一
联合约束:create table 表名(字段列表,constraint 别名 约束关键字(字段1,字段2…字段n));
创建一个表格 person15
字段:
id number类型
name varchar2类型 长度100
age number类型
id+name做联合约束 (联合主键)
drop table person15;
create table person15(
id number,
name varchar2(100),
age number,
constraint person15_id_name_pk primary key(id,name)
);
尝试插入数据:
insert into person15 values(1,'董飞',18);
insert into person15 values(1,'李帅',18);
insert into person15 values(1,'呼市扛把子刘强',18);
insert into person15 values(2,'董飞',18);
insert into person15 values(2,'李帅',18);
insert into person15 values(1,'呼市扛把子刘强',18);