1. 程式人生 > >數據庫之Oracle(一)

數據庫之Oracle(一)

篩選 trim bst 新建 最大的 rsquo users 編輯 自帶

  前段時間項目中需要做數據管理和遷移的工作,於是又重新拾起了數據庫,在javaEE階段,我們對於數據庫的使用僅限於DML(insert,update,delete,select)。數據庫的使用也比較狹隘,只需要能夠進行基本的增刪改查操作就好。本文中,我將主要介紹Oracle數據庫的一些基礎知識以及一些常用的函數和PL/SQL。

  Oracle數據庫可以說是目前世界上大型企業運用最多的數據庫,它是由oracle公司自主研發的,同時也就決定了它的sql語句和其他數據庫(Mysql,Sqlserver)等有一些小地方的區別,不過大體來說,很大一部分的sql語句還是遵循普遍的規則。

一 :Oracle開發管理工具

  工欲善其事,必先利其器。Java 有Eclipse,服務器有tomcat,前端有sublime,編輯器有ue,數據庫也有自己的管理軟件DBMS--Database Management System.DBMS分為兩類:基於共享文件和(客戶端(Client)—服務端(Server))。客戶端主要進行的是用戶與之交互的軟件,例如客戶選擇要篩選的條件,後客戶端通過網絡把改請求傳遞給服務端,服務端處理完成後返回結果給客戶端,呈現給用戶。服務端則主要進行連接數據庫服務器,對數據進行添加,刪除,查詢和修改。都是通過服務端來進行的。

在平常使用中,所有的oracle服務器都會安裝一個名為Sql*Plus的命令行工具,這個客戶端只會在窗口顯示SQL>提示符,允許輸入命令給Oracle數據庫。

另外還會有Oracle SQL DEVELOPR ,在計算機上安裝時只顯示 SQL DEVELOPR,它支持所有的oracle中sql語句。

二:Oracle 基礎知識

  在oracle數據庫中,與其他數據庫不同的是,存在表空間。Oracle中表空間是像其他數據庫一樣設置了表空間,會管理該空間內的表,表空間實質是一個虛擬的,人為的創建好以後分配給特定的用戶,其他用戶登陸是不能夠對該表空間中的表做任何操作的。

Create tablespace name

Datafile ”D:/Oracle/tomspace” size 1024M

Extent management local

Uniform size 5M

在分配好表空間後,我們就要開始創建表.

下面是oracle數據庫的字段類型 (註意:其他數據庫的int--> number)

字段類型

中文說明

限制條件

其它說明

CHAR

固定長度字符串

最大長度2000 bytes

VARCHAR2

可變長度的字符串

最大長度4000 bytes

可做索引的最大長度749

NCHAR

根據字符集而定的固定長度字符串

最大長度2000 bytes

NVARCHAR2

根據字符集而定的可變長度字符串

最大長度4000 bytes

DATE

日期(日-月-年)

DD-MM-YY(HH-MI-SS)

經過嚴格測試,無千蟲問題

LONG

超長字符串

最大長度2G(231-1)

足夠存儲大部頭著作

RAW

固定長度的二進制數據

最大長度2000 bytes

可存放多媒體圖象聲音等

LONG RAW

可變長度的二進制數據

最大長度2G

同上

BLOB

二進制數據

最大長度4G

CLOB

字符數據

最大長度4G

NCLOB

根據字符集而定的字符數據

最大長度4G

BFILE

存放在數據庫外的二進制數據

最大長度4G

ROWID

數據表中記錄的唯一行號

10 bytes ********.****.****格式,*為0或1

NROWID

二進制數據表中記錄的唯一行號

最大長度4000 bytes

NUMBER(P,S)

數字類型

P為整數位,S為小數位

DECIMAL(P,S)

數字類型

P為整數位,S為小數位

INTEGER

整數類型

小的整數

FLOAT

浮點數類型

NUMBER(38),雙精度

REAL

實數類型

NUMBER(63),精度更高

2.1 DDL(數據定義語言)

2.1.1新建表

Create table tableName( name number,列2 類型.....);(數據庫中多條sql語句需要用‘;’隔開)

主鍵,外鍵,約束

在新增是一般都會有各種約束,下面簡單說幾種。

Name Varchar2(45) Primary key ----主鍵

Age number not null ----非空約束

Sex char(3) default ‘男’ ----默認’男’

Constraint tableName primary Key(列名1,列名2,列名3...) ---聯合主鍵

Foreigen key ---外鍵

建好的表可以在相應的數據庫下Tables中看到

2.1.2 刪除表

Drop table tableName

2.1.3 修改表

2.1.3.1.向表中添加新字段

ALTER TABLE <table_name> ADD (字段1 類型 [NOT NULL],字段2 類型 [NOT NULL].... );

