1. 程式人生 > >Oracle (04)日期型別.約束

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<to_date(‘1990-12-1’,‘yyyy-mm-dd’) order by 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);