Oracle資料庫深入學習
一、Oracle概念
oracle資料可系統是美國oracle(甲骨文)公司提供的以分散式資料庫為核心的一組軟體產品,是目前最流行的客戶/伺服器或B/S體系結構的資料庫之一,oracle資料庫時目前世界上使用最為廣泛的資料庫管理系統,作為一個通用的資料庫系統,它具有完善的資料庫管理功能,是關係型資料庫,比mysql更為龐大,在現行的關係型資料庫中排名第一(oracle、mysql、SqlServer),時間是最為精確的。
二、Oracle的安裝
三、Oracle資料庫的體系結構
1、資料庫database
Oracle資料庫是資料的物理儲存,這就包括(資料檔案ORA或者DBF、控制檔案、聯機日誌、引數檔案)。其實Oracle資料庫的概念和其他資料庫不一樣,這裡的資料庫時一個作業系統只有一個庫,可以看做Oracle就只有一個大資料庫。
2、例項
一個數據庫可以有n個例項,有一系列的後臺程序和記憶體結構組成。
3、資料檔案dbf
是資料庫的物理儲存單位,資料庫的資料是儲存在表空間中的,真正是在某一個或者多個數據檔案中,而一個表空間可以由一個或多個數據檔案組成,一個數據檔案只能屬於一個表空間,一旦資料檔案被加入到某個表空間後,就不能刪除這個檔案,如果要刪除某個資料檔案,只能刪除其所屬於的表空間才行。
4、表空間
表空間是Oracle對物理資料庫上相關資料檔案的邏輯對映,一個數據庫在邏輯上被劃分成一到若干個表空間,每個表空間包含了在邏輯上相關聯的一組結構,每個資料庫至少有一個表空間(稱之為system表空間)
每個表空間由同一磁碟上的一個或多個檔案組成,這些檔案叫資料檔案,一個數據檔案只能屬於一個表空間。
5、使用者
使用者是在例項下建立的,不同例項中可以建相同名字的使用者,表的資料是由使用者放入某一個表空間的,而這個表龍劍會隨機把這些表資料進行管理和存放的,但是表不是由表空間去查詢的,而是由使用者去查詢。
6、SCOTT和HR使用者
是Oracle幫我們建好的測試賬戶,Scott賬戶常用,裡面有emp、dept表等。
四、Oracle和MYSQL的差別
1、新建專案的方式
MYSQL : 建立一個數據庫,建立相應的表
2、Oracle是多使用者的, MYSQL是多資料庫的
3、Oracle安全級別要高,MYSQL開源免費
五、基本查詢
1、SQL概念
結構化查詢語言
2、SQL分類
DDL : 資料定義語言 create alter drop truncate
DML : 資料操縱語言 insert update delete
DCL : 資料控制語言 安全 授權 grant revoke
DQL : 資料查詢語言 select from子句 where子句
在oracle中將DQL放入DML中,多了TCL:事務控制語言 commit、rollback
3、Oracle中的資料字典
所謂資料字典就是編寫sql語句,全選可以一次性執行不報錯
/* 1.刪除資料物件 */
-- 刪除資料表
drop table t_reply;
drop table t_user;
-- 刪除序列
drop sequence sq_user;
drop sequence sq_reply;
/* 2.建立資料物件 */
-- 建立資料表
create table t_user(
u_id number(4) primary key,
u_userName varchar2(40) unique not null,
u_password varchar2(50) not null,
u_gender number(1) check(u_gender in (0,1,2)),
u_age number(3) check(u_age between 12 and 120),
u_registeTime date not null
);
create table t_reply(
r_id number(10) primary key,
r_content varchar2(500) not null,
r_userId number(4) not null,
foreign key(r_userId) references t_user(u_id)
);
-- 建立序列
create sequence sq_user start with 1001;
create sequence sq_reply start with 10000001;
/* 3.新增測試資料 */
-- 處理全新的資料表和全新的序列在使用時取不到初始值的問題
insert into t_user values
(1, '1', '1', 1, 25, sysdate);
insert into t_reply values
(1, '1', 1);
delete from t_reply;
delete from t_user;
commit;
/*insert into t_user values
(1000, 'owner', '9999', 1, 25, sysdate);
insert into t_reply values
(10000000, '人員召集...', 1000);*/
-- 新增資料
insert into t_user values
(sq_user.nextval, 'admin', '9999', 1, 25, sysdate);
insert into t_reply values
(sq_reply.nextval, '系統1.0上線...', sq_user.currval);
/* 4.提交 */
commit;
/* 5.查詢語句 */
/*
select * from t_user;
select * from t_reply;
*/
3、查詢語句的結構
select [列名] [*] from 表名 [where 條件] [group by 分組條件] [having 過濾] [order by 排序]
4、偽表dual
dual : oracle中的虛表 ,偽表, 主要是用來補齊語法結構,
比如:select 1+1 from dual;
注意:直接寫一個常量比寫 * 要高效
select count(1) from emp;
select count(*) from emp;
5、別名查詢
使用as 關鍵字, 可以省略,別名中不能有特殊字元或者關鍵字, 如果有就加雙引號(比如空格)
elect ename 姓名, sal 工資 from emp;
select ename "姓 名", sal 工資 from emp;
6、去除重複資料 distinct
加在select和列名後面,多列去除重複: 每一列都一樣才能夠算作是重複
--單列去除重複
select distinct job from emp;
--多列去除重複的
select distinct job,deptno from emp;
7、查詢中四則運算
需要用到偽表dual
select 1+1 from dual;
--查詢員工年薪 = 月薪* 12
select sal*12 from emp;
在Oracle 中 ,雙引號主要是別名的時候使用, 單引號是使用的值, 是字元
8、空值處理函式
注意: null值 , 代表不確定的 不可預知的內容 , 不可以做四則運算
1)mysql的空值處理
ifnull(引數1, 引數2):
判斷引數1是否為null,
不為null, 則函式的結果取引數1的值
為null, 則取引數2的值
if(引數1, 引數2, 引數3)
判斷引數1是否為null,
為null, 則取引數3的值
不為null, 則取引數2的值
注意if函式只能處理數值欄位的空值
SELECT e.`ename` 姓名,
e.`sal` 底薪,
e.`comm` 獎金,
(e.`sal`+e.`comm`) 實發,
IFNULL(e.`sal`+e.`comm`, e.`sal`) 實發1,
IF(e.`comm`, e.`sal`+e.`comm`, e.`sal`) 實發2
FROM emp e;
2)oracle的空值處理
nvl(引數1,引數2):如果1為null,則返回2,不為null就為1
nvl2(引數1, 引數2, 引數3)1為null,則返回,3,不為null,則返回2
decode(需要判斷的欄位,
常量值1, 結果值1,
常量值2, 結果值2,
…
常量值n, 結果值n,
預設結果值
)
select e.ename 姓名,
e.sal 底薪,
e.comm 獎金,
nvl(e.sal+e.comm, e.sal) 實發1,
nvl2(e.comm, e.sal+e.comm, e.sal) 實發2,
decode(e.comm, null, e.sal, e.sal+e.comm) 實發3
from emp e;
9、字串拼接
- Oracle 特有的連線符: || 拼接
- concat(str1,str2) 函式, 在mysql和Oracle中都有
--查詢員工姓名 : 姓名:SCOTT
select ename from emp;
--使用拼接符
select '姓名:' || ename from emp;
--使用函式拼接
select concat('姓名:',ename) from emp;
六、條件查詢
條件查詢就是where後面的寫法
1、關係運算符和排序
> >= = < <= != <>
注意:不等於既可以用!=也可以用<>但是<>效率更高
2、邏輯運算子
and or not
3、其它運算子
like 模糊查詢
in(set) 在某個集合內
between..and.. 在某個區間內
is null 判斷為空
is not null 判斷不為空
4、模糊查詢: like
% 匹配多個字元
_ 匹配單個字元
如果有特殊字元, 需要使用escape轉義
--查詢員工姓名中,包含%的員工資訊
select * from emp where ename like '%\%%' escape '\';
select * from emp where ename like '%#%%' escape '#';
5、排序order by
升序: asc ascend
降序: desc descend
排序注意null問題 : nulls first | last指定null值顯示的位置
同時排列多列, 用逗號隔開
--查詢員工資訊,按照獎金由高到低排序
select * from emp order by comm desc nulls last;
--查詢部門編號和按照工資 按照部門升序排序, 工資降序排序
select deptno, sal from emp order by deptno asc, sal desc;
分析函式:用來處理排名並列問題
rank——排名可並列,之後序號不會順眼(如2個第二,下一個是第三名)
dense_rank——排名可並列,之後序號會順眼(如2個第二,下一個是第四名)
row_number——不可並列排名
over——新增分組條件
partition—by——分組
6、分組排序
- select 分組的條件,分組之後的條件 from 表名 group by 分組的條件 having 條件過濾
- 在分組查詢語句的檢索內容中, 只能出現分組欄位和聚合函式
sql的編寫順序:
select,from,where,group by,having,order by
sql的執行順序:
from,where,group by,having,select,order by…
-
where和having的區別:
where後面不能跟聚合函式,可以接單行函式
having是在group by之後執行,可以接聚合函式--分組統計所有部門的平均工資,找出平均工資大於1500的部門 select deptno,avg(sal) from emp group by deptno having avg(sal)>1500; --報錯,給分組之後的條件取別名的時候出錯,因為sql語句執行的順序問題 select deptno,avg(sal),bb from emp group by deptno having bb>1500;
七、函式
函式: 必須要有返回值
1、單行函式
對某一行中的某個值進行處理
1)數值函式
-
取整
select ceil(45.926) from dual; --46 向上取整 select floor(45.926) from dual; --45 向下取整
-
四捨五入
round(a,b)
b如果是正數代表取到小數點後b位數為止
b如果是負數代表取到十位為止
elect round(45.926,2) from dual; --45.93 select round(45.926,1) from dual; -- 45.9 select round(45.926,0) from dual; --46 select round(45.926,-1) from dual; --50 select round(45.926,-2) from dual; --0 select round(65.926,-2) from dual; --100
-
截斷(去尾法)
select trunc(45.926,2) from dual; --45.92 select trunc(45.926,1) from dual; -- 45.9 select trunc(45.926,0) from dual; --45 select trunc(45.926,-1) from dual; --40 select trunc(45.926,-2) from dual; --0 select trunc(65.926,-2) from dual; --0
-
求餘
select mod(9,3) from dual; --0 select mod(9,4) from dual; --1
2)字元函式
substr(str1,起始索引,長度)
--注意: 起始索引不管寫 0 還是 1 都是從第一個字元開始擷取
select substr('abcdefg',0,3) from dual; --abc
select substr('abcdefg',1,3) from dual; --abc
select substr('abcdefg',2,3) from dual; --bcd
--獲取字串長度 24 28
select length('abcdefg') from dual;
--去除字元左右兩邊的空格
select trim(' hello ') from dual;
--替換字串
Select replace('hello','l','a') from dual;
3) 日期函式
-查詢今天的日期(查詢的是伺服器上的日期)
select sysdate from dual;
--查詢3個月後的今天的日期
select add_months(sysdate,3) from dual;
--查詢3天后的日期
select sysdate + 3 from dual;
--查詢員工入職的天數
select sysdate - hiredate from emp;
select ceil(sysdate - hiredate) from emp;
--查詢員工入職的週數
select (sysdate - hiredate)/7 from emp;
--查詢員工入職的月數
select months_between(sysdate,hiredate) from emp;
--查詢員工入職的年份
select months_between(sysdate,hiredate)/12 from emp;
4) 轉換函式
數值轉字元
select to_char(sal,'$9,999.99') from emp;
select to_char(sal,'L9,999.99') from emp;
/*
to_char(1210.73, '9999.9') 返回 '1210.7'
to_char(1210.73, '9,999.99') 返回 '1,210.73'
to_char(1210.73, '$9,999.00') 返回 '$1,210.73'
to_char(21, '000099') 返回 '000021'
to_char(852,'xxxx') 返回' 354'
*/
日期轉字元 to_char() (不區分大小寫)
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
select to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') from dual; --預設的是24小時制度
--只想要年
select to_char(sysdate,'yyyy') from dual; --2017
--只想要日
select to_char(sysdate,'d') from dual; --2 代表一個星期中第幾天(美國周天是一個星期的第一天)
select to_char(sysdate,'dd') from dual; --10 代表一個月中的第幾天
select to_char(sysdate,'ddd') from dual; --100 代表一年中的第幾天
select to_char(sysdate,'day') from dual; --monday(星期的英文)
select to_char(sysdate,'dy') from dual; --mon 星期的簡寫
字元轉日期
select to_date('2017-04-10','yyyy-mm-dd') from dual;
--查詢1981年 -- 1985年入職的員工資訊
select * from emp where hiredate between to_date('1981','yyyy') and to_date('1985','yyyy');
5) 通用函式
nvl(引數1,引數2) 如果引數1 = null 就返回引數2
nvl2(引數1,引數2,引數3) 如果引數1 = null ,就返回引數3, 否則返回引數2
nullif(引數1,引數2) 如果引數1 = 引數2 那麼就返回 null , 否則返回引數1
coalesce: 返回第一個不為null的值
select nvl2(null,5,6) from dual; --6;
select nvl2(1,5,6) from dual; --5;
select nullif(5,6) from dual; --5
select nullif(6,6) from dual; --null
select coalesce(null,null,3,5,6) from dual; --3
2、多行函式(聚合函式)
對某一列的所有行進行處理
max() min count sum avg
注意:直接忽略空值
例子:
--統計員工的平均獎金 550 錯誤 2200/14 =,因為空值產生的影響
select avg(comm) from emp;
--統計員工的平均獎金 157.
select sum(comm)/count(1) from emp;
select ceil(sum(comm)/count(1)) from emp;
3、條件表示式
作用:查詢的時候用來替換列中所有資料的值,區別於取別名,取別名只是單純的給子彈取別名
/*
條件表示式:
case 欄位
when 值1 then 值
when 值2 then 值
else
預設值
end "別名"
case、when通用的寫法,mysql和oracle中都可以用
oracle特有的寫法:decode(欄位,if1,then1,if2,then2,else1)
*/
--給表中姓名取一箇中文名
select
case ename
when 'SMITH' then '劉備小二'
when 'ALLEN' then '薩達'
else
'路人甲'
end "中文名"
from emp;
--oracle 特有寫法
select decode(ename,'SMITH','劉備小二','ALLEN','薩達','路人甲') from emp;
八、多表查詢
1、笛卡爾積
實際上是兩張表的乘積,但是在實際開發中沒有太大意義,格式: select * from 表1,表2
select * from emp;
select * from dept;
select * from emp, dept;
select * from emp e1, dept d1 where e1.deptno = d1.deptno;
2、內連線
隱式內聯接:
等值內聯接: where e1.deptno = d1.deptno;
不等值內聯接: where e1.deptno <> d1.deptno;
自聯接: 自己連線自己
顯式內聯接:
select * from 表1 inner join 表2 on 連線條件
inner 關鍵字可以省略
--查詢員工編號,員工姓名,經理的編號,經理的姓名
select e1.empno,e1.ename,e1.mgr,m1.ename
from emp e1, emp m1 where e1.mgr= m1.empno;
--查詢員工編號,員工姓名,員工的部門名稱,經理的編號,經理的姓名
select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename
from emp e1, emp m1,dept d1 where e1.mgr= m1.empno and e1.deptno = d1.deptno;
--查詢員工編號,員工姓名,員工的部門名稱,經理的編號,經理的姓名,經理的部門名稱
select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename,d2.dname
from emp e1, emp m1,dept d1,dept d2
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
;
--查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname
from emp e1, emp m1,dept d1,dept d2,salgrade s1
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
;
--查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱,經理的工資等級
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname,s2.grade
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and m1.sal between s2.losal and s2.hisal
;
--查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱,經理的工資等級
--將工資等級 1,2,3,4 顯示成 中文的 一級 二級 三級...
select e1.empno,
e1.ename,
d1.dname,
case s1.grade
when 1 then '一級'--為所有列更換成你想要的資訊
when 2 then '二級'
when 3 then '三級'
when 4 then '四級'
else
'五級'
end "等級",--取別名
e1.mgr,
m1.ename,
d2.dname,
decode(s2.grade,1,'一級',2,'二級',3,'三級',4,'四級','五級') "等級"
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2
where
e1.mgr= m1.empno
and e1.deptno = d1.deptno
and m1.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and m1.sal between s2.losal and s2.hisal
;
--查詢員工姓名和員工部門所處的位置
select e1.ename,d1.loc from emp e1,dept d1 where e1.deptno = d1.deptno;
select * from emp e1 inner
相關推薦
Oracle資料庫深入學習
一、Oracle概念
oracle資料可系統是美國oracle(甲骨文)公司提供的以分散式資料庫為核心的一組軟體產品,是目前最流行的客戶/伺服器或B/S體系結構的資料庫之一,oracle資料庫時目前世界上使用最為廣泛的資料庫管理系統,作為一個通用的資料庫系統,它具有完善的資料庫管理功
oracle資料庫逐步學習總結【基礎二】
原創作品,轉載請在文字開頭明顯位置註明出處:https://www.cnblogs.com/sunshine5683/p/10067872.html
接著上一篇,繼續總結!
五、oracle表管理
首先,在開頭說一下sys使用者和system使用者的區別:sys使用者是超
Oracle資料庫基礎學習_01
–建立表空間
create tablespace itheima;
DATAFILE ‘heima.dbf’
size 100m
autoextend on
next 10m;
–刪除表空間
drop tablespace itheima;
–建立使用者
cre
Oracle資料庫基礎學習DAY3
1、連線用一個連線來從多個表中獲取資料。select table.column,table2.columnfrom table1,table2where table1.column1=table2.column2;在where子句中書寫連線的條件。如果某個列的名字在多個表中出
Oracle資料庫基礎學習DAY1
1.資料字典(data dictionary)是資料庫中所有物件及其關係的資訊集合。·系統空間資訊·資料庫中物件資訊·效能以及統計資訊·Oracle使用者資訊·使用者訪問、操作資訊·使用者角色等許可權資訊·列的相關資訊2.資料檔案包括了全部資料庫資料·一個數據庫可以有多個數據
oracle資料庫加密學習總結
作者: ldd600
安全就好比在寒冷的冬天裡,您穿上好幾件衣服或穿最龐大的冬天使用的夾克禦寒。 但是,構建各防禦層可能阻止不了最堅決的惡意入侵者,當然這也不會總能夠防禦合法使用者盜竊公司財產。 這裡的組最後一道防線是加密,通過加密,使用者(或者惡意入侵者)只有使用密碼才
Oracle資料庫個人學習筆記
Oracle資料庫知識講解
第一章:使用者和表空間
1:登入部分
開啟SQL PLUS(Oracle資料庫裡不分大小寫)
Sys(許可權要高於SYSTEM)和system兩個使用者名稱,密碼預設是不顯示的
當登入SYSTEM使用者名稱時。我設定的密碼是Wuyi148267
mysql資料庫深入學習
mysql 資料庫
一、資料庫介紹
1、關係型資料庫的特點
二維表
典型產品Oracle傳統企業,MySQL是網際網路企業
資料存取是通過SQL
最大特點,資料安全性方面強(ACID)
2、NoSQL:非關係型資料庫(Not only SQL)
不是否定關係型資料庫,做關係型資料庫的的補充。
3、we
oracle資料庫學習02
簡單查詢的使用、SQL的基本語法
select * from emp;
在取得全部資料之後,可以發現某些列上會顯示 null 的資訊,那麼所謂的 null 表示 沒有內容。 null != 0,表示暫時位置的內容。
簡單查詢語句語法
SELECT [DISTINCT] *
學習致用——使用PL/SQL提取Oracle資料庫上下文資訊(使用者環境) (Extraction of Oracle context/User environment)
學了這麼久PL/SQL,是時候用一用了。
第一個任務:批量輸出Oracle資料庫上下文資訊(使用者環境)
程式碼:
DECLARE
TERMINAL VARCHAR2 (50);
LANGUAG VARCHAR2 (5
Oracle資料庫學習(一)安裝和簡單使用
新公司的新專案,需要用到Oracle資料庫,所以現在便來解除此資料庫,不得不說,這個資料庫還這是麻煩。
安裝倒是簡單,就是中間會遇到各種問題。
安裝步驟參考:https://blog.csdn.net/fancheng614/article/details/78172894
安裝完成後,中間不要有太大的
oracle資料庫學習07
檢視
檢視其實就是一個或幾個實體表匯出的表,它本身不包含任何真實資料的虛擬表。資料庫中只存放檢視的定義,而不存放檢視對應的資料。(我的理解:檢視就是需要的時候把它從資料庫中調出來的一個視窗,可以觀察資料的變化,有點像大資料)
優點:
簡化使用者操作;
構建邏輯性;
oracle資料庫學習,參考學生就業資訊共享平臺(job_student_system)
學生就業資訊共享平臺mysql資料庫建立語句
學生就業資訊共享平臺oracle資料庫建立語句
學生就業資訊共享平臺sqlserver資料庫建立語句
學生就業資訊共享平臺spring+springMVC+hibernate框架物件(javaBean,pojo)設計
資料庫的深入學習
首先輸入以下程式碼,創建出幾個表,方便使用
## 學生表
CREATE TABLE student(
stuid VARCHAR(10) PRIMARY KEY,
stuname VARCHAR(50)
);
## 分數表
CREATE TABLE sco
Oracle資料庫學習心得(二)
20、單行函式:每次執行函式,傳入一行列值,返回一個結果;多行函式:每次執行函式,傳入多行列值,返回一個結果
21、字元型函式:
(1)大小寫轉換:lower(小寫)、upper(大寫)、initcap(首字母大寫)
(2)拼接字串:concat,例 selec
oracle資料庫基礎知識學習筆記
一、SQL語言分類:
1.DDL(資料定義語言): create(建立) alter(修改) drop(刪除)------------主要是對錶操作。
2.DML(資料操作語言): insert(插入) delete(刪除) update(更新)
oracle 資料庫學習筆記
oracle 資料庫學習筆記
Giser-Yu
1、匯入命令
imp Test/[email protected] file='D:\bdcdata\Test.DMP' log='D:\bdcdata\Test_in.log' full=y;
引數tables=
Oracle資料庫學習第二天
Oracle資料庫學習第二天
目錄:
子查詢:
為什麼要有子查詢
子查詢的本質
子查詢型別
子查詢使用注意事項
子查詢與多表查詢效率問題
子查詢放置的位置
單行子查詢
多行子查詢
子查詢遇見空值問題
Oracle資料庫學習第二天對應練習題
Oracle資料庫學習第二天對應練習題
1、查詢和Zlotkey相同部門的員工姓名和僱用日期
Select ename,hire_date
from emp
where deptno=(
select deptno
from emp
where ena
Oracle資料庫學習第一天對應練習題
Oracle資料庫學習第一天對應練習題
1、查詢工資大於12000的員工姓名和工資
SELECT ENAME ,SAL FROM EMP WHERE SAL>12000;
2、查詢員工號為176的員工的姓名和部門號
SELECT LAST_NAME,D