Oracle數據庫DDL,DML,視圖,PLSQL編程

動手敲~~~java

--建立一個表空間--beijing
create tablespace beijing
datafile 'c:\beijing.dbf'
size 100m
autoextend on
next 10m;
--刪除表空間
drop tablespace beijing;

/*
     建立用戶
     
*/
create user dashao
identified by dashao
default tablespace beijing;

/*
        受權 grant 角色 | 權限 to 用戶
*/
grant connect to dashao;

--授予dba的角色
grant dba to dashao;

/*
   建立表
      create table 表名(
           列名  列的類型 [列的約束],
           列名  列的類型  [列的約束]      
         );
      列的類型:
         varchar ,在Oracle中,目前是支持的, 可是不保證之後還支持
         
         varchar2(長度) 可變字符長度    varchar2(10)  hello  佔5個字符
         char(長度)   固定長度字符      char(10)      hello  佔10個字符,用空格填充
         number(總長度,小數長度)     數字類型 --小數長度不能大於等於總長度
         
         date                   年月日時分秒 2017/4/13 9:43:49
         timestamp              時間戳, 比date類型更加精確 13-APR-17 09.44.08.272000 AM +08:00
         
         LONG/CLOB : 存放一本小說
         BLOB      : 存放電影  java 存進去,  再讀取出來
     

    使用子查詢的方式建立表
         
         create table 表名 as 查詢語句; 
         
           注意: 只會複製表結構和表中的數據,不會複製列的約束     
                 若是查詢語句有結果, 就是複製 表結構和數據
                 若是查詢語句沒有結果, 就是複製 表結構  
*/
select * from scott.emp;

create table test1(
       name1 varchar2(10),
       name2 char(10),
       age number(2,3)
);

insert into test1(name1,name2) values('hello','hello');

select * from test1 where name1 like 'hello'; --能夠查詢數據
select * from test1 where name2 like 'hello'; --查不出數據

insert into test1(age) values(2);

select current_date from dual;

select current_timestamp from dual;

--  create table 表名 as 查詢語句; 複製表     
create table emp as select * from scott.emp;

select * from emp;

--若是查詢語句是沒有任何的結果
select * from scott.emp where 1=2;
create table emp1 as select * from scott.emp where 1=2;
select * from emp1;

/*
       修改表:
         添加列
         修改列
         刪除列
         修改列名
       重命名錶
       
     sql分類:
      DDL : 數據定義語言, 修改的結構  alter create drop truncate
       DML : 數據操縱語言 , 操做表中數據 insert update delete
       DCL : 數據控制語言 , grant     
       DQL : select  
*/

create table stu(
    stuid number,
    sname varchar2(10)
);

alter table stu add phone varchar2(11);

alter table stu add (
      mobile varchar2(11),
      sex varchar2(2)
);
--修改列的類型
alter table stu modify sex varchar2(4);

--修改列的名 sex --->gender
alter table stu rename column sex to gender;

--刪除列
alter table stu drop column gender;

select * from stu;

--修改表名
rename stu to Student;
select * from student;

--刪除表
drop table Student;

/*
    表的五大約束
    列的約束:約束主要是用來約束表中的數據的規則
      主鍵約束:primary key 不能爲空,必須惟一
      非空約束
      惟一約束
      檢查約束 check(條件) 在mysql中是能夠寫的,可是mysql直接忽略了檢查約束
      
      外鍵約束:
         主要是用來約束從表a總的記錄,必須是存在於主表b中
*/
--男,女,人妖
create table student(
    stuid number primary key,
    sname varchar2(10) unique,
    age   varchar2(10) not null,
    gender varchar2(4) check( gender in ('','','人妖'))
);
--主鍵約束違反
insert into student values(1,'張三','31','');
insert into student values(1,'李四','31','');
--惟一約束違反
insert into student values(1,'徐立','31','');
insert into student values(2,'徐立','31','');
--非空約束
insert into student values(1,'徐立',null,'');
--檢查約束
insert into student values(1,'徐立','31','');
insert into student values(1,'徐立','31','');

/*
     商品分類,商品表
     
*/
--商品分類表
create table category(
       cid number primary key,
       cname varchar2(20)
);

--建立一個商品表
create table product(
       pid number primary key,
       pname varchar2(20),
       cno number
);
insert into category values(1,'手機數碼');

insert into product values(10,'錘子',11);

--添加外鍵約束
alter table Product add foreign key(cno) references Category(cid);

delete from Product where pid=10; 
--1.首先主表中必須存在11號, 先往主表中插入數據,再往從表中插入數據
insert into Category values(2,'電腦辦公');
insert into Product values(11,'外星人',2);

select * from Category;
select * from Product;

--刪除Category
drop table Category;--被外鍵關聯,沒法刪除

