1. 程式人生 > >oracle分頁和建立表和約束

oracle分頁和建立表和約束

oracle分頁

回顧mysql分頁,用limit關鍵字

查詢users表中前二條記錄
select * from users limit 0,2
或
select * from users limit 2;
0表示第一條記錄的索引號,索引號從0開始
2表示最多選取二個記錄

查詢出users第2條到第4條記錄
select * from users limit 1,3; 
回顧hibernate分頁API
Query.setFirstResult(0);
Query.setMaxResult(3);  

什麼是rownum,有何特點?

1)rownum是oracle專用的關健字
2)rownum與表在一起,表亡它亡,表在它在
3)rownum在預設情況下,從表中是查不出來的
4)只有在select子句中,明確寫出rownum才能顯示出來
5)rownum是number型別,且唯一連續
6)rownum最小值是1,最大值與你的記錄條數相同
7)rownum也能參與關係運算
   * rownum = 1    有值
   * rownum < 5    有值    
   * rownum <=5    有值         
   * rownum > 2    無值        
   * rownum >=2    無值
   * rownum <>2    有值    與  rownum < 2 相同
   * rownum = 2    無值
8)基於rownum的特性,我們通常rownum只用於<或<=關係運算   

顯示emp表中3-8條記錄(方式一:使用集合減運算)
select rownum "偽列",emp.* from emp where rownum<=8
minus
select rownum,emp.* from emp where rownum<=2;

顯示emp表中3-8條記錄(方式二:使用子查詢,在from子句中使用,重點)
select xx.*
from (select rownum ids,emp.* from emp where rownum<=8) xx
where ids>=2;
注意:在子查詢中的別名,不可加""引號

顯示emp表中5-9條記錄
select yy.*
from (select rownum ids,emp.* from emp where rownum<=9) yy
where ids>=5;
注意:在專案中,from後臺可能有真實表名,也可能用子查詢看作的表名,
     同時真實表和子查詢看作的表要做連線查詢

建立表和約束


回顧MySQL建立表語句users(id整型/name字串/birthday日期型,預設今天)
drop table if exists users;
create table if not exists users(
   id int(5) auto_increment primary key,
   name varchar(4) not null,
   birthday date default '2015-4-27'
);

使用oracleSQL,建立使用者表users(id整型/name字串/birthday日期/sal整型,預設今天)
create table users(
  id number(5) primary key,
  name varchar2(8) not null unique,
  sal number(6,2) not null,
  birthday date default sysdate
);

進入回收站
drop table users;

查詢回收站中的物件
show recyclebin;

閃回,即將回收站還原
flashback table 表名 to before drop;
flashback table 表名 to before drop rename to  新表名;

徹底刪除users表
drop table users purge;

清空回收站
purge recyclebin;
    
測試如下型別
(1)number(5):
insert into users(id,name,sal) values(1,'A',6666.66);     
insert into users(id,name,sal) values(11,'AA',6666.66);     
insert into users(id,name,sal) values(111,'AAA',6666.66);     
insert into users(id,name,sal) values(1111,'AAAA',6666.66);     
insert into users(id,name,sal) values(99999,'AAAAA',6666.66);     
insert into users(id,name,sal) values(100000,'AAAAAA',6666.66); 錯
5表示最多存99999    

(2)number(6,2):
col sal for 9999.99    
insert into users(id,name,sal) values(1,'A',6.66);     
insert into users(id,name,sal) values(11,'AA',66.666);     
insert into users(id,name,sal) values(111,'AAA',666.6666);     
insert into users(id,name,sal) values(1111,'AAAA',6666.66666);     
insert into users(id,name,sal) values(11111,'AAAAA',66666.666666);錯 
number(6,2)
其中2表示最多顯示2位小數,採用四捨五入,不足位數補0,同時要設定col ... for ...
其中6表示小數+整數不多於6位
其中整數位數不得多於4位,可以等於4位