2.1.3.2 修改表中字段

  ALTER TABLE <table_name> modify(字段1 類型,字段2 類型... );

  2.1.3.3 刪除表中字段

    ALTER TABLE <table_name> drop(字段1,字段2,.... );

  2.1.3.4 修改表的名稱

    RENAME <table_name> to <new table_name>;

  2.1.3.5 對已經存在的表添加約束

    ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> 約束類型 (針對的字段名);

    示例:

    Alter table emp add constraint S_F Foreign key (deptno) references dept(deptno);

  2.1.3.6 對表裏的約束禁用;

    ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name>;

  2.1.3.7 對表裏的約束重新啟用;

    ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name>;

  2.1.3.8 刪除表中約束

    ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;

    示例:

    ALTER TABLE emp drop CONSTRAINT <Primary key>;

2.2 DML(數據操作語言)

  2.2.1 插入數據

    Insert into tableName values(值1,值2,值3.....)

  2.2.2 修改數據

    Update tableName set name=’王五’ where age=28

    修改是需要添加Where 查詢條件,否則整個表中數據都會被修改

  2.2.3 刪除數據

    在刪除的時候 有delete 和truncate兩種,delete 刪除時一般不需要遵從外鍵約束,而truncate刪除時更加徹底,會收到外鍵約束。

    Delete from tableName

    Truncate tableName

  2.2.4 查詢數據

    Select name from users

    帶別名的查詢語句

    Select s.name from users s 表別名不能夠添加 as

    Select name (as) a ,age b from users -->查詢出的結果顯示的列名分別是 a,b 對於(as)可以省略

    需要註意的是在oracle自帶的DBMS中查詢語句不能夠對表別名添加AS

2.3 序列(例如id自增長)

    在oracle數據庫中,列值自動增長需要使用到序列(Sequence).

    Create Sequence sequence_name

    Start with number    ----初始值

    Increment by number   ----每次增加的值

    MaxValue number/NoMaxValue ----最大值/默認無最大值

    MinValue number/NoMinValue ----最小值/默認無最小值

    Cycle/NoCycle       ----表示達到最大值/最小值後(重新開始/不重新開始,會報錯)

    CACHE/NoCACHE        ----會生成序列號

    在生成序列之後,在添加中可以

    Insert into tableName values(sequence_name.nextval,name,age,sex....)

    可以使用nextval 或currval 兩個”偽列”來獲取下一個值和當前值。

    Alter sequence 時 1.初始值是不能去修改的;

        2.最大值不能小於當前值,最小值不能大於當前值;

2.4 高級查詢

    在實際開發中,對於數據的檢索我們使用的時候需要各種各樣的條件去限制。

  2.4.1 Where 過濾查詢,帶條件查詢時必須有Where關鍵字

描述

Sql語句

查詢年齡在25 的用戶姓名

select name from users where age=’25’

查詢年齡25,性別男的用戶姓名

select name from users where age=’25’ and sex=’男’

  2.4.2 Between, and , or,in,not in運算符查詢

描述

Sql語句

查詢年齡在20-25 之間的用戶姓名

Select name from users where age Between(20,25)

Select name from users where age>=20 and age<= 25

Select name from users where age in(20,25)

查詢年齡不在20-25之間的用戶姓名

Select name from users where age<20 or age>25

Select name from users where age not in (20.25)

  2.4.3 Group By 分組

描述

Sql語句

會通過不同的年齡去分組表中數據,最後得到的一個年齡只有一條數據,顯示的數據是id靠前的

Select name from users gruop by age

  2.4.4 Having 過濾分組

描述

Sql語句

顯示以年齡分組後數量大於2的用戶姓名

Select name,count(*) from users group by age having count(*)>2

   2.4.5 Count() 計算總記錄數

描述

Sql語句

查詢所有users 表中的記錄總數(包括Null)

Select count(*) from users

查詢所有users表中列名不為NUll的記錄總數

Select count(列名) from users

  2.4.6 Order By 排序 (asc升序,desc 降序 不寫默認升序)

描述

Sql語句

按年齡查找用戶姓名,按升序排列)

Select name from users order by age asc

按年齡查找用戶姓名,按降序排列

Select name from users order by age desc

  2.4.7 Like 模糊查詢 (“_” ,”%”的使用區別)

    使用模糊查詢的地方很多,比如百度的搜索框應該就是模糊查詢,模糊查詢可以更有效的,更全面的搜索到相應的信息。

描述

Sql語句

會查出例如”王陽/李陽”這樣的用戶年齡 “_”代表前面只有一個字符

Select age from users where name like ’_陽’

會查出名字中最後一個字是陽的用戶,例如”李海陽,李陽”

“%”代表任意字符,任意長度

Select age from users where name like ’%陽’

會查出名字中帶有字陽的用戶,例如”李海陽,李陽光”,”陽光”

