學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=74 設計資料庫步驟: 良好的資料庫設計:節省空間,數據完整,方便開發。 步驟:1、收集信息 2、標識實體 3、標識實體屬性 4、標識實體之間的關係 5、畫E-R圖,編寫Sql 概念瞭解: 映射基數 ...
學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=74
設計資料庫步驟:
良好的資料庫設計:節省空間,數據完整,方便開發。
步驟:1、收集信息 2、標識實體 3、標識實體屬性 4、標識實體之間的關係 5、畫E-R圖,編寫Sql
概念瞭解:
- 映射基數有一對一、一對多、多對一、多對多。
- 三大範式:每列是不可再分的數據單元,例如“地址列”內容“中國北京”可以拆分“國家列”和“城市列”;每個表只描述一件事情。列和主鍵要有直接的關係,不能間接相關。
PL/SQL:
是一種過程語言,與結構化SQl結合的編程語言,對SQL語句的擴展。分為三個部分:聲明,執行,異常。如果沒有東西要聲明可以不寫declare,不捕獲異常可以不寫exception。註釋分分單行“--”和多行“/**/”,變數標識符最大長度31。
變數的聲明以“變數名 類型 := 值”,註意“:=”是賦值用的,而“=”是判斷用的。如果要聲明常量,在變數名後加關鍵字“constant”即“變數名 constant 類型 := 值”,聲明常量必須賦值。
屬性類型:
屬性類型有%Type、%RowType。應該瞭解的常見類型有:number(整型和浮點)、char、varchar2(可變長度)、date、boolean、binary_integer(整型)。“%Type”用於引用表格欄位的類型,用法“表名.列名%Type”。
declare name varchar2(20) := '資料庫'; i constant number :=3; salary emp.sal%type:=1000; begin dbms_output.put_line(name || 'hahhah'); end;
record類型,就像定義C#中的類
declare type student is record( stuid emp.empno%type, stuname emp.ename%type ); stu student; begin stu.stuid:=11; stu.stuname:='bibi'; dbms_output.put_line('學號' || stu.stuid); end;
%rowtype ,就是一種引用表的record類型。
declare stu emp%rowtype; --emp是一個表,使用rowtype獲取表的行類型。stu其實就是record類型 begin stu.empno := 5555; stu.ename := 'bibi'; dbms_output.put_line(stu.empno || stu.ename); select * into stu from emp where empno=7369; dbms_output.put_line(stu.empno || stu.ename); end;
table類型,類似C#的字典類型。
declare type myTable is table of number index by binary_integer; tableone myTable; x number; begin tableone(0) := 100; tableone(1) := 200; tableone(2) := 200; tableone(4) := 200; tableone(3) := 200; dbms_output.put_line(tableone(0) || tableone(1)); x := tableone.first(); --獲取第一個key dbms_output.put_line('第一個key' || x); x := tableone.next(x); --獲取當前key的下一個key dbms_output.put_line('第一個key的下一個key' || x); x := tableone.last(); --獲取最後一個key dbms_output.put_line('(自動)排序最後的一個key' || x); end;
變數作用域:
declare i number := 90; begin declare j number :=100; begin dbms_output.put_line(j); --使用內層變數 dbms_output.put_line(i); --使用外層變數 end; end;
if分支:if...elsif..else ;if...;if...else..;if....elsif...elsif...各種組合。
declare i number := 10; begin if i > 30 then dbms_output.put_line('ok啊'); elsif i > 5 then -- 註意是 elsif dbms_output.put_line('也ok啊'); else --註意沒有then dbms_output.put_line('不ok啊'); end if; end; / declare i number := 10; begin if i > 30 then dbms_output.put_line('ok啊'); else --註意沒有then dbms_output.put_line('不ok啊'); end if; end; / declare i number := 10; begin if i > 30 then dbms_output.put_line('ok啊'); end if; end; /
null值不參與比較運算,不會出現運算結果。如果用在if比較判斷分支里,只能進else。
簡單迴圈:loop...exit when;... end loop;要寫退出條件,不然會陷入死迴圈。
declare i number := 0; begin loop dbms_output.put_line(i); i := i + 1; exit when i = 10; --不寫退出條件,會陷入死迴圈。 --i := i + 1; 也可以在這裡寫條件 end loop; end;
普通迴圈:使用while,條件前置了。
declare i number := 0; begin while i < 100 loop if mod(i, 2) = 0 then dbms_output.put_line(i); end if; i := i + 1; end loop; end;
for迴圈:for的變數只能自增。但使用reverse,可以反轉增長的序列。
begin for i in 1 .. 10 loop dbms_output.put_line(i); end loop; end; / begin for i in reverse 1 .. 10 loop dbms_output.put_line(i); end loop; end; /
多重迴圈:如果要退出外層迴圈,應給外層迴圈起別名,“exit 外層迴圈”,純粹的exit只能退出當前迴圈。
declare x number := 1; y number := 1; begin <<wai>> while x <= 10 loop dbms_output.put_line('----' || x); y := 1; while y <= 5 loop dbms_output.put_line(y); if x = 7 and y = 3 then exit wai; --退出外層迴圈 end if; y := y + 1; end loop; x := x + 1; end loop; end;
goto:跳轉,繞道而行。
begin dbms_output.put_line('1'); dbms_output.put_line('2'); dbms_output.put_line('3'); goto hi; dbms_output.put_line('4'); dbms_output.put_line('5'); <<hi>> dbms_output.put_line('6'); dbms_output.put_line('7'); end;
begin dbms_output.put_line('1'); dbms_output.put_line('2'); dbms_output.put_line('3'); goto hi; dbms_output.put_line('4'); dbms_output.put_line('5'); <<hi>> null; end;