oralce 數據庫 使用連接查詢 如:
select * from usertable,goods
如上述sql 語句中是以goods 表為中心進行擴展,所查出的數據是以goods進行展開.
注意點:oralce 中 sql 語句執行的方式幾乎都是從下往上的順序進行執行,
如表連接時是以最後那個表為作為初始表開始讀取,同理where 條件也是 從後端進行讀取,
能優先過濾大量的信息,
就可以先放置在條件最後.
COMMIT:當你執行DML操作時,使用commit 的話就會直接執行到數據庫中.
在編寫sql 語句時盡量少的使用 Having ,能用where 替換就換.
注意:orcale 增刪改差語法幾乎和sql server 相同這裡就不過多進行解釋。
--IF ELSE Declare --定義臨時變量 x number(3):=47; begin if x<3 then --dbms_output.put_line為輸出控制台語句 dbms_output.put_line('X in less then 10'); elsif x=10 then dbms_output.put_line('X in less to 10'); else dbms_output.put_line('X in less then 99'); end if;
declare --定義臨時變量 nums int ; total int ; begin --對變量進行賦值 nums:=0; total:=0; while nums<5 loop nums:=nums+1; total:=total+nums; end loop; dbms_output.put_line('前五個自然數的和時'||total); end;
declare nums int ; total int ; begin for v_value in 1 .. 10 loop dbms_output.put_line(v_value); end loop; end;
--标号和GOTO 无条件跳转到指定的标号去的意思 declare nums int ; begin for vlaues in 1 .. 10 loop if vlaues>5 then GOTO show; end if; end loop; <<show>> dbms_output.put_line(123); end;
--游標 declare --創建游標 格式:cursor 游標名稱 is select 列明 from 表名; cursor demo_cursor is select id,name from lzdemos; --保存列名數據 v_id lzdemos.id%type; v_name lzdemos.name%type; begin --打開游標; open demo_cursor; --使用循環輸出表中數據 loop --提取游標數據 格式:fetch 游標名稱 into 保存變量名稱; fetch demo_cursor into v_id,v_name; --輸出語句 dbms_output.put_line('編號id'||v_id||'名稱'||v_name); --找到游標最近讀取記錄是否成功 使用%notfound 游標屬性 讀取失敗則結束循環 exit when demo_cursor%notfound; end loop; --關閉游標 close demo_cursor; end;
--異常錯誤處理 exception declare number1 int :=1; --定義自定義報錯 numtry exception; begin if number1!=1 then --如果進行if 就觸發報錯 raise numtry; end if; --故意觸發其他類型報錯 number1:='asd'; exception --觸發報錯后設置提示信息 when numtry then dbms_output.put_line('自定義報錯觸發成功!<<123>>'); when others then dbms_output.put_line('其他報錯觸發<<321>>'); end;
--編寫一個只輸出無參的存儲過程 create or replace procedure proce_test is begin dbms_output.put_line('abc'); end; --調用 BEGIN proce_test(); END; --成功 --drop procedure proce_test 刪除
--有參存儲過程 --成功! create or replace procedure proc_test(ids in number,names in varchar2) as s_num number :=ids; s_names varchar2(20) :=names; begin --dbms_output.put_line(s_num); --對lzdemos 執行修改語句 update lzdemos set name=s_names where id=s_num; end; -- drop procedure proc_test --調用存儲過程 declare s_num number :=4; s_names varchar2(20) :='qoq'; begin proc_test(s_num,s_names); proc_test(4,'lol'); end;
--查詢表
select * from lzdemos
--觸發器 --在lzdemos 表上新增數據時觸發的觸發器 (無參) create or replace trigger insertdemo after insert on lzdemos for each row declare begin --新增時彈出abc dbms_output.put_line('abc'); end insertdemo; --INSERT INTO LZDEMOS VALUES(4,'ABC','123'); --建立一個在lzdemos 中新增數據的話會同時跟新 user 表中的數據的觸發器 (有參) CREATE OR REPLACE TRIGGER INSERTDEMOUSER BEFORE INSERT ON LZDEMOS FOR EACH ROW BEGIN --dbms_output.put_line(:new.name||' '||:new.id); INSERT INTO LZUSER (ids,names,pass) values(:new.id,:new.name,:new.pass); END; -- drop trigger INSERTDEMOUSER INSERT INTO LZDEMOS (id,name,pass)VALUES(5,'ABC','123');
其中:BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
行觸發器和語句觸發器的區別:行觸發器要求當一個DML語句操作影數據庫中的多行數據時,對于其中的每個數據行,只要它們符合觸發約束條件,均激活一次觸發器。
而語句觸發器:將整個語句操作作為觸發器的觸發事件,當它符合約束條件時。激活一次觸發器。
当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则为行触发器。
--表和表之間的連接查詢 --內連接 select * from lzdemos inner join lzuser on lzdemos.id=lzuser.ids; --左連接 select * from lzdemos left outer join lzuser on lzdemos.id=lzuser.ids; --右連接 select * from lzdemos right outer join lzuser on lzdemos.id=lzuser.ids; --全連接 select * from lzdemos full outer join lzuser on lzdemos.id=lzuser.ids; --自然連接 在兩張表中尋找那些數據類型和列名都相同的字段,然後自動地將它們連接起來,並返回所有符合條件的結果 select * from lzdemos natural join lzuser select * from lzuser,lzdemos
十一、聚合函數
--聚合函數的使用 於sql server 一樣 select sum(id) from lzdemos select avg(id) from lzdemos select max(id) from lzdemos select min(id) from lzdemos select count(id) from lzdemos