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;
日期操作練習題: ***
-
求出當前月份的 最後一分鐘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<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): 欄位的值必須符合檢查條件
外來鍵約束: 後期再說
約束的兩種使用方式 *****
- 列級約束: 在定義表格的某一列時, 在列的後面追加約束限制, 稱其為列級約束
- 表級約束 在定義完畢表格的所有列之後, 再選擇某些列新增約束 , 叫做 表級約束!
列級約束 *****
主鍵約束|非空約束|唯一約束:格式:
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);