Oracle學習筆記:快速上手

  • 開啓服務:先開啓Lisenterner服務 再開啓ORCL服務

  • oracle登錄 用戶:
    - 管理員 sysDBA - 無密碼
    - 系統用戶 system - manager
    - 普通用戶 scott - tiger

進入oracle步驟:

  • sqlplus scott/tiger
    DOS窗口中用sqlplus命令,以scott用戶的身份登錄到oracle
  • conn sys/sys as sysdba;
    以無密碼的系統管理員的身份重新連接(相當於SQLSERVER的windows身份驗證)
  • alter user 用戶名
  • identified by 密碼; 更改用戶的密碼
  • show user;
    查看當前登錄的用戶

    > 創建 create 刪除drop 修改alter
    

創建表空間: create tablespace
表空間名 datafile ‘物理存放路徑.dbf’
size 大小;

   create table 表名(
      列名  數據類型 約束,
      列名  數據類型 約束,
      列名  數據類型 約束,
      ....    );

數據類型:

  • 數字:
    number 可以存整數和小數,可以指定小數位數
    number(P,S) P精度(小數+整數的位數) S小數位數
    int 整數
    float 小數
  • 非數字:
    char(10) 固定 存儲數據時,不夠長度以空格填補,要存滿10個字節
    varchar(10) 可變 存儲的內容實際的長度,不需要存滿10個字節
    varchar2(長度) 同 varchar 4000個字符
    long 可變的字符串 2GB
    日期:date

序列:生成遞增的數字

同義詞共有兩種類型: 公有同義詞可被所有的數據庫用戶訪問。
私有同義詞只能在其模式內訪問,且不能與當前模式的對象同名。
CREATE (PUBLIC) SYNONYM 同義詞名 FOR 模式名.表名;

注意:一個用戶對應一個模式

   create sequence 序列名
   start with 初始值
   increment by 遞增;
   maxvalue 最大值
   minvalue 最小值
   NOCYCLE/CYCLE
   cache 緩存值;

緩存值不指定默認爲20,nocache緩存預先不分配值,緩存的值必須小於循環的值
nimvalue與循環(cycle)一起使用,指下次循環的開始值 start with 起始值 :第一次取值的起始值 序列取值:
序列名.nextVal 下一個值
序列名.currVal 當前值

查詢: 條件查詢、聚合函數、分組查詢、連接查詢、子查詢

  1. 基本查詢

select 列信息 from 表名 where 條件 group by 分組列 having 分組後篩選 order by 排序列
acs/desc

  1. 多表查詢:內連接、外連接

  2. 子查詢:作爲條件、列、表

select … from … where … update 表 set 列=更新值 where (子查詢)
delete from 表 where (子查詢)

  1. 視圖:簡化SQL語句,實際存放的是查詢語句,不是數據,數據存放在源表中
CREATE [OR REPLACE] VIEW 視圖名
as
查詢語句
[with check option]  主要針對視圖的查詢語句帶條件,對視圖執行修改操作時,不允許使視圖的查詢結果行數變少
[with read only]  只讀
  1. 索引:提高查詢的速度
    主鍵列默認添加索引

(1).標準的索引:索引添加在經常搜索的列上

create index 索引名 on  表名(列名);

(2).唯一索引:索引列值不重複

create unique index 索引名 on  表名(列名);

(3)、組合索引:經常按照多列搜索,則可以在多列上創建一個索引

create index 索引名 on  表名(列名1,列名2);

(4)、反向鍵索引:列值連續

通常索引是建立在連續增長的列上,使數據均勻地分佈在整個索引上,索引存儲在硬盤上是以塊的形式存儲的,
如果數據的修改導致順序發生改變,則系統會鎖定修改記錄所在的數據塊,這樣同一個塊中的數據要發生操作必須等待, 大大降低了併發性
反向鍵索引就是反轉索引列中的每一個字節,使數據分散的存放到磁盤不同的塊上,提高數據訪問的併發性 將反轉後的鍵按照常規索引存儲

