create table student
(
sid number(4) primary key,
sname varchar2(200), --與mysql有點不同
salary number(5,2)--有效位數5,小數2位
sdate date
)
insert into student values(1,'小明',110.12,to_date('1997-08-30','yyyy-MM-dd')); --to_date 定義時間
--以前的數據不用管,今天新增的數據需要加上檢查約束? sname>2 關鍵字:enable novalidate
alter table student add constraint ck_student_sname check(length(sname)>2) enable novalidate ;
create table stu
(
mid number(4) primary key,
myclob clob,
myblob blob
)
create table grade
(
gid number(4) primary key,
gname varchar2(200)
)
truncate table grade;
truncate:刪除整個數據表的記錄,但不會刪除表結構。
truncate、drop、delete的區別:
1.truncate和delete只刪除數據不刪除表的結構。drop語句將刪除表的結構被依賴的約束(constrain),觸發器(tigger),索引(index);
依賴於該表的存儲過程/函數將保留,但是變爲invalid狀態。
2.delete語句是DML,這個操作會放到rollback、segement(段)中,事務提交之後才生效;如果有相應的觸發器,該執行的時候會被觸發。
truncate、drop是DDL,操作會立即生效,原數據不放到rollback、segement(段)中,不能回滾,操作不觸發tigger。
3.速度:drop>truncate>delete
4.安全性:小心使用drop和truncate,尤其是沒有備份數據表的時候,使用上,想刪除部分數據行用delete,帶上where指定語句,回滾要足夠大。刪除表,用drop。想保留表而將所有數據刪除. 如果和事務無關,用truncate即可。
如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據
--主鍵約束
alter table stu add constraint pk_stu_sid primary key(sid);
--檢查約束
alter table stu add constraint ck_stu_sname check(length(sname>2));
--1-120之間
alter table stu add constraint ck_stu_sage check(sage betwwen 1 and 120);
--唯一約束
alter table stu add constraint up_stu_scard unique(scard);
--外鍵約束
alter table stu add constraint fk_stu_gid foreign key(gid) references grade(gid);
--刪除約束
alter table stu drop constraint pk_stu_sid;
--刪除info數據表 經過回收站(慎用,可以用來寫demo)
drop table info;
--把回收站的數據表進行恢復
flashback table info to before drop;
--分頁(需要僞列)
/*
子查詢
1.select 後面
2.from 後面
3.where 後面
參數1:(當前頁-1)*每頁顯示條數
參數2:(當前頁-1)*每頁顯示條數加上每頁顯示條數
*/
select * from (
select a.*,rownum rn from student a where rownum<=6
) t where t.rn>3;
--只要表結構,不需要數據,不需要約束。
create table student _temp as select * from student where 1=2; --注意:student_temp是不需要提前創建的
--事務
/*
作用:有些業務是需要回滾的:比如銀行轉賬過程中出現一些故障
保證數據一致性:前後要一致
*/
insert into 表名 values(1,'李逍遙');
savepoint sp_1;--設置一個回滾點
insert into 表名 values(2,'趙靈兒');
rollback to sp_1; --返回到回滾點
commit; --提交
--dual:僞表(虛擬表)
select 1+2 from dual;
/*
+ - * / 會自動把字符串中的數字轉換出來運算
*/
select '23'+'12.25' from dual; --35.25
select '12a'+'12.25' from dual; --無效字符a
--求餘數 mod() 求模函數
select mod(23,2) as 餘數 from dual;
--模糊查詢
_代表一個字符
select * from student t where t.sname like '小_';
[]oracle識別問題
select * from student t where t.sname like '小[名]';
select * from student t where t.sname like '小%';
--連接符 || 查詢的過程中作用不大,plsql輸出作用比較大
select '姓名:' || t.sname from student t ;
--系統時間
select sysdate 系統時間 from dual;
--月份差值 months_between
select months_between(sysdate,t.sdate) as 月份差值 from student t;
select months_between (sysdate,to_date('1997-08-30','yyyy-MM-dd'))/12 年 from dual;
--add_months 添加的是月份 比如在車貸、房貸、貸款之類
select add_months(sysdate,30) from dual;
--trunc 對日期不進行四捨五入
select trunc (sysdate) as 日期 from dual;
--round 對時間四捨五入 過了 早上12.00 就會進1
select round(to_date('2018-07-31 00:00:00','yyyy-MM-dd hh24:mi:ss')) as 日期 from dual;
--extract:提取時間 年, 月,日 可以作運算
select extract (year from sysdate) as 年 from dual;
--字符串函數 lower:轉換小寫 upper:轉換大寫
select upper(lower('ABC')) as 轉換 from dual;
--兩種替換方式
--translate:替換隻能匹配(前面多少,後面就是替換多少)
--replace:後面替換有多少就替換多少
select translate ('jack','j','b') from dual;
select replace('back','b','co') from dual;
--查找指定字符的位置(第1次)
select instr ('admin','m') from dual;
--如果能找到就返回實際位置(從1開始),如果找不到,返回0
select instr('admin','f') from dual;
--concat() 一次只能放兩個字符串
select concat(concat('a','b'),'v') from dual;
--四捨五入
select round(23.1267852) from dual;
--不會四捨五入
select trunc(23.1267852) from dual;
--轉換字符 轉義"年"
select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss dy') from dual;
select to_number('23') as 轉換 from dual;
select to_number('23a')as 轉換 from dual; --無效字符a
--語法: having 是分完組後,進行過濾條件
select 字段 from 表名 where 條件 group by 字段 having 條件
select gid,count(*)as 人數 from stu group by gid;
select gid,count(*)as 人數 from stu group by gid having count(*)>2;