--強制刪除(不建議),先刪除外鍵關聯的外鍵約束,在刪除本身,
drop table Category cascade constraint;

--級聯刪除
----添加外鍵約束,使用級聯約束  ,在刪除的時候,使用級聯刪除
alter table product add foreign key(cno) references category(cid) on delete cascade; 

insert into category values(2,'電腦辦公');
insert into product values(11,'外星人',2);

--級聯刪除 : 首先去從表中找有沒有 關聯數據, 若是在從表中找到關聯數據,先刪除從表中關聯數據,而後再刪除表中的數據
delete from category where cid = 2;

select * from Category;
select * from Product;

/*
     插入數據:
         insert into 表名 values(全部列的值都要對應寫上)
         insert into 表名(列1,列2) values(值1,值2);
         
     使用子查詢插入數據
         insert into 表名 查詢語句
*/

select * from emp1;
select * from emp;
--將emp中10號部門的員工信息,插入到emp1中
insert into emp1 select * from emp where deptno=10 ;


/*
     更新數據
       update 表名 set 列名 = 列的值  [where 條件]
*/

update emp1 set ename='HUAAN' where ename = 'KING';

select * from emp1;
/*
     刪除數據:
       delete from 表名  [where 條件]
       
       delete和truncate 區別
        
       delete:                 truncate:
        DML                    DDL
        逐條刪除               先刪除表再建立表
        支持事務操做           不支持事務操做,
                               執行效率要高    
*/
/*
   事務: 就是一系列的操做,要麼都成功,要麼都失敗
       四大特性: 原子性,隔離性,持久性,一致性
          
       若是不考慮隔離級別: 髒讀,虛讀,不可重複讀
            MYSQL隔離級別: READ UNCOMMITTED , READ COMMITTED, REPEATABLE READ, SERIALIAZABLE
            ORACLE隔離級別: READ COMMITTED SERIALIZABLE READ ONLY 
                        默認隔離級別: READ COMMITTED
                        
      提交 : commit
      事務的保存點/回滾點: savepoint 保存點的名稱
      回滾: rollback
*/
create table louti(
   lou number primary key    
);

insert into louti values(1);
insert into louti values(2);
insert into louti values(3);
insert into louti values(4);
insert into louti values(5);
savepoint dangban;
insert into louti values(5); --主鍵約束會發生異常
insert into louti values(6);
rollback to dangban
commit;

declare

begin
  insert into louti values(1);
  insert into louti values(2);
  insert into louti values(3);
  insert into louti values(4);
  insert into louti values(5);
  savepoint dangban;
  insert into louti values(5);  --這行代碼會發生異常
  insert into louti values(6);
  commit;
exception  --捕獲異常
  when others then
     rollback to dangban;
     commit;
end;

select * from louti;

/*
      視圖: 是對查詢結果的一個封裝
              視圖裏面全部的數據,都是來自於它查詢的那張表,視圖自己不存儲任何數據
          1.可以封裝複雜的查詢結果
          2.屏蔽表中的細節
       語法: 
          create [or replace] view 視圖的名稱 as 查詢語句 [ with read only]
          
       注意: 一般不要經過視圖去修改,視圖建立的時候,一般要加上with read only
*/

select * from emp;

--建立一個視圖
create or replace view view_test1 as select ename,job,mgr from emp;

select * from view_test1;

--經過視圖修改數據
update view_test1 set ename = 'SMITH2' where ename='SMITH' 
select * from emp;

--建立一個只讀視圖
create or replace view view_test2 as select ename,job,mgr from emp with read only;
update view_test2 set ename='SMITH3' where ename = 'SMITH2';

/*
    序列: 生成相似於 auto_increment 這種ID自動增加 1,2,3,4,5....
       auto_increment 這個是mysql  
       
       語法:
           create sequence 序列的名稱
           start with 從幾開始
           increment by 每次增加多少
           maxvalue 最大值 | nomaxvalue
           minvalue 最小值 | nominvalue
           cycle | nocycle  是否循環    1,2,3,1,2,3
           cache 緩存的數量3 | nocache  1,2,3,4,5,6 
           
      如何從序列獲取值
          currval : 當前值
          nextval : 下一個值
          
               注意: currval 須要在調用nextval以後才能使用      
               
               永不回頭,往下取數據, 不管發生異常, 回滾   
*/
--建立一個 1,3,5,7,9......30 
create sequence seq_test1
start with 1
increment by 2
maxvalue 20
cycle 
cache 10;

select seq_test1.nextval from dual;
select seq_test1.currval from dual;