語法:CREATE INDEX 索引名  ON 表名 (列名) REVERSE;

(5)、位圖索引:列值大量重複

語法:CREATE BITMAP INDEX 索引名  ON 表名 (列名);

PL/SQL 是過程語言(Procedural Language)與結構化查詢語言(SQL)結合而成的編程語言 PL/SQL 是對 SQL
的擴展 支持多種數據類型,如大對象和集合類型,可使用條件和循環等控制結構 可用於創建存儲過程、觸發器和程序包,給SQL語句的執行添加程序邏輯
與 Oracle 服務器和 Oracle 工具緊密集成,具備可移植性、靈活性和安全性

優點: 1、可以編寫邏輯代碼 2、PL/SQL中的代碼自動形成一個事物,出現異常就會一起回滾
3、更佳的性能,減少客戶端對ORACLE服務器端的訪問量,PL/SQL 經過編譯執行的

存儲過程

存儲過程(procedure):命名的PL/SQL代碼快,類似JAVA的方法 一個功能定義到一個存儲過程中,需要使用時直接調用

CREATE OR REPLACE PROCEDURE PRO_NAME
AS

BEGIN

[EXCEPTION]

END;

條件結構

IF 條件 THEN
   語句;
ELSIF 條件 THEN   
      語句;
ELSIF 條件 THEN
      語句;
....
ELSE
    語句N;
END IF;

根據指定的學號查詢的學生的信息,如果存在輸出學生信息,不存在提示對應的信息

帶參數的存儲過程
CREATE OR REPLACE PROCEDURE PROC1(id student.stuid%type)
AS
   --變量與表中的一行數據進行映射,語法:變量名 表名%rowtype;
   stu student%rowtype;
   num int; --存放根據學號查詢的記錄行數
begin
   select count(*) into num from student where stuid=id;
   --判斷
   if num=0 then
         dbms_output.put_line('學號不存在!');
   else
         select * into stu from student where stuid=id;  
         dbms_output.put_line(stu.stuid||'-'||stu.stuname);
   end if;
end proc1;
--調用存儲過程並傳參數
call proc1(0);

循環

LOOP循環

LOOP
      EXIT  WHEN  退出循環的條件表達式;
      執行語句;
END  LOOP;

循環輸出1-10

create or replace procedure proc1
as
  i int:=1;  --定義變量並賦初值
begin
  LOOP
      EXIT WHEN I>10;
      dbms_output.put_line(I);
      I:=I+1;
  END LOOP;   
end proc1;

CALL PROC1();

WHILE循環

    WHILE 循環語法:
    WHILE  進行循環條件
    LOOP
          執行語句;
    END  LOOP;
create or replace procedure proc1
as
  i int:=1;  --定義變量並賦初值
begin
    WHILE i<=10
    LOOP
        dbms_output.put_line(I);
        I:=I+2;
    END LOOP;
end proc1;

for循環

        FOR  變量  IN  起始值..結束值
        LOOP
              執行語句;
        END  LOOP;
    create or replace procedure proc1
    as
    begin
         for i in 1..10
         loop
             dbms_output.put_line(I);
         end loop;
    end;

定義存儲過程向學生信息表添加20行測試數據

    create or replace procedure proc1
    as
    begin
         for i in 1..20
         loop
             insert into student values(i,'測試'||i,'男',20,1.68,sysdate);
         end loop;
    end;

判斷某張表是否存在,如果存在就刪除

    CREATE OR REPLACE PROCEDURE CHECKTABLE(TABLENAME VARCHAR)
    AS
      NUM INT;
    BEGIN
      SELECT COUNT(*) INTO NUM FROM USER_TABLES WHERE TABLE_NAME=TABLENAME;  
      IF NUM>0 THEN
         --刪除表  
         --DROP TABLE TABLENAME;
         EXECUTE IMMEDIATE 'DROP TABLE '||TABLENAME;
      END IF; 
    END;

注意:PL/SQL中不支持DDL語句:create drop,需要使用命令 EXECUTE IMMEDIATE ‘DDL語句’ 執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章