Select age from users where name like ’%陽%’ -->

三、常用函數

    函數的使用在數據庫中是十分常見的,函數的存在方便了我們對數據做所需要的處理,更加規範,安全的得到想要的數據。

    字符函數

名稱

描述

CONCAT(字符串1,字符串2)

將字符串1和字符串2連接成一個新的字符串
示例: select CONCAT(job,ename) from emp

LPAD(字段,總的大小,添充字符)

左填充即向右對齊
示例: select empno,lpad(sal,10,‘*‘) from emp

RPAD(字段,總的大小,添充字符)

右填充即向左對齊
示例: select empno,rpad(sal,10) from emp

LOWER(字符串)

將字符串全部變成小寫;

UPPER(字符串)

將字符串全部變成大寫;

INITCAP(字符串)

將字符串變成第一個字母大寫,其余都變成小寫;

LENGTH(字符串)

求出字符串的長度;

SUBSTR(字符串,開始位置,長度)

從字符串中取子串;
示例: select substr(ename,2,3) from emp;--從ename的第2位開始取3位

INSTR(字符串,字符)

查看字符是否在字符串中存在;不存在返回0;存在則返回字符所在的的位置;如果有兩個以上的字符則返回第一個的位置.
示例:select instr(ename,‘S‘) from emp;

TRIM(字符 FROM 字符串)

去掉字符串首尾的字符;
示例: select trim(‘S‘ from ename) from emp;

TO_CHAR()

將不是其他類型轉成字符類型;
對於日期型可以控制其格式:TO_CHAR(日期,‘格式‘);
其中格式有: ‘YYYY‘ --以4為顯示年;
‘YEAR‘ --以標準格式顯示年; ‘MM‘ ; ‘MON‘ ; ‘DD‘ ; ‘DAY‘; ‘HH‘ ; ‘MI‘ ;‘SS‘

REPLACE(字符串,字符串1,字符串2)

將字符串中的字符1替換成字符2;
示例: select replace(ename,‘SC‘,‘SS‘) from emp;

TRANSLATE(字符串,字符串1,字符串2)

替換多的字符;
示例: select translate(ename,‘SH‘,‘AB‘) from emp;
--表示將ename中的‘S‘換成‘A‘,‘H‘換成‘B‘;

ASCII(char)

求字符的ascii碼

NLSSORT(字符串)

對字符串排序.

    數學函數

名稱

描述

ABS(數字)

一個數的絕對值

CEIL(數字)

向上取整;不論小數後的書為多少都要向前進位;
CEIL(123.01)=124;
CEIL(-123.99)=-123;

FLOOR(數字)

向下取整;不論小數後的書為多少都刪除;|
floor(123.99)=123;
floor(-123.01)=-124;

MOD(被除數,除數)

取余數;
MOD(20,3)=2

ROUND(數字,從第幾為開始取)

四舍五入;
ROUND(123.5,0)=124;
ROUND(-123.5,0)=-124;
ROUND(123.5,-2)=100;
ROUND(-123.5,-2)=-100;

SIGN(數字)

判斷是正數還是負數;正數返回1,負數返回-1,0返回0;

SQRT(數字)

對數字開方;

POWER(m,n)

求m的n次方;

TRUNC(數字,從第幾位開始)

切數字;
TRUNC(123.99,1)=123.9
TRUNC(-123.99,1)=-123.9
TRUNC(123.99,-1)=120
TRUNC(-123.99,-1)=-120
TRUNC(123.99)=123

GREATEST(數字列表)

找出數字列表中最大的數;
示例:
select greatest(100,200,-100) from dual; --結果為200

LEAST(數字列表)

找出數字列表中最小的數;

SIN(n)

求n的正旋

COS(n)

求n的余旋

TAN(n)

求n的正切

ACos(n)

求n的反正切

ATAN(n)

求n的反正切

exp(n)

求n的指數

LN(n)

求n的自然對數,n必須大於0

LOG(m,n)

求n以m為底的對數,m和n為正數,且m不能為0

    日期函數

名稱

描述

ADD_MONTHS(日期,數字)

在以有的日期上加一定的月份;
示例:
select add_months(hiredate,20),hiredate from emp;

LAST_DAY(日期)

求出該日期的最後一天.

MONTHS_BETWEEN(日期1,日期2)

求出兩個月之間的天樹(註意返回的天數為小數);
示例:
select months_between(sysdate,hiredate) from emp;

NEW_TIME(時間,時區,‘gmt‘)

按照時區設定時間.

NEXT_DAY(d,char)

返回d指定的日期之後並滿足char指定條件的第一個日期

    其他函數

名稱

描述

VSIZE(類型)

求出數據類型的大小;

NVL(字符串,替換字符)

如果字符串為空則替換,否則不替換

數據庫之Oracle(一)