- 基礎sql語句
oralce 數據庫 使用連接查詢 如:
select * from usertable,goods
如上述sql 語句中是以goods 表為中心進行擴展,所查出的數據是以goods進行展開.
注意點:oralce 中 sql 語句執行的方式幾乎都是從下往上的順序進行執行,
如表連接時是以最後那個表為作為初始表開始讀取,同理where 條件也是 從後端進行讀取,
能優先過濾大量的信息,
就可以先放置在條件最後.
COMMIT:當你執行DML操作時,使用commit 的話就會直接執行到數據庫中.
在編寫sql 語句時盡量少的使用 Having ,能用where 替換就換.
注意:orcale 增刪改差語法幾乎和sql server 相同這裡就不過多進行解釋。
- IF ELSE 語法
--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;
- WHILE 循環
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;
- FOR 循環
declare
nums int ;
total int ;
begin
for v_value in 1 .. 10 loop
dbms_output.put_line(v_value);
end loop;
end;
- 標號(<<>>)和 GOTO
--标号和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