數據庫之Oracle(一)
前段時間項目中需要做數據管理和遷移的工作,於是又重新拾起了數據庫,在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連接成一個新的字符串 |
LPAD(字段,總的大小,添充字符) |
左填充即向右對齊 |
RPAD(字段,總的大小,添充字符) |
右填充即向左對齊 |
LOWER(字符串) |
將字符串全部變成小寫; |
UPPER(字符串) |
將字符串全部變成大寫; |
INITCAP(字符串) |
將字符串變成第一個字母大寫,其余都變成小寫; |
LENGTH(字符串) |
求出字符串的長度; |
SUBSTR(字符串,開始位置,長度) |
從字符串中取子串; |
INSTR(字符串,字符) |
查看字符是否在字符串中存在;不存在返回0;存在則返回字符所在的的位置;如果有兩個以上的字符則返回第一個的位置. |
TRIM(字符 FROM 字符串) |
去掉字符串首尾的字符; |
TO_CHAR() |
將不是其他類型轉成字符類型; |
REPLACE(字符串,字符串1,字符串2) |
將字符串中的字符1替換成字符2; |
TRANSLATE(字符串,字符串1,字符串2) |
替換多的字符; |
ASCII(char) |
求字符的ascii碼 |
NLSSORT(字符串) |
對字符串排序. |
數學函數
名稱 |
描述 |
ABS(數字) |
一個數的絕對值 |
CEIL(數字) |
向上取整;不論小數後的書為多少都要向前進位; |
FLOOR(數字) |
向下取整;不論小數後的書為多少都刪除;| |
MOD(被除數,除數) |
取余數; |
ROUND(數字,從第幾為開始取) |
四舍五入; |
SIGN(數字) |
判斷是正數還是負數;正數返回1,負數返回-1,0返回0; |
SQRT(數字) |
對數字開方; |
POWER(m,n) |
求m的n次方; |
TRUNC(數字,從第幾位開始) |
切數字; |
GREATEST(數字列表) |
找出數字列表中最大的數; |
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(日期,數字) |
在以有的日期上加一定的月份; |
LAST_DAY(日期) |
求出該日期的最後一天. |
MONTHS_BETWEEN(日期1,日期2) |
求出兩個月之間的天樹(註意返回的天數為小數); |
NEW_TIME(時間,時區,‘gmt‘) |
按照時區設定時間. |
NEXT_DAY(d,char) |
返回d指定的日期之後並滿足char指定條件的第一個日期 |
其他函數
名稱 |
描述 |
VSIZE(類型) |
求出數據類型的大小; |
NVL(字符串,替換字符) |
如果字符串為空則替換,否則不替換 |
數據庫之Oracle(一)