Oracle (04)日期类型.约束

日期类型 *

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;

日期操作练习题: ***

  1. 求出当前月份的 最后一分钟0秒 表示的date数据

    对当前月份+1 截取到月 , 减去一分钟

    select to_char(trunc(add_months(sysdate,1),‘mm’)-(1/1440),‘yyyy-mm-dd hh24:mi:ss’) from dual;

  2. 求出下一个月的 第三天的倒数十分钟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;

  3. 查询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;

  4. 查询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): 字段的值必须符合检查条件

外键约束: 后期再说

约束的两种使用方式 *****

  1. 列级约束: 在定义表格的某一列时, 在列的后面追加约束限制, 称其为列级约束
  2. 表级约束 在定义完毕表格的所有列之后, 再选择某些列添加约束 , 叫做 表级约束!

列级约束 *****

主键约束|非空约束|唯一约束:格式:

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);

你可能感兴趣的:(数据库)