/*
    索引:至關因而一本書的目錄,可以提升咱們的查詢效率
       若是某一列,你常常用來做爲查詢條件,那麼就有必要建立索引,數據量比較的狀況
       
       語法: 
             create index 索引的名稱 on 表名(列)   
        
       注意:主鍵約束自帶主鍵索引, 惟一約束自帶惟一索引
       
       索引原理: btree   balance Tree 平衡二叉樹
       
             若是某列做爲查詢條件的時候,能夠提升查詢效率,可是修改的時候,會變慢
             
             索引建立好以後,過了一段,DBA都會去作重構索引
             
       SQL調優:
             1.查看執行計劃F5
             2. 分析裏面的cost 和 影響行數, 想辦法下降            
*/

/*
     DDL表空間操做
         建立表空間
         建立用戶
         受權
         
         建立表
              子查詢建立表
         修改表 : 添加列,刪除列,修改列,修改列名, 修改表名
         
         約束:
             主鍵約束,惟一約束,非空約束,檢查約束,外鍵約束
             
             外鍵約束:
               強制刪除
               級聯刪除
             
     DML表中數據:
         插入數據
             子查詢插入數據
         更新數據
         刪除數據: delete 和 truncate
         
         事務操做:
               savepoint 保存點
               rollback to 保存點
          ORACLE事務隔離級別  : READ COMMITTED 
          
     視圖: 就像窗戶同樣, 封裝查詢結果 , 一般視圖建立只讀視圖
     序列: 主要是用來實現ID自增加 
     索引: 至關因而書的目錄,可以提升查詢效率, 原理 平衡二叉樹, 每隔一段時間DBA都須要去重建索引
     同義詞: create synonym 名稱 for 對象的名稱          

*/


/*
     PLSQL編程 : procedure Language 過程語言 Oracle對SQL的一個擴展
             讓咱們可以像在java中同樣寫 if else else if 條件, 還能夠編寫循環邏輯 for while
             
             declare
                --聲明變量
                變量名 變量類型;
                變量名 變量類型 := 初始值;
                  vsal emp.sal%type;  --引用型的變量  
                  vrow emp%rowtype;   --聲明記錄型變量          
             begin
                --業務邏輯
             end;
             
             dbms_output.put_line()至關於java中 syso 
*/
declare
   i varchar2(10) := '張三';          
begin
  dbms_output.put_line(i);
end;

--查詢7369的工資,而且打印出來
declare
  vsal emp.sal%type;
begin
  --將查詢出的結果賦值給vsal
  select sal into vsal from emp where empno = 7369;
  
  dbms_output.put_line(vsal);
end;

--查詢7369的員工信息,而且打印出來
 select * from emp where empno = 7369;

declare
  vrow emp%rowtype;      
begin
  select * into vrow from emp where empno = 7369;
  
  dbms_output.put_line('姓名:'||vrow.ename || '工資'|| vrow.sal);
end;

/*
  PL條件判斷
     
     if then
     
     elsif then
       
     else 
     
     end if;
*/
--根據不一樣年紀,輸出相關內容
declare
   age number := &aaa;
begin
  if age < 18 then
     dbms_output.put_line('小屁孩');
  elsif age>=18 and age <=24 then
     dbms_output.put_line('年輕人');
  elsif age>24 and age < 40 then
    dbms_output.put_line('老司機');
  else 
      dbms_output.put_line('老年人');    
  end if;
end;

/*
  循環操做
  while 循環
      while 條件 loop
        
      end loop;
    
  for循環
      for 變量  in [reverse] 起始值..結束值 loop
        
      end loop;
  
  loop循環  
      loop
        exit when 條件
      end loop;
      
*/
--輸出1~10
declare
  i number :=1;
begin
  while i<=10 loop
    dbms_output.put_line(i);
    i := i+1;    
  end loop;
end;

--輸出1~10
declare

begin
  for i in reverse 1..10 loop
    dbms_output.put_line(i);
  end loop;
end;

--輸出1~10
declare
   i number :=1;
begin
   loop
     exit when i>10;
      dbms_output.put_line(i);  
     i := i+1;
   end loop;
end;

/*

   *
  ***
 *****
  ***
   *   
輸出 m  
   x : [-m,m]
   y : [-m,m]
   
   輸出全部知足條件的 : abs(y)+abs(x) <=m
   
   m取值
*/
--使用PLSQL輸出菱形
declare
   m number := 10;
begin
   for x in -m..m loop
     for y in -m..m loop
       if abs(y) + abs(x) <= m then
         dbms_output.put('*');
       else
         dbms_output.put(' ');
       end if;      
     end loop;
     dbms_output.new_line();
   end loop;  
end;

--使用PLSQL輸出三角形,只要是三個角
declare
   m number := 10;
begin
   for x in reverse -m..m loop
     for y in -m..m loop
       if abs(y) + abs(x) <= m and x>=0 then
         dbms_output.put('*');
       else
         dbms_output.put(' ');
       end if;      
     end loop;
     dbms_output.new_line();
   end loop;  
end;
相關文章
相關標籤/搜索