(3)varchar2(8):
insert into users(id,name,sal) values(1,'A',7777.77);     
insert into users(id,name,sal) values(2,'AA',7777.77);     
insert into users(id,name,sal) values(3,'AAA',7777.77);     
insert into users(id,name,sal) values(4,'AAAA',7777.77);  
insert into users(id,name,sal) values(5,'AAAAA',7777.77);  
insert into users(id,name,sal) values(6,'AAAAAA',7777.77);  
insert into users(id,name,sal) values(7,'AAAAAAA',7777.77);  
insert into users(id,name,sal) values(8,'AAAAAAAA',7777.77);  
insert into users(id,name,sal) values(9,'AAAAAAAAA',7777.77);錯
insert into users(id,name,sal) values(1,'哈',7777.77);     
insert into users(id,name,sal) values(2,'哈哈',7777.77);     
insert into users(id,name,sal) values(3,'哈哈哈',7777.77);     
insert into users(id,name,sal) values(4,'哈哈哈哈',7777.77);  
insert into users(id,name,sal) values(5,'哈哈哈哈哈',7777.77);錯  
8表示位元組  GBK 趙 2位元組

(4)date:預設格式為:'27-4月-15'
(5)CLOB【Character Large OBject】:大文字物件,即超過65565位元組的資料物件,最多儲存4G
(6)BLOB【Binary Large OBject】:大二進位制物件,即圖片,音訊,視訊,最多儲存4G

為emp表增加image列,alter table 表名 add 列名 型別(寬度)
alter table emp
add image blob;

修改ename列的長度為20個位元組,alter table 表名 modify 列名 型別(寬度)
alter table emp
modify ename varchar2(20);

刪除image列,alter table 表名 drop column 列名
alter table emp
drop column image;

重名列名ename為username,alter table 表名 rename column 原列名 to 新列名
alter table emp
rename column ename to username;

將emp表重新命名emps,rename 原表名 to 新表名
rename emp to emps;

注意:修改表時,不會影響表中原有的資料

筆試題:有【1000億】條會員記錄,如何用最高效的方式將薪水欄位清零,其它欄位內容不變?

第一:從emp表中刪除sal欄位
      alter table emp
      drop column sal;      

第二:向emp表中新增sal欄位,且內容預設0
      alter table emp
      add sal number(6) default 0;

修改表不可回滾    

建立表customers(單)和orders(多),使用primary key/not null/unique/default/foreign key約束
要體現【on delete cascade/on delete set null】
需求:刪除客戶,級聯刪除他所有的訂單
      delete from customers where id = 1;
需求:刪除客戶,不級聯刪除他所有的訂單,只是將外健設定為NULL

      delete from customers where id = 1;   

#建立使用者表
create table customers(
  id number(3) primary key,
  name varchar2(4) not null unique
);

#插入使用者資料
insert into customers(id,name) values(1,'A');
insert into customers(id,name) values(2,'B');

#建立訂單表
create table orders(
  id number(3) primary key,
  isbn varchar2(6) not null unique,
  price number(3) not null,
  cid number(3),
  --constraint cid_FK foreign key(cid) references customers(id) on delete cascade 
  constraint cid_FK foreign key(cid) references customers(id) on delete set null  
);

#插入訂單資料
insert into orders(id,isbn,price,cid) values(1,'isbn10',10,1);
insert into orders(id,isbn,price,cid) values(2,'isbn20',20,1);
insert into orders(id,isbn,price,cid) values(3,'isbn30',30,2);
insert into orders(id,isbn,price,cid) values(4,'isbn40',40,2);

建立表students,包括id,name,gender,salary欄位,使用check約束【性別只能是男或女,薪水介於6000到8000之間】
create table students(
  id number(3) primary key,
  name varchar2(4) not null unique,
  gender varchar2(2) not null check ( gender in ('男','女') ),
  salary number(6) not null check ( salary between 6000 and 8000 )
);
insert into students(id,name,gender,salary) values(1,'哈哈','中',6000);錯
insert into students(id,name,gender,salary) values(2,'呵呵','男',5000);錯
insert into students(id,name,gender,salary) values(3,'嘻嘻','女',7000);對